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]
开始,一切都可能正常。
一些初始条件也会触发导数为零的多元等效项(这也会使牛顿法失效)。
当我使用牛顿法求方程组的根时,出现以下错误消息:
"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]
开始,一切都可能正常。
一些初始条件也会触发导数为零的多元等效项(这也会使牛顿法失效)。