Main Content

不含和含雅可比矩阵的非线性最小二乘

此示例说明如何以两种方式求解非线性最小二乘问题。该示例首先求解不含雅可比矩阵的问题。然后,它说明如何包含雅可比矩阵,并展示由此带来的效率提升。

该问题包含 10 项,具有两个未知数:求一个二维向量 x,以最小化

k=110(2+2k-ekx1-ekx2)2,

初始点为 x0 = [0.3,0.4]

由于 lsqnonlin 假设平方和未在用户函数中显式得出,因此传递给 lsqnonlin 的函数必须计算向量值函数

Fk(x)=2+2k-ekx1-ekx2,

其中 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.

检查解和函数计算次数。

disp(x)
    0.2578    0.2578
disp(resnorm)
  124.3622
disp(output.funcCount)
    72

求解包含雅可比矩阵的问题

目标函数很简单,您可以计算其雅可比矩阵。根据向量函数的雅可比矩阵中的定义,雅可比函数表示以下矩阵

Jkj(x)=Fk(x)xj.

此处,Fk(x) 是目标函数的第 k 个分量。此示例有

Fk(x)=2+2k-ekx1-ekx2,

因此

Jk1(x)=-kekx1Jk2(x)=-kekx2.

此示例末尾定义的辅助函数 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.

解与前面的解相同。

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

相关主题