主要内容

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

这个例子展示了如何用两种方法求解非线性最小二乘问题。这个例子首先解决了这个问题,没有使用雅可比函数。然后展示了如何包含雅可比矩阵,并说明了由此提高的效率。

这个问题有10个项,两个未知数:找到x,一个二维向量,它最小化

k 1 1 0 2 + 2 k - e k x 1 - e k x 2 2

从这一点开始X0 = [0.3,0.4]

因为lsqnonlin假设平方和在用户函数中没有显式地形成,传递给该函数lsqnonlin必须计算向量值函数吗

F k x 2 + 2 k - e k x 1 - e k x 2

k= 1 ~ 10(即:F必须有10个组件)。

解决没有雅可比矩阵的问题

辅助函数myfun定义在本例结束实现无导数信息的向量值目标函数。从这个点开始求解最小值x0

X0 = [0.3,0.4];%开始猜测[x,resnorm,res,eflag,output] = lsqnonlin(@myfun,x0);调用优化器
局部最小值。Lsqnonlin停止,因为当前步骤的大小小于步长公差的值。

检查解和函数计算的数量。

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

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

目标函数很简单,你可以计算它的雅可比矩阵。按照向量函数的雅可比矩阵,雅可比函数表示矩阵

J k j x F k x x j

在这里, F k x k目标函数的第Th分量。这个例子有

F k x 2 + 2 k - e k x 1 - e k x 2

所以

J k 1 x - k e k x 1 J k 2 x - k e k x 2

辅助函数myfun2定义在本例结束用雅可比矩阵实现目标函数。设置选项,使解算器使用雅可比矩阵。

Opts = optimoptions(@lsqnonlin,“SpecifyObjectiveGradient”,真正的);

运行求解器。

Lb = [];%无边界Ub = [];[x2,resnorm2,res2,eflag2,output2] = lsqnonlin(@myfun2,x0,lb,ub,opts);
局部最小值。Lsqnonlin停止,因为当前步骤的大小小于步长公差的值。

解与上一个解相同。

disp (x2)
0.2578 - 0.2578
disp (resnorm2)
124.3622

使用雅可比矩阵的优点是求解器需要更少的函数求值。

disp (output2.funcCount)
24

辅助函数

此代码创建myfunhelper函数。

函数F = myfun(x) k = 1:10;F = 2 + 2*k-exp(k*x(1))-exp(k*x(2));结束

此代码创建myfun2helper函数。

函数[F,J] = myfun2(x) k = 1:10;F = 2 + 2*k-exp(k*x(1))-exp(k*x(2));如果nargout > 1 J = 0 (10,2);J(k,1) = -k.*exp(k*x(1));J(k,2) = -k.*exp(k*x(2));结束结束

相关的话题