matlab optimoptions在变量

时间:2017-05-30 07:42:43

标签: matlab mathematical-optimization

我正在使用optimoptions函数,我希望在每次迭代后保存变量中的残差。现在,如果我选择在下面代码的第一行显示迭代,我可以在控制台中看到它们,但是还是将它们保存为向量变量吗?我试图在第二行中获得剩余输出,但它只给出了最后一次迭代的结果。谢谢。

options = optimoptions(@lsqnonlin,'Algorithm','Levenberg-Marquardt','Display','iter','StepTolerance',1e-4);
[params,resnorm,residual_opt,exitflag,output,lambda,jacobian] = lsqnonlin(@minDistance,params0,[],[],options);
angles = params(1:3);
R = euler2mat(angles);
T = params(4:6);
end

这里是迭代的显示。我只想使用第三个colomn。

                                        First-Order                    Norm of 
 Iteration  Func-count    Residual       optimality      Lambda           step
     0           7      5.4943e+09        3.84e+10         0.01
     1          14     7.39183e+08        8.74e+09        0.001        6.32624
     2          21     4.56928e+07         1.1e+09       0.0001        2.59042
     3          28     2.41748e+06        1.21e+08        1e-05        2.61414
     4          35          135873        1.39e+07        1e-06        1.45824
     5          42         8031.22        1.65e+06        1e-07       0.743095
     6          49         487.971           2e+05        1e-08       0.372708
     7          56         30.0687        2.47e+04        1e-09       0.186396
     8          63         1.86599        3.07e+03        1e-10      0.0931815
     9          70        0.116209             382        1e-11      0.0465832
    10          77      0.00724993            47.7        1e-12      0.0232892
    11          84     0.000452687            5.96        1e-13       0.011644
    12          91     2.82764e-05           0.744        1e-14     0.00582186

2 个答案:

答案 0 :(得分:1)

我没有可用于测试的优化工具箱,但您应该能够通过定义每次迭代调用的output function来获取每次迭代中的残差。

在优化选项中,您将功能句柄添加为'OutputFctn', @myOutputFunction。在该函数中,您可以访问剩余值(以及其他内容),并绘制值或将它们保存到文件中。

function stop = myOutputFunction(x,optimValues,state)

% Do not use the user defined function to determine when to stop
stop = false;

% The following should be the value you are looking for in the 
% current iteration.
currentResidual = optimValues.residual;

end

答案 1 :(得分:1)

如果不修改函数代码,则无法直接获取所有残差。

但是,如果要绘制所有迭代的残差,可以通过添加选项' PlotFcn'来实现。价值' @ optimplotfval'。有关详细信息,请参阅pre set data event。您甚至可以根据现有的绘图功能制作自己的绘图功能。

- 提示 -

要构建自定义绘图,请从其中一个开始,例如optimplotfval。您可以将代码粘贴到新文件中并重命名该函数。删除无用的命令,例如修改标题。从varargin中获取一个额外参数作为您想要使用的轴的句柄,并在所有绘图函数中使用它。

要使用此自定义绘图,请在自定义绘图上设置闭包:

'PlotFcn', @(x,optimValues,state)mycustomplot(x,optimValues,state, hMyAxis)