Sono consapevole che invertire una matrice per risolvere un sistema lineare non è una buona idea, dal momento che non è così preciso ed efficiente come risolvere direttamente il sistema o usare la decomposizione LU, Cholesky o QR.
Tuttavia, non sono stato in grado di verificarlo con un esempio pratico. Ho provato questo codice (in 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))
e i residui sono sempre dello stesso ordine (10 ^ -13).
Qualcuno potrebbe fornire un esempio pratico in cui inv (A) * b è molto meno impreciso di A \ b?
------ Aggiornamento delle domande ------
Grazie per le tue risposte. Tuttavia, supponiamo che dobbiamo risolvere volte un sistema A x = b , dove A è sempre la stessa matrice. Considera che
- è completa, e quindi A - 1 richiede la stessa memoria di A .
-Il numero della condizione di è piccolo, quindi A - 1 può essere calcolato con precisione.
In tal caso, non sarebbe più efficiente calcolare piuttosto che usare una decomposizione LU? Ad esempio, ho provato questo codice 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))
Per una matrice con numero di condizione circa 450, i residui sono in entrambi i casi, ma ci vogliono 19 secondi per risolvere il sistema n volte usando la decomposizione LU, mentre usando l'inverso di A ci vogliono solo 9 secondi.
Ax=b
con lo stesso A
ed è abbastanza piccolo da prendere l'inverso, puoi invece salvare la fattorizzazione LU e riutilizzarla.