gpt4 book ai didi

python - numpy.linalg.eig() 和 scipy.linalg.eig() 中的舍入误差

转载 作者:太空宇宙 更新时间:2023-11-04 02:41:12 25 4
gpt4 key购买 nike

有没有办法提高numpy.linalg.eig()scipy.linalg.eig()的输出精度?

我正在对角化一个非对称矩阵,但我希望在物理基础上得到正负特征值对的实谱。事实上,特征值确实成对出现,我已经通过独立的分析计算验证了其中两对是正确的。有问题的一对是特征值接近于零的一对,它似乎有很小的虚部。我希望这对在零处退化,因此虚部最多可以达到机器精度,但它们要大得多。我认为这会导致特征向量出现小错误,但会在后续操作中传播。

下面的示例通过检查转换的有效性表明存在虚构的剩余部分。

import numpy as np 
import scipy.linalg as sla

H = np.array(
[[ 11.52, -1., -1., 9.52, 0., 0. ],
[ -1., 11.52, -1., 0., 9.52, 0., ],
[ -1., -1., 11.52, 0., 0., 9.52,],
[ -9.52, 0., 0., -11.52, 1., 1., ],
[ 0., -9.52, 0., 1., -11.52, 1., ],
[ 0., 0., -9.52, 1., 1., -11.52 ]],
dtype=np.float64
)

#print(H)
E,V = np.linalg.eig(H)
#E,V = sla.eig(H)
H2=reduce(np.dot,[V,np.diag(E),np.linalg.inv(V)])
#print(H2)
print(np.linalg.norm(H-H2))

给出

3.93435308362e-09

零特征值虚部的阶数。

最佳答案

在计算上述误差时采用逆运算可能会损失一些精度。相反,如果您计算:

 # H = V.E.inv(V) <=> H.V = V.E
print(np.linalg.norm(H.dot(V)-V.dot(np.diag(E))))
# error: 2.81034671113e-14

误差小很多。

您的问题也可能是病态的,这意味着对舍入和其他错误的数值敏感性非常高。 Bauer-Fike Theorem给出特征值问题的误差敏感性上限。

根据这个定理,在最坏的情况下,输入域中机器精度的错误可能会传播到特征值中 1e-8 的错误,因为:

machine_precison = np.finfo(np.float64).eps
print(np.linalg.cond(V)*(machine_precison))
# 4.54517272701e-08

关于python - numpy.linalg.eig() 和 scipy.linalg.eig() 中的舍入误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46459141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com