2017-06-05 124 views
1

因此,我使用Eigen for C++代码块来计算矩阵的特征值。与此交易的代码的特定部分如下: -用于C++计算错误特征值的Eigen

EigenSolver<MatrixXd> b(B,false); 
cout<<" Eigen values are: \n "<<b.eigenvalues()<<"\n"; 

我已经遇到的问题是是,我的矩阵B计算的特征值之一是无处接近实际的特征值,我发现上calculator.vhex.net。

例如,对于基体

1 0 0 X

0 1×0

0 X 1 Y

X 0 Y 1

其中x = -1/sqrt(2)和y = -0.5,特征值是0,0.5,1.5和2.

然而,我的代码计算它们是-4.25e-016,0.5%,1.5和2

我还试图将本设置用于应该有一个特征值4E-06的5×5矩阵,但计算出的码它为1.4413e-017。

这可能是什么原因?他们是否近似? 我的猜测是内存问题,并且2的平方根的双类型值不会完全等于2的平方根,但我不确定这一点。

对此有什么可能的解决办法?

+3

请发表[mcve]以显示您的确切代码。另外,使用调试器来遍历代码,看看它在做什么。请注意,所有浮点值都是实数的近似值。您还应该了解浮点表示的固有限制。 –

+0

如果你了解一些数值线性代数理论,它也会有所帮助。 –

+4

“无处不在” - 4.25e-016从很多角度来看非常接近于0 :) –

回答

5

当矩阵接近奇异时,寻找特征值可能很困难,用0特征值表示。你不应该期望数值解的一个确切的特征值为0,因为它只能达到某个数值近似,而这个近似在该点附近开始失效。

0

此外什么@drglove说,对于对称的(或自伴)的特征值问题,你应该使用SelfAdjointEigenSolver

SelfAdjointEigenSolver<MatrixXd> b(B,EigenvaluesOnly); 

这给了当然还是只有一个数值解,所以你仍然会得到一个解决方案精度有限。