Apache Commons Math:三对角矩阵的特征分解产生错误的结果

Apache Commons Math: Eigendecomposition of a tridiagonal matrix yields wrong result

我试图找到特征值的对角矩阵 D 和矩阵 V,其列是三对角矩阵的相应右特征向量(其中 AV = VD)J。我试图在 java 中实现现有的 MATLAB 代码,但是我在 java 中得到的结果与在 MATLAB 中得到的结果不同(MATLAB 结果是正确的结果)。我已经在 MATALB 和 java 矩阵的 google 驱动器上创建了一个文件夹,因此您可以看到差异。

Variables

Java 代码段:

    RealMatrix J2 = new Array2DRowRealMatrix(j);
    EigenDecomposition eig = new EigenDecomposition(J2);
    RealMatrix V = eig.getV();
    RealMatrix D = eig.getD();

Apache Documentation

MATLAB代码:

[V,D]=eig(J);

MATLAB Documentation

这是每个变量的矩阵:

变量 J:

变量 V:

预计:

实际:

变量 D:

预计:

实际:

在这种情况下,您不能说一个结果是正确的,一个是错误的,因为 Apache Commons Math 和 MATLAB 的结果实际上是等价的。请记住:

  1. 在这两种情况下,您都可以打印具有特定精度的结果。如果您将 0.5045259791 截断为 5 个十进制数字,您将得到 0.50452。同样的结果。
  2. 您可以将特征向量与任何标量相乘,包括 -1,结果也将是一个特征向量。那是因为特征向量集是 线性子空间 并且 在标量乘法 read on Wikipedia 下是封闭的。请注意,第一个实际特征向量是最后一个预期乘以 -1
  3. 特征分解的不同实现对结果中特征值的排序使用不同的约定。实际的 D 似乎与预期的顺序相反。
  4. machine epsilon 由于浮点运算中的舍入导致的相对误差的上限 对于 双精度 浮动点数是 2.22e-16。对于接近机器 epsilon 的数字,您可以看到实际结果和预期结果之间看似巨大的差异。对于 2 种不同的特征分解实现,这是可以预期的。