[英]scipy.sparse.linalg.eigsh returns different eigenvalues for the same matrix
我想計算矩陣的最小特征值(代數值)。 該矩陣來自我使用pyNastran庫讀取的 op4 文件。 按照這些說明,我正在嘗試使用具有移位反轉模式的scipy.sparse.linalg.eigsh
函數來計算最小的 eigevanlue。 為了檢查計算是否正確,我將 eigsh 的結果與eigsh
的結果進行numpy.linalg.eigvals
。 我觀察到的情況非常令人費解:如果我只是將eigsh
應用於矩陣,則計算出的特征值是錯誤的,如果我將矩陣保存到 csv 文件然后將其加載回numpy
數組中,則特征值是正確的。 更令人費解的是,當我比較兩個矩陣時, numpy.array_equal
返回True
。 eigsh
怎么可能為同一個矩陣返回兩個不同的結果?
from pyNastran.op4.op4 import read_op4
from scipy.sparse.linalg import eigsh
import numpy as np
op4 = read_op4('kllrh.op4')
matrix_name = 'KLLRH'
kllrh_matrix = op4[matrix_name][1][-1]
reference_max_eigenvalue = np.max(np.linalg.eigvals(kllrh_matrix))
reference_min_eigenvalue = np.min(np.linalg.eigvals(kllrh_matrix))
eigsh_min_eigenvalue = eigsh(kllrh_matrix, 1, sigma=0, which='LM', return_eigenvectors=False)
np.savetxt('kllrh.csv', kllrh_matrix, delimiter=',')
kllrh_matrix_reloaded = np.loadtxt('kllrh.csv', delimiter=",")
reloaded_eigsh_min_eigenvalue = eigsh(kllrh_matrix_reloaded, 1, sigma=0, which='LM', return_eigenvectors=False)
print(reference_min_eigenvalue)
print(eigsh_min_eigenvalue)
print(reloaded_eigsh_min_eigenvalue)
print(np.array_equal(kllrh_matrix, kllrh_matrix_reloaded))
print(type(kllrh_matrix))
print(type(kllrh_matrix_reloaded))
print(reference_max_eigenvalue)
這將返回以下內容:
-0.0028387385
[0.05363945]
[-0.00283876]
True
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
6502976000.0
請在此處找到kllrh.op4
文件。
盡管np.array_equal
說kllrh_matrix
和kllrh_matrix_reloaded
是相等的,但它們的dtype
不同( float32
與float64
)。
如果你這樣做
kllrh_matrix = op4[matrix_name][1][-1].astype('float64')
一切都是正確的:
-0.0028387384680708
[-0.00283876]
[-0.00283876]
True
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
6502976138.583383
作為更好的選擇,您可以在讀取 op4 文件時指定precision
:
op4 = read_op4('kllrh.op4', precision='double')
這會給你一些其他的結果:
0.004395871268066287
[0.00439589]
[0.00439589]
True
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
6502976180.582107
默認精度來自 op4 文件:在示例中,矩陣類型為1
(文件第一行的第四個數字),這導致單精度( float32
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.