主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

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

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

该问题包含 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.

<stopping criteria details>

检查解和函数计算次数。

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.

<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

另请参阅

主题