这个例子展示了如何用两种方法解决非线性最小二乘问题。这个例子首先解决了这个问题,而没有使用雅可比函数。然后说明了如何包含雅可比矩阵,并说明了结果的改进效率。
这个问题有10项,有两个未知数:findx,一个二维的向量,它最小化
从点开始x0 = [0.3, 0.4]
.
因为lsqnonlin
假设平方和不是在用户函数中明确形成的,函数传递给lsqnonlin
必须计算向量值函数
为k= 1到10(即,F必须有10个组件)。
辅助函数myfun
定义这个例子到此结束实现无导数信息的向量值目标函数。从这一点开始求解最小值x0
.
x0 = [0.3, 0.4];%开始猜[x, resnorm res, eflag,输出]= lsqnonlin (x0 @myfun);%调用优化器
局部最小值。Lsqnonlin停止,因为当前步长小于步长公差的值。
检查解决方案和函数计算的次数。
disp (x)
0.2578 - 0.2578
disp (resnorm)
124.3622
disp (output.funcCount)
72
目标函数很简单,你可以计算它的雅可比矩阵。按照向量函数的雅可比矩阵,用雅可比函数表示矩阵
在这里, 是k目标函数的第一个分量。这个例子
所以
辅助函数myfun2
定义这个例子到此结束用雅可比矩阵实现目标函数。设置选项,使求解器使用雅可比矩阵。
选择= optimoptions (@lsqnonlin,“SpecifyObjectiveGradient”,真正的);
运行的能手。
磅= [];%是没有界限的乌兰巴托= [];(x2, resnorm2,它、eflag2 output2] = lsqnonlin (x0, @myfun2磅,乌兰巴托,选择);
局部最小值。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));结束结束