Je suis conscient du fait qu'inverser une matrice pour résoudre un système linéaire n'est pas une bonne idée, car il n'est pas aussi précis et aussi efficace que de résoudre directement le système ou d'utiliser la décomposition LU, Cholesky ou QR.
Cependant, je n'ai pas pu vérifier cela avec un exemple pratique. J'ai essayé ce code (dans 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))
et les résidus sont toujours du même ordre (10 ^ -13).
Quelqu'un pourrait-il fournir un exemple pratique dans lequel inv (A) * b est beaucoup moins inexact que A \ b?
------ Mise à jour de la question ------
Merci pour vos réponses. Supposons cependant que nous devions résoudre fois un système , où est toujours la même matrice. Considérez queA x = b A
- est plein, et donc nécessite la même mémoire de stockage que .
-Le nombre de conditions de est petit, donc peut être calculé avec précision.
Dans ce cas, ne serait-il pas plus efficace de calculer plutôt que d'utiliser une décomposition LU? Par exemple, j'ai essayé ce code 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))
Pour une matrice dont le nombre de conditions est d'environ 450, les résidus sont dans les deux cas, mais il faut 19 secondes pour résoudre le système n fois en utilisant la décomposition LU, alors qu'en utilisant l'inverse de A, cela prend seulement 9 secondes.
Ax=b
le même problème A
et qu'il est suffisamment petit pour prendre l'inverse, vous pouvez enregistrer la factorisation LU et la réutiliser à la place.