2010-11-21 18 views
3

Ich versuche, die Quadratwurzel einer Matrix zu nehmen. Das ist die Matrix B so B*B=A. Keine der Methoden, die ich gefunden habe, ergibt ein funktionierendes Ergebnis.Arbeitsmatrix Quadratwurzel

Zuerst fand ich diese Formel auf Wikipedia:

Set Y_0 = A und Z_0 = I dann die Iteration:

Y_{k+1} = .5*(Y_k + Z_k^{-1}),

Z_{k+1} = .5*(Z_k + Y_k^{-1}).

Dann Y-B konvergieren sollten.

jedoch den Algorithmus in Python (mit numpy für Umkehrmatrizen) Umsetzung Müll Ergebnisse gab mir:

>>> def denbev(Y,Z,n): 
    if n == 0: return Y,Z 
    return denbev(.5*(Y+Z**-1), .5*(Z+Y**-1), n-1) 

>>> denbev(matrix('1,2;3,4'), matrix('1,0;0,1'), 3)[0]**2 
matrix([[ 1.31969074, 1.85986159], 
     [ 2.78979239, 4.10948313]]) 

>>> denbev(matrix('1,2;3,4'), matrix('1,0;0,1'), 100)[0]**2 
matrix([[ 1.44409972, 1.79685675], 
     [ 2.69528512, 4.13938485]]) 

Wie Sie 100 Mal sehen, iterieren, gibt schlechte Ergebnisse als drei Mal iteriert, und Keines der Ergebnisse erreicht eine Fehlerspanne von 40%.

Dann habe ich versucht, die scipy sqrtm Methode, aber das war noch schlimmer:

>>> scipy.linalg.sqrtm(matrix('1,2;3,4'))**2 
array([[ 0.09090909+0.51425948j, 0.60606061-0.34283965j], 
     [ 1.36363636-0.77138922j, 3.09090909+0.51425948j]]) 

>>> scipy.linalg.sqrtm(matrix('1,2;3,4')**2) 
array([[ 1.56669890+0.j, 1.74077656+0.j], 
     [ 2.61116484+0.j, 4.17786374+0.j]]) 

Ich weiß nicht viel über die Matrix quadratisch Verwurzelung wissen, aber ich glaube es muss Algorithmen sein, die als die oben eine bessere Leistung ?

Antwort

7

(1) die Quadratwurzel der Matrix [1,2; 3,4] sollte etwas Komplexes ergeben, da die Eigenwerte dieser Matrix negativ sind. SO kann Ihre Lösung nicht korrekt sein.

(2) linalg.sqrtm gibt ein Array zurück, NICHT eine Matrix. Daher ist die Verwendung von *, um sie zu multiplizieren, keine gute Idee. In Ihrem Fall ist die Lösung also korrekt, aber Sie sehen es nicht.

bearbeiten versuchen, die folgenden, sehen Sie es korrekt ist:

asmatrix(scipy.linalg.sqrtm(matrix('1,2;3,4')))**2 
+0

Vielen Dank. Funktioniert perfekt. Nur sehe ich immer noch nicht, warum 'sqrtm (Matrix ('1,2; 3,4') ** 2)' nicht funktioniert? –

+0

Es funktioniert ... Versuchen Sie, die Lösung zu quadrieren, siehe http://www.mathworks.com/help/techdoc/ref/sqrtm.html – steabert

+1

Richtig, es gibt viele Lösungen, und sqrtm wählt einfach einen anderen als mich. –

3

Ihre Matrix [1 2; 3 4] ist nicht positiv, daher gibt es keine Lösung für das Problem im Bereich realer Matrizen.

2

Was ist der Zweck der Matrix Quadratwurzel ist, die Sie tun? Ich vermute, eine praktische Anwendung der Matrix könnte wirklich symmetrisch positiv definite (z. B. Kovarianz) sein, so dass Sie nicht auf komplexe Zahlen treffen sollten.

In diesem Fall, dass Sie eine Cholesky-Zerlegung, wie eine skalierte LU-Faktorisierung berechnen können, finden Sie hier: http://en.wikipedia.org/wiki/Cholesky_decomposition

Ein weiteres praktisches Beispiel ist, wenn Ihre Matrizen Drehungen sind, dann können Sie zunächst mit Matrix log zersetzen und teilen sich nur durch 2 im logarithmischen Raum, dann zurück zur Rotation mit Matrixexponent ... auf jeden Fall klingt es komisch, dass Sie nach einer "generischen Matrix-Quadratwurzel" fragen, Sie möchten die spezifische Anwendung wahrscheinlich tiefer verstehen.

Verwandte Themen