MATLAB:
m1 = [ 333.33333333 83.33333333 0. ; 83.33333333 333.33333333 83.33333333 ; 0. 3.33333333 166.66666667]
k1 = [ 800. -400. 0.; -400. 800. -400.; 0. -400. 400.]
[vec, val] = eig(m1, k1)
vec =
-0.0106 -0.0289 0.0394
0.0183 -0.0000 0.0683
-0.0211 0.0289 0.0789
Python:
import scipy
import numpy as np
m1 = np.array[[333.33333333, 83.33333333, 0.], [ 83.33333333, 333.33333333, 83.33333333], [0., 83.33333333, 166.66666667]]
k1 = np.array[[800., -400., 0.], [-400., 800., -400.], [0., -400., 400.]]
val, vec = scipy.linalg.eig(m1, k1)
vec =
[[ 3.53553391e-01, -7.07106781e-01, 3.53553391e-01],
[ 6.12372436e-01, 1.88119544e-16, -6.12372436e-01],
[ 7.07106781e-01, 7.07106781e-01, 7.07106781e-01]]
所以 matlab 和 python 特征向量vec不匹配。Matlab檔案說
[V,D] = eig(A,B) 回傳廣義特征值的對角矩陣 D 和全矩陣 V,其列是相應的右特征向量,因此
A*V = B*V*D。
并且m1 * vec = k1 * vec * val滿足 matlab 輸出但不滿足 python 輸出。如何使用 python、numpy 獲得與 matlab 給出的相似的特征向量?
uj5u.com熱心網友回復:
特征向量不是唯一的;如果x是特征向量,則a * x對于任何非零標量 仍然是特征向量a。
看python和matlab的兩個結果;vecfrom matlab的第一列看起來像是vecfrom python的第三列的縮放版本。matlab 中的第二列似乎是 python 中第二列的縮放版本(召回率1.88119544e-16幾乎為零)。第三列對應于第一列。所以我的猜測是valfrom matlab 是valfrom python的反向版??本;我無法驗證這一點,因為我現在沒有 matlab,但您可以驗證這一點。
同樣在python中,記住*是元素乘法(即.*在matlab中)。您可以@用于矩陣乘法。
import scipy.linalg
import numpy as np
m1 = np.array([[333.33333333, 83.33333333, 0.], [ 83.33333333, 333.33333333, 83.33333333], [0., 83.33333333, 166.66666667]])
k1 = np.array([[800., -400., 0.], [-400., 800., -400.], [0., -400., 400.]])
val, vec = scipy.linalg.eig(m1, k1)
print(m1 @ vec)
print(k1 @ vec * val)
正如您在以下輸出中看到的,我們有相同的輸出(虛部是0.j,因此您可以忽略它)。
輸出:
[[ 1.68882167e 02 -2.35702260e 02 6.68200939e 01]
[ 2.92512493e 02 -3.14270210e-09 -1.15735798e 02]
[ 1.68882167e 02 1.17851130e 02 6.68200939e 01]]
[[ 1.68882167e 02 0.j -2.35702260e 02 0.j 6.68200939e 01 0.j]
[ 2.92512493e 02 0.j -3.14263578e-09 0.j -1.15735798e 02 0.j]
[ 1.68882167e 02 0.j 1.17851130e 02 0.j 6.68200939e 01 0.j]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/317015.html
上一篇:TensorflowTypeError:無法將1e-12轉換為dtypeint32的EagerTensor
下一篇:通過numpy陣列索引和
