为什么在Matlab中N增加相同的N * N矩阵得到两个不同的逆矩阵?

时间:2017-04-18 14:11:12

标签: algorithm matlab matrix inversion

作为一项实验,我只是想看看Cayley-Hamilton理论和MATLAB inv()函数之间的计算时间。我知道由于矩阵产品的数量,C-H在CPU上会变慢,但是当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));

感谢任何花时间回答的人。

1 个答案:

答案 0 :(得分:1)

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 ...