首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scipy.sparse.linalg.eigsh为同一个矩阵返回不同的特征值

scipy.sparse.linalg.eigsh为同一个矩阵返回不同的特征值
EN

Stack Overflow用户
提问于 2022-05-11 15:50:32
回答 1查看 128关注 0票数 1

问题摘要

我要计算矩阵的最小特征值(代数值)。矩阵来自我使用op4库读取的一个pyNastran文件。在这些指示之后,我尝试使用scipy.sparse.linalg.eigsh函数和移位-反转模式计算最小的eigevanlue .为了验证计算的正确性,将eigsh的计算结果与numpy.linalg.eigvals的计算结果进行了比较。我观察到的非常令人费解:如果我简单地将eigsh应用于矩阵,计算出的特征值是错误的,如果我将矩阵保存到csv文件中,然后将它加载回numpy数组,则特征值是正确的。更令人费解的是,当我比较这两个矩阵时,numpy.array_equal返回Trueeigsh如何为同一个矩阵返回两个不同的结果?

代码

代码语言:javascript
复制
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)

这将返回以下内容:

代码语言:javascript
复制
-0.0028387385
[0.05363945]
[-0.00283876]
True
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
6502976000.0

请找到kllrh.op4文件这里

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-10 14:53:00

虽然np.array_equalkllrh_matrixkllrh_matrix_reloaded是相等的,但它们是不同的dtypes (float32 vs float64)。

如果你这样做了

代码语言:javascript
复制
kllrh_matrix = op4[matrix_name][1][-1].astype('float64')

一切都是正确的:

代码语言:javascript
复制
-0.0028387384680708
[-0.00283876]
[-0.00283876]
True
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
6502976138.583383

作为一种更好的选择,您可以在读取precision文件时指定op4:

代码语言:javascript
复制
op4 = read_op4('kllrh.op4', precision='double')

这会给你一些其他的结果:

代码语言:javascript
复制
0.004395871268066287
[0.00439589]
[0.00439589]
True
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
6502976180.582107

默认的精度来自于op4文件:在示例中,矩阵类型是1 (文件第一行上的第四个数字),结果在单精度(float32)中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72204051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档