这个例子展示了当你为一个非线性方程组提供导数时函数计算的减少。如在向量和矩阵目标函数的书写,雅可比矩阵 一个方程组 是 .提供这个导数作为目标函数的第二个输出。
例如,multirosenbrock
函数是
Rosenbrock函数的-维概化(见解决一个约束非线性问题,基于问题的任何正偶数值
:
方程组的解 这就是重点 , .
对于这个目标函数,所有的雅可比项 除了哪一项之外都是零 而且 最多相差一个。的奇数值 ,非零项为
的multirosenbrock
的辅助函数。本例结束创建目标函数
和它的雅可比矩阵
.
从这个点开始解方程组 的奇数值 , 对于偶数 .指定 .
N = 64;X0 (1:n,1) = -1.9;X0 (2:2:n,1) = 2;[x,F,exitflag,output,JAC] = fsolve(@multirosenbrock,x0);
方程解决。Fsolve是完成的,因为函数值的向量通过函数公差的值测量接近于零,并且通过梯度测量问题显得有规律。
检查计算解的距离x
从真正的解,和函数求值的数量fsolve
用于计算解决方案。
disp(规范(x-ones(大小(x))))
0
disp (output.funcCount)
1043
fsolve
找到解决方案,并进行超过1000个函数的计算。
再解一次方程组,这次用雅可比矩阵。要这样做,请设置“SpecifyObjectiveGradient”
选项真正的
.
Opts = optimoptions(“fsolve”,“SpecifyObjectiveGradient”,真正的);[x2,F2,exitflag2,output2,JAC2] = fsolve(@multirosenbrock,x0,opts);
方程解决。Fsolve是完成的,因为函数值的向量通过函数公差的值测量接近于零,并且通过梯度测量问题显得有规律。
再次,检查计算解的距离x2
从真正的解,和函数求值的数量fsolve
用于计算解决方案。
disp(规范(x2-ones(大小(x2))))
0
disp (output2.funcCount)
21
fsolve
返回与前一个解决方案相同的解决方案,但需要大约20个函数计算,而不是超过1000个。一般来说,使用雅可比矩阵可以减少函数计算的次数,并提供更高的鲁棒性,尽管这个例子并没有显示出改进的鲁棒性。
此代码创建multirosenbrock
helper函数。
函数[F,J] =多罗森布罗克(x)计算问题的大小N =长度(x)如果N == 0,错误('输入向量x为空');结束如果Mod (n,2) ~= 0 error(输入向量x必须有偶数个分量);结束计算向量函数赔率= 1:2:n;偶数= 2:2:n;F = 0 (n,1);F(odds,1) = 1-x(odds);F(偶数,1)= 10.*(x(偶数)-x(奇数).^2);计算雅可比矩阵,如果nargout > 1如果Nargout > 1 c = -ones(n/2,1);C =稀疏(odds,odds, C,n,n);D = 10*ones(n/2,1);D =稀疏(偶数,偶数,D,n,n);E = -20.*x(赔率);E =稀疏(偶数,奇数,E,n,n);J = c + d + e;结束结束