2016-04-20 10 views
0

Mai frage ich über den Unterschied für x in diese 2 folgende Möglichkeiten in Matlab zu lösen:untere Dreiecksmatrix Lösung der kleinsten Quadrate Art und Weise Matlab

Way 1: x = A\b

Way 2: x = inv((A.').*A)*(A.'*b)

(ps: die invertierte Matrix ist invertierbar)

Ich denke, diese beiden Möglichkeiten sollten die gleichen Ergebnisse liefern, aber ich kann diese Übereinstimmung nicht erreichen. Ich möchte die kleinste quadratische Mode anwenden. Es enthält jedoch viele verschiedene Arten von Matrix (Transponieren, Invertieren und dann mehrere) und wenn ich Matlab schreibe, habe ich Verwirrung. Bitte helfen Sie mir, die falschen Dinge in Weg 2 aufzuzeigen.

Vielen Dank für Ihre Kommentare!

+3

docs auf [ 'inv'] umschreiben (http://nl.mathworks.com/help/matlab/ref/ inv.html) explizit angeben: * 'x = A \ b' wird anders berechnet als' x = inv (A) * b' und wird empfohlen, um lineare Gleichungssysteme zu lösen. * Verwenden Sie also '\' und nicht 'inv' – Adriaan

+2

Theoretisch sind beide Wege die gleichen, um die Lösung zu finden, aber Sie sind sehr ermutigt, den ersten Weg zu verwenden **. Allerdings ist 'inv ((A. '). * A)' nicht korrekt. Sie müssen multiplizieren, nicht elementweise multiplizieren: 'inv ((A. ') * A)'. In jedem Fall ist es bekannt, dass "inv" numerisch instabil ist, wenn die Bedingungsnummer für "A" groß ist, besonders wenn Sie lineare Systeme lösen. Benutze entweder (1) den ersten Weg oder (2) 'pinv (A) * b ', wenn du ein überbestimmtes oder unbestimmtes Gleichungssystem hast. – rayryeng

Antwort

1

die Fehlerquadratformel, die

enter image description here

ist falsch buchstabiert. Im letzteren Fall b<-->y, wohingegen p<-->x.

Innerhalb der inv() Funktion ist das Produkt zwischen A.' und A kein elementweises Produkt.
Gemäß der PEMDAS-Regel ist es inkorrekt, A.' und b innerhalb einer Klammer zu verbinden, wobei dieser Begriff in Bezug auf ersteres Priorität hat.

Abschließend die Formel Matlab für LS ist:

x=inv((A.')*A)*(A.')*b; 

Schließlich können Sie auch mit der obigen Formel vereinfachen durch die pinv() Funktion, die die Moore-Penrose-Pseudoinverse wertet, dass inv((A.')*A)*(A.') ist. Tatsächlich wird pinv(A) als inv((A.')*A)*(A.') zum gleichen Ergebnis führen und daher können Sie die LS-Lösung als

x=pinv(A)*b; 
Verwandte Themen