我知道将矩阵求逆来求解线性系统不是一个好主意,因为它不如直接求解该系统或使用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吗?
------问题更新------
谢谢您的回答。但是,假设我们必须求解次系统,其中始终是相同的矩阵。考虑一下A x = b A
-已满,因此需要存储器存储比相同。
条件数较小,因此可以精确计算。
在那种情况下,计算比使用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秒。
Ax=b
用相同的方法反复求解,A
并且它足够小以求逆,则可以保存LU分解并重复使用。