使用 eig 的复杂特征值(Matlab)

计算科学 matlab 特征值 复数
2021-12-11 17:32:58

我想找到并绘制大的特征值(大约1000×1000) 矩阵。但是在matlab中使用该eig函数时发现,它不应该给出复杂的特征值。例如,在下面的代码中,我有一个Tridiagonal Toeplitz 矩阵,它应该具有所有实特征值。

但它似乎eig是不稳定的,n=90并在一些特征值中返回一个小的复杂错误。有没有办法更准确地获得特征值?

clear parameters
close all
clc
n=90;
dd=-2.*ones(n,1);
ud=1.8*ones(n,1);
ld=.1*ones(n,1);
A = spdiags([ld dd ud],-1:1,n,n);
C=full(A);
g=eig(C);
g=sort(g);
cond(C)
plot(g,'.')
2个回答

你有一个病态的特征值问题。考虑扰动δA在你的矩阵中A— 使用双精度浮点数O(1016). 它将特征分解从

X1AX=Λ
进入(大约保持X固定的)
X1(A+δA)X=Λ+δΛ.
这意味着特征值的变化受限于
δΛX1XδA=κ(X)δA,

其中是条件数。κ

假设中的扰动在机器 epsilon 的量级上,大约是量级的错误这不是 的数值方法中的不稳定性,而是您的数学问题的一个属性。例如,如果是对称的,则不会出现此问题,在这种情况下A1016κ(X)×1016eigAκ(X)=1

在你的情况下,我计算条件数具有额外的精度未能收敛),并且已经是,这对于普通来说太大了双精度浮点运算。κ2(X)n=64n=904.09×1039

如果你真的需要解决这种病态特征值问题,最简单的方法可能是使用足够的额外精度来保持小,所以你需要大约 60 位和更大的κ(X)ϵmachn=64n

如果上对角线和下对角线具有相同的符号,就像在您的示例中一样,您可以将矩阵缩放为对称。将矩阵替换为,并使用,选择使其对称。(我相信它会将转换为,但我太懒了去检查。)CDCD1D=diag(1,d,d2,,dn1)dtridiag(a,b,c)tridiag(c/a,b,c/a)

然后,Matlab 将使用算法来解决对称特征问题,这些算法更快、更准确,并且总是返回真实的特征值。