Wenn A eine symmetrische Matrix ist, dann unter Verwendung der orthogonalen Matrix U,
\mathbf{A} = \mathbf{U} \mathbf{D} \mathbf{U}^T
Kann diagonalisiert werden (D ist eine Diagonalmatrix). In diesem Moment,
\mathbf{A}^n = \mathbf{U} \mathbf{D}^n \mathbf{U}^T
Ist erfüllt, so wird die Berechnung von A zur n-ten Potenz sehr einfach.
Dieses Mal habe ich Python-Code erstellt, mit dem die Diagonalisierung leicht berechnet werden kann (eindeutige Wertzerlegung).
func.py
def Eigenvalue_decomp(A):
#Die symmetrische Matrix A wird unter Verwendung der orthogonalen Matrix U diagonalisiert.
import numpy as np
if A.shape[0]!=A.shape[1]: #Gibt einen Fehler zurück, wenn A keine quadratische Matrix ist
raise Exception("error! A is not square matrix!")
if (A==A.T).all()==False: #Gibt einen Fehler zurück, wenn A keine symmetrische Matrix ist
raise Exception("error! A is not symmetric matrix!")
la, U = np.linalg.eig(A) # eigen value and eigen vector is resolved.
U,_=np.linalg.qr(U) # Gram-Schmidt orthonormalization
D=np.diag(la)
return U,D
mit diesem,
In[1]: import func
In[2]: U,D=func.Eigenvalue_decomp(A)
Sie können die orthogonale Matrix U und die diagonale Matrix D zum Diagonalisieren der durch numpy erzeugten symmetrischen Matrix A erhalten.
\mathbf{A}=
\begin{pmatrix}
5.0 & 2.0 \\
2.0 & 7.0
\end{pmatrix}
In[3]: A=np.array([[5.0,2.0],[2.0,7.0]])
In[4]: U,D=func.Eigenvalue_decomp(A)
In[5]: print U.dot(D.dot(U.T)) #A=U*D*Berechne Ut
[[ 5. 2.]
[ 2. 7.]]
In[6]: print A.dot(A) #A*Berechnen Sie A.
[[ 29. 24.]
[ 24. 53.]]
In[7]: print U.dot(D.dot(D.dot(U.T))) #A*A=U*D*D*Berechne Ut
[[ 29. 24.]
[ 24. 53.]]
\mathbf{A}=
\begin{pmatrix}
1.0 & \sqrt{2.0} & 0 \\
\sqrt{2.0} & 1.0 & \sqrt{2.0} \\
0 & \sqrt{2.0} & 1.0
\end{pmatrix}
In[8]: A=np.array([[1.0,np.sqrt(2.0),0],[np.sqrt(2.0),1.0,np.sqrt(2.0)],[0,np.sqrt(2.0),1.0]])
In[9]: U,D=func.Eigenvalue_decomp(A)
In[10]: print U.dot(D.dot(U.T)) #A=U*D*Berechne Ut
[[ 1.00000000e+00 1.41421356e+00 -3.33066907e-16]
[ 1.41421356e+00 1.00000000e+00 1.41421356e+00]
[ -3.33066907e-16 1.41421356e+00 1.00000000e+00]]
In[11]: print A.dot(A) #A*Berechnen Sie A.
[[ 3. 2.82842712 2. ]
[ 2.82842712 5. 2.82842712]
[ 2. 2.82842712 3. ]]
In[12]: print U.dot(D.dot(D.dot(U.T))) #A*A=U*D*D*Berechne Ut
[[ 3. 2.82842712 2. ]
[ 2.82842712 5. 2.82842712]
[ 2. 2.82842712 3. ]]
\mathbf{A}=
\begin{pmatrix}
0 & -\sqrt{2.0} & \sqrt{2.0} \\
-\sqrt{2.0} & 1.0 & 1.0 \\
\sqrt{2.0} & 1.0 & 1.0
\end{pmatrix}
Wenn diese Matrix A analytisch gelöst wird, enthält der Eigenwert eine Mehrfachlösung (λ = 2).
In[13]: A=np.array([[0,-np.sqrt(2.0),np.sqrt(2.0)],[-np.sqrt(2.0),1.0,1.0],[np.sqrt(2.0),1.0,1.0]])
In[14]: U,D=func.Eigenvalue_decomp(A)
In[15]: print U.dot(D.dot(U.T)) #A=U*D*Berechne Ut
[[ -2.85835307e-16 -1.41421356e+00 1.41421356e+00]
[ -1.41421356e+00 1.00000000e+00 1.00000000e+00]
[ 1.41421356e+00 1.00000000e+00 1.00000000e+00]]
In[16]: print A.dot(A) #A*Berechnen Sie A.
[[ 4.00000000e+00 0.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 4.00000000e+00 -4.44089210e-16]
[ 0.00000000e+00 -4.44089210e-16 4.00000000e+00]]
In[17]: print U.dot(D.dot(D.dot(U.T))) #A*A=U*D*D*Berechne Ut
[[ 4.00000000e+00 3.16592776e-16 -5.71585644e-16]
[ 3.16592776e-16 4.00000000e+00 -4.44089210e-16]
[ -5.71585644e-16 -4.44089210e-16 4.00000000e+00]]
In jedem Fall scheinen U und D korrekt berechnet zu sein.
Ursprünglich [numpy.linalg.matrix_power](http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.linalg.matrix_power.html "numpy.linalg.matrix_power" in Python numpy Da es eine Funktion namens ") gibt, die die n-te Potenz einer Matrix berechnen kann, verwenden Sie die obige Funktion nicht zum Zweck der" Berechnung der n-ten Potenz einer symmetrischen Matrix ", sondern können die Eigenwertzerlegung einer symmetrischen Matrix verwenden. Ich denke, es ist sehr effektiv, wenn Sie es tun wollen.
Referenz-URL: http://mathtrain.jp/symmetriceigen http://ksmzn.hatenablog.com/entry/2014/02/16/004921 http://takegue.hatenablog.com/entry/2014/07/26/222141 http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.linalg.matrix_power.html
Recommended Posts