主要内容

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

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

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

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,输出]= lsqnonlin (x0 @myfun);%调用优化器
局部最小值。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目标函数的第一个分量。这个例子

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定义这个例子到此结束用雅可比矩阵实现目标函数。设置选项,使求解器使用雅可比矩阵。

选择= 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

辅助函数

此代码创建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));结束结束

相关的话题