簡體   English   中英

scipy.sparse.linalg.eigsh 返回相同矩陣的不同特征值

[英]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_equalkllrh_matrixkllrh_matrix_reloaded是相等的,但它們的dtype不同( float32float64 )。

如果你這樣做

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM