我知道对矩阵求逆来求解线性系统并不是一个好主意,因为它不如直接求解系统或使用 LU、Cholesky 或 QR 分解准确和高效。
但是,我无法通过实际示例来检查这一点。我已经尝试过这段代码(在 MATLAB 中)
M = 500;
A = rand(M,M);
A = real(expm(1i*(A+A.')));
b = rand(M,1);
x1 = A\b;
x2 = inv(A)*b;
disp(norm(b-A*x1))
disp(norm(b-A*x2))
并且残差总是相同的顺序(10^-13)。
有人可以提供一个实际示例,其中 inv(A)*b 比 A\b 不准确得多吗?
------问题更新-----
谢谢您的回答。但是,假设我们必须解决倍系统, 在哪里总是相同的矩阵。考虑到
-已满,因此需要相同的内存存储比.
-条件数很小,因此可以准确计算。
在那种情况下,计算不是更有效吗而不是使用LU分解?例如,我试过这个 Matlab 代码:
%Set A and b:
M = 1000;
A = rand(M,M);
A = real(expm(1i*(A+A.')));
b = rand(M,1);
%Times we solve the system:
n = 3000;
%Performing LU decomposition:
disp('Performing LU decomposition')
tic
[L,U,P] = lu(A);
toc
fprintf('\n')
%Solving the system n times with LU decomposition:
optsL.LT = true; %Options for linsolve
optsU.UT = true;
disp('Solving the system n times using LU decomposition')
tic
for ii=1:n
x1 = linsolve(U, linsolve(L,P*b,optsL) , optsU);
end
toc
fprintf('\n')
%Computing inverse of A:
disp('Computing inverse of A')
tic
Ainv = inv(A);
toc
fprintf('\n')
%Solving the system n times with Ainv:
disp('Solving the system n times with A inv')
tic
for ii=1:n
x2 = Ainv*b;
end
toc
fprintf('\n')
disp('Residuals')
disp(norm(b-A*x1))
disp(norm(b-A*x2))
disp('Condition number of A')
disp(cond(A))
对于条件数约为 450 的矩阵,残差为在这两种情况下,但使用 LU 分解求解系统 n 次需要 19 秒,而使用 A 的逆分解只需要 9 秒。