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