我正在使用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
答案 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)