在求解奇异矩阵的本征问题时,我面临SciPy的非常奇怪的行为,即,如果我通过某些函数(以下代码中的矩阵UNSIGNED
)生成矩阵,则计算出的本征值不正确。但是,如果我在(der
)中手动键入矩阵,则对角线化似乎会产生正确的结果。也可以通过减去两个矩阵来检查,这在下面的代码中完成。
代码是
der2
,结果是:
矩阵import numpy as np
import scipy as sp
from scipy.linalg import eigvals
def cbar(k, n):
"""
cbar function for coefficients
"""
if k==0 or k==n-1:
return np.float128(2.)
else:
return np.float128(1.)
def ChebCollDer(x):
"""
ChebCollDer Chebyshev collocation differentiation matrix.
"""
xx=np.array(x)
n=xx.size
d=np.zeros((n,n))
for i in range(n):
for k in range(n):
if i!=k:
d[i,k]=cbar(i, n)*np.float128(sp.power(-1., i+k))/(xx[i]-xx[k])/cbar(k,n)
for i in range(n):
tmp=-sp.sum(d[i,:])
d[i,i]=tmp
return d
nn=5
xx=(np.cos(sp.pi*np.linspace(0,1.0,nn)))/2.
der=ChebCollDer(xx)
print eigvals(der)
der2=[[ 11.0 ,-13.656854, 4.0 ,-2.3431458 , 1.0],
[ 3.4142136, -1.4142136, -2.8284271, 1.4142136, -0.58578644],
[-1.0, 2.8284271, 1.110223e-16, -2.8284271, 1.0]
,[0.58578644, -1.4142136, 2.8284271, 1.4142136, -3.4142136],
[-1.0,2.3431458,-4.0 ,13.656854,-11.0]]
print eigvals(der2)
print der-der2
的特征值:
der
[ 0.00389434+0.00282825j 0.00389434-0.00282825j -0.00148641+0.00457958j -0.00148641-0.00457958j -0.00481586+0.j ]
的特征值:
der2
看到[ 9.71161644e-02+0.j -9.71161490e-02+0.j -3.08158279e-08+0.j 7.69629619e-09+0.09711159j 7.69629619e-09-0.09711159j]
的一个特征值在数值上为零,这是因为矩阵der2
的空特征向量为der
[1,1,1,1,1]
的最大元素为10E-08。
我怀疑存在一些类型转换问题,但不知道它来自哪里。
答案 0 :(得分:1)
这不是一个完整的答案,但我没有足够的声誉来发表评论。
由于我认为这是一个数值分析问题,因此您可能会在数学页面上发布更多的运气。
如果我做s,v = sp.linalg.eig(der)
,那么所有u
似乎都满足eignevalue方程,即der@u - s*u
接近于零。
另一个有趣的事情是der
的特征值都具有相等的模数,并且具有围绕此半径的圆等距分布的参数。像-1的第5个根一样。
实际上,如果对scipy输出的特征向量进行均等加权的线性组合(即,将v
右乘以全1向量),则您将接近对应于零特征值的常数向量。
也就是说,我不太确定发生了什么事。
此外,函数ChebCollDer
将输出float
而不是float128
的规则ndarray,因为您没有在float128
对其进行初始化。这意味着,即使您在float128
中进行了一些计算,它们也会被强制转换为默认的scipy浮点数,然后再存储在d
中。