Mir ist bewusst, dass das Invertieren einer Matrix zur Lösung eines linearen Systems keine gute Idee ist, da es nicht so genau und effizient ist wie das direkte Lösen des Systems oder die Verwendung von LU, Cholesky oder QR-Zerlegung.
Ich konnte dies jedoch nicht anhand eines praktischen Beispiels überprüfen. Ich habe diesen Code ausprobiert (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))
und die Residuen haben immer die gleiche Ordnung (10 ^ -13).
Könnte jemand ein praktisches Beispiel liefern, in dem inv (A) * b viel weniger ungenau ist als A \ b?
------ Frage Update ------
Danke für deine Antworten. Nehmen wir jedoch an, wir müssen mal ein System lösen , wobei immer dieselbe Matrix ist. Berücksichtige dasA x = b A
- voll ist , und somit Speicherung als die gleichen Speicher benötigt .A - 1 A
- Die Bedingungszahl von ist klein, daher kann mit Genauigkeit berechnet werden.A - 1
Wäre es in diesem Fall nicht effizienter, zu berechnen, als eine LU-Zerlegung zu verwenden? Ich habe zum Beispiel diesen Matlab-Code ausprobiert:
%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))
Für eine Matrix mit der Bedingungsnummer ungefähr 450 sind die Residuen in beiden Fällen , aber es dauert 19 Sekunden, um das System n-mal unter Verwendung der LU-Zerlegung zu lösen, wohingegen es nur unter Verwendung der Umkehrung von A dauert 9 Sekunden.
Ax=b
mit demselben lösen müssen A
und es klein genug ist, um das Inverse zu nehmen, können Sie stattdessen die LU-Faktorisierung speichern und diese wiederverwenden.