主要内容

具有雅可比矩阵的大型稀疏非线性方程组

控件的特性fsolve求解器有效地解决方程的大稀疏系统。该示例使用目标函数,为系统定义 n 方程,

F 1 3. x 1 - 2 x 1 2 - 2 x 2 + 1 F 3. x - 2 x 2 - x - 1 - 2 x + 1 + 1 F n 3. x n - 2 x n 2 - x n - 1 + 1

要解的方程是 F x 0 1 n .示例使用 n 1 0 0 0

这个目标函数非常简单,你可以通过解析来计算它的雅可比矩阵。在解释写向量和矩阵目标函数,雅各比亚 J x 一个方程组 F x J j x F x x j .将这个导数作为目标函数的第二个输出。的nlsf1.的辅助函数此示例的结尾创建目标函数 F x 及其雅各比亚 J x

使用默认选项求解方程式系统,该选项调用“trust-region-dogleg”算法。从要点开始xstart (i) = 1

n = 1000;xstart = -ones(n,1);有趣= @ nlsf1;[x,fval,出口,输出] = fsolve(有趣,xstart);
等式解决。FSOLVE完成,因为通过函数容差的值测量,功能值的向量接近零,并且如梯度测量的问题会常规。

显示解决方案质量和函数评估的数量。

disp(规范(fval))
2.8577 e-13
disp(output.funccount)
7007

fsolve准确解决方程,但需要数以千计的函数评估。

用雅可比矩阵在默认和“信任区域”算法。

选项= Optimoptions(“fsolve”“SpecifyObjectiveGradient”,真正的);(x2, fval2 exitflag2 output2] = fsolve(乐趣、xstart选项);
等式解决。FSOLVE完成,因为通过函数容差的值测量,功能值的向量接近零,并且如梯度测量的问题会常规。
options.algorithm =“信任区域”;[X3,FVAL3,EXITFLAG3,OUTPUT3] = FSOLVE(有趣,XSTART,选项);
等式解决。FSOLVE完成,因为通过函数容差的值测量,功能值的向量接近零,并且如梯度测量的问题会常规。
disp([规范(fval2)、规范(fval3)))
1.0E-08 * 0.0000 0.1065
DISP([OUTPUT2.FUNCCOUNT,OUTPUT3.FUNCCOUNT])
7 5

与不使用雅可比矩阵的情况相比,这两种算法都只需要很小一部分的函数求值。的算法需要的函数求值要多一些“信任区域”算法,但默认算法达到更准确的答案。

看是否设置'precondbandwidth'选项1更改“信任区域”回答或效率。这个设置原因fsolve使用Tridiacal Precetitioner,这应该对这种三角形方程系统有效。

options.precondbandwidth = 1;[x4,fval4,ExitFlag4,Output4] = FSOLVE(有趣,XSTART,选项);
方程已解,可能不准确。Fsolve停止是因为函数值的向量接近于零,这是由函数容差值度量的。然而,最后一步是无效的。
disp(规范(fval4))
3.1185E-05.
disp (output4.funcCount)
6
disp (output4.cgiterations)
8

'precondbandwidth'选项设置原因fsolve给出一个稍微不准确的答案,用残差的标准值来衡量。函数计算的次数略有增加,从5次增加到6次。作为求解过程的一部分,该求解器的共轭梯度迭代次数少于10次。

看看fsolve使用对角预处理符执行。

选项。PrecondBandWidth = 0;[x5, fval5 exitflag5 output5] = fsolve(乐趣、xstart选项);
方程已解,可能不准确。Fsolve停止是因为函数值的向量接近于零,这是由函数容差值度量的。然而,最后一步是无效的。
disp(规范(fval5))
2.0057E-05.
disp (output5.funcCount)
6
disp (output5.cgiterations)
19

这次的残差范数稍微低一些,函数计算的次数没有变化。共轭梯度迭代次数从8次增加到19次,说明了这一点'precondbandwidth'设置使求解器做更多的工作。

使用该方程解决方程“levenberg-marquardt”算法。

选项= Optimoptions(“fsolve”“SpecifyObjectiveGradient”,真的,“算法”“levenberg-marquardt”);[x6, fval6 exitflag6 output6] = fsolve(乐趣、xstart选项);
等式解决。FSOLVE完成,因为通过函数容差的值测量,功能值的向量接近零,并且如梯度测量的问题会常规。
disp(规范(fval6))
7.5854 e15汽油
disp (output6.funcCount)
6

该算法给出最低残差范数,只比最低次数的函数求值多使用一个。

总结结果。

t =表([规范(fval);规范(fval2);规范(fval3);规范(fval4);规范(fval5);规范(fval6)],...[output.funcCount; output2.funcCount output3.funcCount; output4.funcCount output5.funcCount; output6.funcCount),...“VariableNames”,[“残留”“函数宏指令”],...“RowNames”,[“默认”“默认+雅可比矩阵”“信任区域+雅各比亚”“信赖域+雅可比矩阵,BW = 1”“信任区+雅各比亚,BW = 0”“Levenberg-Marquardt + Jacobian”])
t =6×2表剩余FEVALS ________ ______默认为2.8577E-13 7007默认+雅各比尔2.5886E-13 7信任区+ jacobian 1.0646E-09 5信任区域+ jacobian,bw = 1 3.1185e-05 6信任区+ jacobian,bw =0 2.0057E-05 6 Levenberg-Marquardt + Jacobian 7.5854E-15 6

此代码创建nlsf1.函数。

功能F [J] = nlsf1 (x)%求向量函数值n =长度(x);F = 0 (n, 1);我= 2 (n - 1);F(i) = (3-2*x(i)). x(i)-x(i-1)-2*x(i+1) +1;F(n) = (3-2*x(n)) *x(n -1) + 1;F(1) = (3-2*x(1)). x(1)-2*x(2) + 1;%计算雅可比矩阵,如果nargout > 1如果Nargout> 1 d = -4 * x + 3 *(n,1);d =稀疏(1:n,1:n,d,n,n);c = -2 * in(n-1,1);c =稀疏(1:n-1,2:n,c,n,n);e = -ONE(n-1,1);e =稀疏(2:n,1:n-1,e,n,n);j = c + d + e;结束结束

另请参阅

相关话题