为什么在 Matlab 中随着 N 的增加,同一个 N * N 矩阵会得到两个不同的逆矩阵?
Why do I get two different inverse matrices for the same N * N matrix as N increases in Matlab?
作为实验,我只是想看看 Cayley-Hamilton 理论和 MATLAB inv()
函数之间的计算时间。我知道由于矩阵乘积的数量,CPU 上的 C-H 会变慢,但是我没想到随着 N 的增加它们会给我不同的答案。
对于小于 30 * 30 左右的方阵,逆矩阵大致相同。但在这一点之后,他们开始彼此截然不同。到 N = 100 时,它们完全没有相似之处。
这是一个数值计算问题,还是这里发生了其他事情?
我还可以信任哪个?我假设 inv()
是高度优化和值得信赖的,但如果能从其他人那里得到一些意见就更好了。
代码如下:
n = 100;
A = randn(n);
% MATLAB inv()
tic;
initime = cputime;
time1 = clock;
A_inv = inv(A);
fintime = cputime;
elapsed = toc;
time2 = clock;
fprintf('TIC TOC: %g\n', elapsed);
fprintf('CPUTIME: %g\n', fintime - initime);
fprintf('CLOCK: %g\n', etime(time2, time1));
% Cayley-Hamilton inversion
tic;
initime = cputime;
time1 = clock;
p_coeff = poly(A);
A_inv_2 = 0;
for ii = 1:n-1
A_inv_2 = A^(ii)*p_coeff(end-1-ii) + A_inv_2;
end
A_inv_2 = 1/-p_coeff(end) * (A_inv_2 + eye(n)*p_coeff(end-1));
fintime = cputime;
elapsed = toc;
time2 = clock;
fprintf('TIC TOC: %g\n', elapsed);
fprintf('CPUTIME: %g\n', fintime - initime);
fprintf('CLOCK: %g\n', etime(time2, time1));
感谢所有花时间回答问题的人。
Cayley-Hamilton 方法是一种非常不稳定的逆计算方法,因为它涉及对矩阵进行高次幂运算。
考虑一个可以对角化为 A=inv(P)DP
的矩阵,其中 D 是对角矩阵。当提高到 100 次方时,这将变为 A^100 = inv(P) D^100 P
。 D 中对角线项之间的任何大小差异都将被此操作放大。例如,考虑 2^100 和 0.5^100 之间的差异。
在您的 Matlab 程序中实际上很容易看到这一点。打印出 A * A_inv 和 A * A_inv_2。第一个非常接近身份,而第二个包含废话:
A*A_inv_2
ans = 1.0e10 *
0.2278 0.3500 -0.2564 ...
作为实验,我只是想看看 Cayley-Hamilton 理论和 MATLAB inv()
函数之间的计算时间。我知道由于矩阵乘积的数量,CPU 上的 C-H 会变慢,但是我没想到随着 N 的增加它们会给我不同的答案。
对于小于 30 * 30 左右的方阵,逆矩阵大致相同。但在这一点之后,他们开始彼此截然不同。到 N = 100 时,它们完全没有相似之处。
这是一个数值计算问题,还是这里发生了其他事情?
我还可以信任哪个?我假设 inv()
是高度优化和值得信赖的,但如果能从其他人那里得到一些意见就更好了。
代码如下:
n = 100;
A = randn(n);
% MATLAB inv()
tic;
initime = cputime;
time1 = clock;
A_inv = inv(A);
fintime = cputime;
elapsed = toc;
time2 = clock;
fprintf('TIC TOC: %g\n', elapsed);
fprintf('CPUTIME: %g\n', fintime - initime);
fprintf('CLOCK: %g\n', etime(time2, time1));
% Cayley-Hamilton inversion
tic;
initime = cputime;
time1 = clock;
p_coeff = poly(A);
A_inv_2 = 0;
for ii = 1:n-1
A_inv_2 = A^(ii)*p_coeff(end-1-ii) + A_inv_2;
end
A_inv_2 = 1/-p_coeff(end) * (A_inv_2 + eye(n)*p_coeff(end-1));
fintime = cputime;
elapsed = toc;
time2 = clock;
fprintf('TIC TOC: %g\n', elapsed);
fprintf('CPUTIME: %g\n', fintime - initime);
fprintf('CLOCK: %g\n', etime(time2, time1));
感谢所有花时间回答问题的人。
Cayley-Hamilton 方法是一种非常不稳定的逆计算方法,因为它涉及对矩阵进行高次幂运算。
考虑一个可以对角化为 A=inv(P)DP
的矩阵,其中 D 是对角矩阵。当提高到 100 次方时,这将变为 A^100 = inv(P) D^100 P
。 D 中对角线项之间的任何大小差异都将被此操作放大。例如,考虑 2^100 和 0.5^100 之间的差异。
在您的 Matlab 程序中实际上很容易看到这一点。打印出 A * A_inv 和 A * A_inv_2。第一个非常接近身份,而第二个包含废话:
A*A_inv_2
ans = 1.0e10 *
0.2278 0.3500 -0.2564 ...