A, B und C sind Matrizen.
A*B = C
Jetzt möchte ich eine Umkehrung vornehmen, d.h. A mit B und C berechnen. Wie mache ich das? Matlab sagt, dass B eine quadratische Matrize sein sollte, um ihre Umkehrung zu berechnen.
A, B und C sind Matrizen.
A*B = C
Jetzt möchte ich eine Umkehrung vornehmen, d.h. A mit B und C berechnen. Wie mache ich das? Matlab sagt, dass B eine quadratische Matrize sein sollte, um ihre Umkehrung zu berechnen.
WENN es eine eindeutige Lösung gibt, dann kann man sie am besten mit pinv finden. Anhand des von Schwarz genannten Beispiels...
A = [2 3 4];
B = [11 11 11; 12 12 12; 13 13 13];
C = A*B;
Ahat = C*pinv(B)
Ahat =
2.788 3.0415 3.2949
Das Problem ist, dass B ein Einzelfall ist. Es gibt also potenziell unendlich viele Lösungen.
B = magic(3)
B =
8 1 6
3 5 7
4 9 2
A = [2 3 4];
C = A*B
C =
41 53 41
Ahat = C*pinv(B)
Ahat =
2 3 4
Ahat = C/B
Ahat =
2 3 4
Sehen Sie, dass pinv und slash beide die gleiche Lösung ergeben, da B nicht-singulär UND gut konditioniert ist.
Aber wie wäre es, wenn wir etwas ausprobieren, das weniger gut konditioniert ist? In diesem nächsten Beispiel verwende ich eine Matrix, die gar nicht so schlecht ist.
>> A = [2 3 4];
>> B = [1 1 1;1 2 3;2 3 4.00001]
B =
1 1 1
1 2 3
2 3 4.00001
Nun, sie hat eine ziemlich große Zustandszahl, aber diese Matrix ist nicht das, was ich numerisch singulär nennen würde.
cond(B)
ans =
2865128.4655819
C = A*B
C =
13 20 27.00004
Lassen Sie uns nun verschiedene Lösungen ausprobieren.
format long g
Ahat1 = C*pinv(B)
Ahat1 =
2 3 4
pinv hat sich gut geschlagen.
Ahat2 = C/B
Ahat2 =
2.00000000017764 3.00000000017764 3.99999999982236
Ahat3 = C*inv(B)
Ahat3 =
1.99999999953434 2.99999999953434 4.00000000046566
slash und inv waren beide nicht schlecht, wenn auch in diesem Fall deutlich schlechter. Die pinv-Lösung scheint für dieses Problem etwas stabiler zu sein.
Wir könnten auch eine QR-Faktorisierung anwenden. Verwenden Sie eine schwenkbare Lösung, um die beste Stabilität zu erreichen. Beachten Sie, dass wir auch dann Probleme erwarten, wenn Ihr System nahezu singulär ist.
[Q,R,P] = qr(B);
Sie können das Problem sehen, wenn Sie R untersuchen. Das letzte Diagonalelement ist im Vergleich zum Rest sehr klein. Dies führt zu Problemen bei der Lösung und verstärkt jegliches Rauschen.
R
R =
-5.09902735824196 -2.35339392337313 -3.72620671848107
0 0.679365175314723 0.339681455393392
0 0 -2.88675134520189e-06
Die QR-Faktoren haben die Eigenschaft, dass Q*R*P' = B. Also können wir hier für A lösen als:
Ahat4 = ((C*P)/R)*Q'
Ahat4 =
2.00000000076851 3.0000000007685 3.9999999992315
Beachten Sie, dass ich die Parens so angeordnet habe, dass sie so effizient wie möglich sind, da MATLAB die Eigenschaft von R als Dreiecksmatrix nutzt, um einfach eine Rücklösung durchzuführen. Wir wollen nicht, dass MATLAB eine Matrix faktorisiert, die bereits faktorisiert ist.
Aber jetzt wollen wir uns eine Frage von Vahid ansehen:
Ahat5 = C*B'*(inv(B*B'))
Ahat5 =
1.9970703125 2.998046875 4.0029296875
Die von Vahid vorgeschlagene Lösung war jedoch einfach schrecklich. Verwenden Sie dieses letzte Formular NICHT. BITTE! Es gibt einen Grund, warum die Leute Ihnen sagen, dass Sie das nicht tun sollen, oder sie hätten Ihnen das sagen sollen! Ja, ich weiß, dass es eine Gruppe von Leuten gibt, die keine Ahnung von der Mathematik haben, die dahinter steckt, und sie verbreiten das immer wieder. Man kann sie sogar in einigen uninformierten Lehrbüchern finden.
Das Schöne an pinv ist, dass es für jede Matrix funktioniert, ob singulär oder nicht. Wenn es eine Lösung gibt, wird sie auch gefunden. Wenn die Lösung eindeutig ist, funktioniert es. Wenn die Lösung nicht eindeutig ist, nun ja, was erwarten Sie dann?
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.