不含雅可比矩阵的非线性最小二乘
这个例子展示了如何用两种方法求解非线性最小二乘问题。这个例子首先解决了这个问题,没有使用雅可比函数。然后展示了如何包含雅可比矩阵,并说明了由此提高的效率。
这个问题有10个项,两个未知数:找到x,一个二维向量,它最小化
从这一点开始X0 = [0.3,0.4]
.
因为lsqnonlin
假设平方和在用户函数中没有显式地形成,传递给该函数lsqnonlin
必须计算向量值函数吗
为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
解决包含雅可比矩阵的问题
目标函数很简单,你可以计算它的雅可比矩阵。按照向量函数的雅可比矩阵,雅可比函数表示矩阵
在这里, 是k目标函数的第Th分量。这个例子有
所以
辅助函数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
辅助函数
此代码创建myfun
helper函数。
函数F = myfun(x) k = 1:10;F = 2 + 2*k-exp(k*x(1))-exp(k*x(2));结束
此代码创建myfun2
helper函数。
函数[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));结束结束