使用 lsqnonlin 绘制所有迭代期间的函数值演变
Plotting the function value evolution during all iterations using lsqnonlin
我正在使用 lsqnonlin
作为我的优化程序。我需要在每次迭代时绘制成本函数,同时显示所有先前的值。所以我想显示类似 this:
的内容
但是,使用 lsqnonlin
,我只能在当前迭代中绘制成本函数的值。使用这些选项:
options = optimset('TolFun', 1e-5, 'TolX',1e-5, 'MaxFunEvals', 10000, 'PlotFcns', @optimplotfval,'Display','iter')
有没有办法设置 lsqnonlin
的选项,使我得到类似于上图所示的内容?
如果您查看 optimplotfval.m
的程序(在 MATLAB 的终端中输入 edit optimplotfval.m
,您将看到以下注释:
% STOP = OPTIMPLOTFVAL(X,OPTIMVALUES,STATE) plots OPTIMVALUES.fval. If
% the function value is not scalar, a bar plot of the elements at the
% current iteration is displayed. If the OPTIMVALUES.fval field does not
% exist, the OPTIMVALUES.residual field is used.
因此,例如,在 fminsearch
中,您将获得 objective/cost 函数值与迭代计数的关系图,但在 lsqnonlin
的情况下,您似乎得到的是条形图给定迭代的残差值。
解决方法是根据 optimplotfval.m
创建您自己的绘图函数。将 optimplotfval.m
复制粘贴到另一个文件中,例如my_opt_plot.m
然后在程序的初始部分更改残差选项:
stop = false;
switch state
case 'iter'
if isfield(optimValues,'fval')
if isscalar(optimValues.fval)
plotscalar(optimValues.iteration,optimValues.fval);
else
plotvector(optimValues.iteration,optimValues.fval);
end
else
% Plot the squared norm of residuals as a function of iteration number instead of bar plot of residual values at current iteration
fval = norm(optimValues.residual)^2;
% Call the scalar function instead
plotscalar(optimValues.iteration,fval);
end
您可以像调用 optimplotfval.m
一样调用这个新函数:
options = optimoptions('lsqnonlin','Display','iter','PlotFcns',@my_opt_plot);
[x,resnorm,residual,exitflag,output] = lsqnonlin(@simple_fun,xc0,[],[],options);
simple_fun 在我的案例中是基于 MATLAB 文档条目中的一个示例 lsqnonlin
:
function f = simple_fun(xc)
x = [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];
y = [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];
f = xc(1)*exp(xc(2)*x)-y;
end
如果将绘制的 objective 函数值与屏幕上打印的值进行比较,它们确实匹配。
我正在使用 lsqnonlin
作为我的优化程序。我需要在每次迭代时绘制成本函数,同时显示所有先前的值。所以我想显示类似 this:
但是,使用 lsqnonlin
,我只能在当前迭代中绘制成本函数的值。使用这些选项:
options = optimset('TolFun', 1e-5, 'TolX',1e-5, 'MaxFunEvals', 10000, 'PlotFcns', @optimplotfval,'Display','iter')
有没有办法设置 lsqnonlin
的选项,使我得到类似于上图所示的内容?
如果您查看 optimplotfval.m
的程序(在 MATLAB 的终端中输入 edit optimplotfval.m
,您将看到以下注释:
% STOP = OPTIMPLOTFVAL(X,OPTIMVALUES,STATE) plots OPTIMVALUES.fval. If
% the function value is not scalar, a bar plot of the elements at the
% current iteration is displayed. If the OPTIMVALUES.fval field does not
% exist, the OPTIMVALUES.residual field is used.
因此,例如,在 fminsearch
中,您将获得 objective/cost 函数值与迭代计数的关系图,但在 lsqnonlin
的情况下,您似乎得到的是条形图给定迭代的残差值。
解决方法是根据 optimplotfval.m
创建您自己的绘图函数。将 optimplotfval.m
复制粘贴到另一个文件中,例如my_opt_plot.m
然后在程序的初始部分更改残差选项:
stop = false;
switch state
case 'iter'
if isfield(optimValues,'fval')
if isscalar(optimValues.fval)
plotscalar(optimValues.iteration,optimValues.fval);
else
plotvector(optimValues.iteration,optimValues.fval);
end
else
% Plot the squared norm of residuals as a function of iteration number instead of bar plot of residual values at current iteration
fval = norm(optimValues.residual)^2;
% Call the scalar function instead
plotscalar(optimValues.iteration,fval);
end
您可以像调用 optimplotfval.m
一样调用这个新函数:
options = optimoptions('lsqnonlin','Display','iter','PlotFcns',@my_opt_plot);
[x,resnorm,residual,exitflag,output] = lsqnonlin(@simple_fun,xc0,[],[],options);
simple_fun 在我的案例中是基于 MATLAB 文档条目中的一个示例 lsqnonlin
:
function f = simple_fun(xc)
x = [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];
y = [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];
f = xc(1)*exp(xc(2)*x)-y;
end
如果将绘制的 objective 函数值与屏幕上打印的值进行比较,它们确实匹配。