【问题标题】:MATLAB - Newtons Method but error message "Singular Matrix"MATLAB - 牛顿法但错误消息“奇异矩阵”
【发布时间】:2015-11-25 14:44:48
【问题描述】:

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

“警告:矩阵接近奇异或缩放错误。结果可能不准确。RCOND = 1.625479e-33。> 在新的(第 16 行)”

任何想法为什么我会收到此错误消息?我知道奇异矩阵和逆矩阵,但这真的与它有什么关系吗?如果是这样,怎么做?我可以对代码产生什么影响?它显示第 16 行,即dx = -J\f;。但我只是跟随我的数值方法教科书。肯定有问题,但练习说“使​​用牛顿法”,所以我想这应该可行。我希望有人可以帮助我。

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

【问题讨论】:

  • 这可能是因为导数接近于零,而牛顿法在这些情况下失败了。 en.wikipedia.org/wiki/Newton%27s_method#Derivative_issues
  • 你应该做的,就是找出不好的情况,然后用其他方法,即二分法。所以当J~=0 使用其他方法。
  • 你写它的方式,是的。 J\f 是 inv(J)*f 的语法糖。如果 J 现在变为单数,则 inv(J) 不存在,因此出现错误。您可以尝试pinv(J-lambda*eye(size(J))),其中 lambda 是一些松弛参数。
  • @FirefoxMetzger 不是真的。 J\fsolfes Ax=b算法的正确选择问题。
  • 问题不成立吗? tan(x(3)) 出现在 f 和 J 中; x(3)=pi/2 开始; tan(pi/2)=Inf

标签: matlab matrix runtime-error newtons-method


【解决方案1】:

x(3) = pi/2 的初始条件导致 f 的第三个条目变为无限,因为 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] 开始,一切都可能正常。

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

【讨论】:

  • 哈哈哈!@#$ed 条件。谢谢你今天的笑声。 +1。
猜你喜欢
  • 2012-06-24
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多