我正试图在MATLAB中优化一个有for
-循环的函数。我尝试了不同的代码,但没有得到任何结果,也不知道问题出在哪里。
这是功能:
function U2 = least1(ydata,xdata,x,y1,w,A,sz,yprime,y)
for i=1:1:1000
U2(1,i) = sum((sqrt(1+yprime.^2)).*(A(1) * exp(-y/A(2))*(1 - exp(-ydata(i)/A(2)))...
+ A(3) * exp(-y/A(4))*(exp(-ydata(i)/A(4))-1)).*w);
end
end
所有的变量都是可用的,我只需要对其进行优化,就可以得到A
的完美匹配。我试图通过基于问题的优化来解决它,代码如下:但不是A
的四个值,我得到-Inf-Inf-Inf-Inf
A = optimvar('A',4);
potential = fcn2optimexpr(@least1,A);
obj = sum((potential - u1).^2);
prob = optimproblem('Objective',obj);
x0.A = [11.959,0.069,3.53,4.118*10^(-3)];
show(prob)
sol = solve(prob,x0)
如果丢失了什么,请告诉我
优化器现在不知道如何处理least1(ydata,xdata,x,y1,w,A,sz,yprime,y)
的其他输入。
当你将其分配为成本函数时,你需要告诉它值,即
@(A) least1(ydata,xdata,x,y1,w,A,sz,yprime,y)
关键字是匿名函数句柄(您所拥有的只是函数句柄。
我对你设置优化问题的方式很恼火(也许这是一种新的方式?(。
我会直接这样做:
% anonymous function handle to original function
fnc_ogl = @(A) least1(ydata,xdata,x,y1,w,A,sz,yprime,y) -u1;
% create least-squares cost function (you need to have a single cost value
% for fminsearch)
fnc_cst = @(A) sum( fnc_ogl.^2 );
% initial guess
A0 = [11.959,0.069,3.53,4.118*10^(-3)]
% call unconstrained local optimization
[A_opt, fval, exitflag] = fminsearch(fnc,A0)
BTW
- 您应该预先用
U2 = NaN(1,1000)
分配U2
的大小,以加快成本函数 - 您的示例不起作用,因为
least1
的所有输入都丢失了 least1
不使用变量xdata
、x
、y1
和sz
。