非线性最小二乘不带有雅各布
此示例显示了如何通过两种方式解决非线性最小二乘问题。该示例首先在不使用Jacobian函数的情况下解决了问题。然后它显示了如何包括雅各布式,并说明了结果的提高效率。
该问题有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(重新找出)
124.3622
disp(output.funccount)
72
解决包括雅各比亚在内的问题
目标函数足够简单,您可以计算其Jacobian。遵循定义矢量功能的雅各布人,雅各布函数代表矩阵
这里, 是个k目标函数的三个组成部分。这个示例有
所以
辅助功能myfun2
定义在示例的结尾用Jacobian实现目标函数。设置选项,因此求解器使用Jacobian。
opts = optimoptions(@lsqnonlin,“指定目标gradient”,真的);
运行求解器。
lb = [];%无界限ub = [];[x2,resnorm2,res2,eflag2,output2] = lsqnonlin(@myfun2,x0,lb,ub,opts);
当地的最低限度。LSQNONLIN停止了,因为当前步骤的大小小于步长公差的值。
该解决方案与先前的解决方案相同。
disp(x2)
0.2578 0.2578
disp(resnorm2)
124.3622
使用Jacobian的优点是,求解器的功能评估较少。
disp(output2.funccount)
24
助手功能
此代码创建myfun
助手功能。
功能f = myfun(x)k = 1:10;f = 2 + 2*k-exp(k*x(1)) - exp(k*x(2));结尾
此代码创建myfun2
助手功能。
功能[f,j] = myfun2(x)k = 1:10;f = 2 + 2*k-exp(k*x(1)) - exp(k*x(2));如果nargout> 1 j =零(10,2);j(k,1)= -k。*exp(k*x(1));j(k,2)= -k。*exp(k*x(2));结尾结尾