不含和含雅可比矩阵的非线性最小二乘
此示例说明如何以两种方式求解非线性最小二乘问题。该示例首先求解不含雅可比矩阵的问题。然后,它说明如何包含雅可比矩阵,并展示由此带来的效率提升。
该问题包含 10 项,具有两个未知数:求一个二维向量 x,以最小化
初始点为 x0 = [0.3,0.4]
。
由于 lsqnonlin
假设平方和未在用户函数中显式得出,因此传递给 lsqnonlin
的函数必须计算向量值函数
其中 k = 1 到 10(即 F 必须有 10 个分量)。
求解不含雅可比矩阵的问题
此示例末尾定义的 myfun
辅助函数实现无导数信息的向量值目标函数。从点 x0
开始求解最小化问题。
x0 = [0.3,0.4]; % Starting guess [x,resnorm,res,eflag,output] = lsqnonlin(@myfun,x0); % Invoke optimizer
Local minimum possible. lsqnonlin stopped because the size of the current step is less than the value of the step size tolerance. <stopping criteria details>
检查解和函数计算次数。
disp(x)
0.2578 0.2578
disp(resnorm)
124.3622
disp(output.funcCount)
72
求解包含雅可比矩阵的问题
目标函数很简单,您可以计算其雅可比矩阵。根据向量函数的雅可比矩阵中的定义,雅可比函数表示以下矩阵
此处, 是目标函数的第 k 个分量。此示例有
因此
此示例末尾定义的辅助函数 myfun2
使用雅可比矩阵实现目标函数。设置选项,使求解器使用雅可比矩阵。
opts = optimoptions(@lsqnonlin,'SpecifyObjectiveGradient',true);
运行求解器。
lb = []; % No bounds
ub = [];
[x2,resnorm2,res2,eflag2,output2] = lsqnonlin(@myfun2,x0,lb,ub,opts);
Local minimum possible. lsqnonlin stopped because the size of the current step is less than the value of the step size tolerance. <stopping criteria details>
解与前面的解相同。
disp(x2)
0.2578 0.2578
disp(resnorm2)
124.3622
使用雅可比矩阵的优点是求解器执行的函数计算次数要少得多。
disp(output2.funcCount)
24
辅助函数
以下代码会创建 myfun
辅助函数。
function F = myfun(x) k = 1:10; F = 2 + 2*k-exp(k*x(1))-exp(k*x(2)); end
以下代码会创建 myfun2
辅助函数。
function [F,J] = myfun2(x) k = 1:10; F = 2 + 2*k-exp(k*x(1))-exp(k*x(2)); if nargout > 1 J = zeros(10,2); J(k,1) = -k.*exp(k*x(1)); J(k,2) = -k.*exp(k*x(2)); end end