Ein praktisches Beispiel, warum es nicht gut ist, eine Matrix zu invertieren


16

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 AnAx=bA

- voll ist , und somit Speicherung als die gleichen Speicher benötigt .A - 1 AAA1A

- Die Bedingungszahl von ist klein, daher kann mit Genauigkeit berechnet werden.A - 1AA1

Wäre es in diesem Fall nicht effizienter, zu berechnen, als eine LU-Zerlegung zu verwenden? Ich habe zum Beispiel diesen Matlab-Code ausprobiert:A1

%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.O(1011)


8
Die MATLAB-Hilfeseite für inv enthält ein gutes Beispiel. Schauen Sie unter dem Abschnitt " Linearsystem lösen" nach .
GoHokies

1
Übrigens, wie lautet die Bedingungsnummer Ihrer Matrix? Ich habe kein MATLAB auf meinem PC, daher kann ich nicht überprüfen, aber ich nehme an, dass es klein genug ist, um eine genaue Umkehrung zu erhalten ...A
GoHokies

2
Ich habe mir Trefethen und Bau angeschaut (Aufgabe 21.4) und sie beschreiben es rein als Rechenaufwand, Flops vs. Flops. Selbst wenn Sie ähnliche Residuen finden (haben Sie versucht, schlecht konditionierte Matrizen wie in GoHokies 'Kommentar zu überprüfen?), Sind die unnötigen Berechnungskosten allein wahrscheinlich den Rat wert. 2n323n3
Kirill

3
Ihre Matrixgröße ist viel zu klein und für diesen Vergleich gut konditioniert. Nicht, dass es keine relevanten Probleme gibt, bei denen Sie solche Matrizen haben, aber die erhaltene Meinung, dass Sie nicht invertieren sollten, ist für eine andere Einstellung gedacht (z. B. die von Chris Rackauckas in seiner Antwort erwähnte). Tatsächlich kann für kleine und - nachweislich - gut konditionierte Matrizen die Berechnung der Inversen tatsächlich die bessere Option sein. Ein Extremfall wären 3x3-Rotations- (oder realistischer affine Transformations-) Matrizen.
Christian Clason

1
Wenn Sie wiederholt Ax=bmit demselben lösen müssen Aund es klein genug ist, um das Inverse zu nehmen, können Sie stattdessen die LU-Faktorisierung speichern und diese wiederverwenden.
Chris Rackauckas

Antworten:


11

Normalerweise gibt es einige Hauptgründe, die es vorziehen, ein lineares System zu lösen, um das Inverse zu verwenden. Kurz:

  • Problem mit der bedingten Zahl (@ GoHokies Kommentar)
  • Problem im spärlichen Fall (@ChrisRackauckas Antwort)
  • Effizienz (@Kirill Kommentar)

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

inverse||xVx||O(κ2(A)ϵmachine) backward stable (LU, QR,...)||xbackwardstablex||O(κ(A)ϵmachine)

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

(1) ist keine gute Rechtsumkehrung, oderV

(2) ist eine so schlechte linke Inverse, dassist viel kleiner als, oderV||xV||||x||

(3) Die Projektion von auf die linken Singularvektoren von die mit kleinen Singularwerten assoziiert sind, ist klein.bA

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.


12

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

ut=Δu+f(t,u).

Um es numerisch zu lösen, erhält man spärliche Matrizen und löst dann eine Methode zur Diskretisierung von LinienA

ut=Au+f(t,u)

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 - γ AAIγASpecialMatrices.jl

julia> using SpecialMatrices
julia> Strang(5)
5×5 SpecialMatrices.Strang{Float64}:
 2.0  -1.0   0.0   0.0   0.0
-1.0   2.0  -1.0   0.0   0.0
 0.0  -1.0   2.0  -1.0   0.0
 0.0   0.0  -1.0   2.0  -1.0
 0.0   0.0   0.0  -1.0   2.0

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 )nO(3n)O(1)

Nehmen wir jedoch an, wir möchten die Matrix invertieren.

julia> inv(collect(Strang(5)))
5×5 Array{Float64,2}:
 0.833333  0.666667  0.5  0.333333  0.166667
 0.666667  1.33333   1.0  0.666667  0.333333
 0.5       1.0       1.5  1.0       0.5
 0.333333  0.666667  1.0  1.33333   0.666667
 0.166667  0.333333  0.5  0.666667  0.833333

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 von \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.jlA - 1 AAx=bA1A

Wie 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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.