Scipy错误地解决了矩阵的本征问题

时间:2018-11-15 14:47:09

标签: python matrix scipy linear-algebra

在求解奇异矩阵的本征问题时,我面临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。 我怀疑存在一些类型转换问题,但不知道它来自哪里。

1 个答案:

答案 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中。