MATLAB - 牛顿法但出现错误消息 "Singular Matrix"

MATLAB - Newtons Method but error message "Singular Matrix"

当我使用牛顿法求方程组的根时,出现以下错误消息:

"Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 1.625479e-33. > In new (line 16)"

知道为什么我会收到此错误消息吗?我知道奇异矩阵和逆矩阵,但这真的与它有什么关系吗?如果是这样,如何?我可以对代码做出什么改变?它说第 16 行,即 dx = -J\f;。但我只是跟随我的数值方法教科书。肯定是哪里出了问题,但练习中说 "use Newtons Method" 所以我想这应该可行。我希望有人能帮助我。

x = [0 0 pi/2]';
maxiter = 10;
iter = 0;
dxnorm = 1;
results = cell(maxiter + 1, 2); % Preallocate results array

while dxnorm > 0.5e-4 && iter <= maxiter
    f = [cos(x(1)) + cos(x(2))    + cos(x(3))-2; ...
         sin(x(1)) + sin(x(2))    + sin(x(3)); ...
         tan(x(1)) - 2.*tan(x(2)) + tan(x(3)); ...
         ];
    J = [-sin(x(1)),       -sin(x(2)),          -sin(x(3)); ...
         cos(x(1)),        cos(x(2)),           cos(x(3)); ...
         tan(x(1)).^2 + 1, -2*tan(x(2)).^2 - 2, tan(x(3)).^2 + 1 ...
         ];
    dx = -J\f;
    results{iter + 1, 1} = x;
    x = x + dx;
    dxnorm = norm(dx,inf);
    results{iter + 1, 2} = dxnorm;
    iter = iter + 1;
end
x, iter

x(3) = pi/2 的初始条件导致 f 的第 3 个条目变为无限,因为 tan(pi/2) = sin(pi/2)/cos(pi/2) = inf,除了它 不是 完全无限因为浮点不精确,pi 等中的不精确......所以你只会得到一个非常大的数字。

现在你有非常大的数字和非常小的数字,基本上一切都得到了 !@#$ed。您的雅可比矩阵缩放不当等...

爆炸的线性方程为:

[0,    0,   -1                                       [x1      [0
 1,    1,    0                                    *   x2   =   1
 1,   -2,   266709378811357100000000000000000 ]       x3]      16331239353195370]

这些是对线性系统进行数值求解的 !@#$ed 条件。

你该怎么办?

从理智的地方开始。例如。从初始条件 [0,0,pi/4] 开始,一切都可能正常。

一些初始条件也会触发导数为零的多元等效项(这也会使牛顿法失效)。