【发布时间】: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\fsolfesAx=b算法的正确选择问题。 -
问题不成立吗? tan(x(3)) 出现在 f 和 J 中; x(3)=pi/2 开始; tan(pi/2)=Inf
标签: matlab matrix runtime-error newtons-method