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üssenA
und es klein genug ist, um das Inverse zu nehmen, können Sie stattdessen die LU-Faktorisierung speichern und diese wiederverwenden.Antworten:
Normalerweise gibt es einige Hauptgründe, die es vorziehen, ein lineares System zu lösen, um das Inverse zu verwenden. Kurz:
Wie @ChristianClason in Kommentaren bemerkte, kann die Verwendung der Umkehrung in manchen Fällen eine gute Option sein.
In der Notiz / Artikel von Alex Druinsky, Sivan Toledo, Wie genau ist inv (A) * b? Es gibt einige Überlegungen zu diesem Problem.
Laut dem Artikel liegt der Hauptgrund für die allgemeine Präferenz, das lineare System zu lösen, in diesen beiden Schätzungen ( ist die wahre Lösung):x
Nun kann die Schätzung für die Inverse unter bestimmten Bedingungen gegenüber der Inversen verbessert werden, siehe Satz 1 in der Veröffentlichung, aber kann bedingt genau und nicht rückwärtsstabil sein.xV
Das Papier zeigt die Fälle, in denen dies passiert ( ist die Umkehrung)V
Die Möglichkeit, das Inverse zu verwenden oder nicht, hängt von der Anwendung ab. Sie können den Artikel überprüfen und sehen, ob Sie in Ihrem Fall die Bedingung erfüllen, um die Rückwärtsstabilität zu erhalten, oder ob Sie sie nicht benötigen.
Im Allgemeinen ist meiner Meinung nach das lineare System sicherer zu lösen.
quelle
Hier ist ein kurzes Beispiel, das im Zusammenhang mit der Speichernutzung in PDEs sehr praktisch ist. Wenn man den Laplace-Operator diskretisiert, ist beispielsweise in der WärmegleichungΔu
Um es numerisch zu lösen, erhält man spärliche Matrizen und löst dann eine Methode zur Diskretisierung von LinienA
Das kanonische 1D-Beispiel ist die Strang-Matrix. Implizite Methoden müssen oder eine Form von invertieren . Für eine Diskretisierung mit 5 Punkten im Raum wollen wir sehen, was mit diesem Operator passiert. Wir können es einfach in Julia erzeugen mit :I - γ AA I−γA
SpecialMatrices.jl
Diese spezielle Matrix ist tridiagonal (viele andere Diskretisierungen sind gebändert und daher immer noch dünn). Dies bedeutet, dass Sie es speichern können, indem Sie nur 3 Arrays speichern. In diesem Fall kann es "faul" sein (dh es wird kein Array benötigt und Sie können einen "Pseudo-Array" -Typ haben, der die Werte bei Bedarf generiert). Dies bedeutet, dass selbst bei sehr großen räumlichen Diskretisierungen mit Punkten spärliche Matrixformate dies im -Speicher speichern können (und Lazy-Formate dies in !).O ( 3 n ) O ( 1 )n O(3n) O(1)
Nehmen wir jedoch an, wir möchten die Matrix invertieren.
Beachten Sie, dass die Inverse dieser dünnen Matrix dicht ist. Wenn wir also die analytische Lösung der Inverse nicht kennen (was für die meisten spärlichen Matrizen gilt, die sich aus PDE-Diskretisierungen ergeben), ist erforderlich . Dies bedeutet, dass die Inverse eine enorme Menge zusätzlichen Speichers in Anspruch nimmt und Ihr Speicherlimit daher durch die Größe der dichten inversen Matrix bestimmt wird.O(n2)
Stattdessen lösen direkte Lösungsmethoden vonAx=b A−1 A
\
und iterative Lösungsmethoden wie die von ohne jemals berechnen , und haben daher nur den Speicherbedarf, zu speichern . Dies kann die Größe der zu lösenden PDEs erheblich vergrößern.IterativeSolvers.jl
A - 1 AWie andere erwähnt haben, sind Bedingungsnummer und numerischer Fehler ein weiterer Grund, aber die Tatsache, dass die Inverse einer dünnen Matrix dicht ist, gibt einen sehr klaren Hinweis darauf, dass dies eine schlechte Idee ist.
quelle