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 驱动器上创建了一个文件夹,因此您可以看到差异。
Java 代码段:
RealMatrix J2 = new Array2DRowRealMatrix(j);
EigenDecomposition eig = new EigenDecomposition(J2);
RealMatrix V = eig.getV();
RealMatrix D = eig.getD();
MATLAB代码:
[V,D]=eig(J);
这是每个变量的矩阵:
变量 J:
变量 V:
预计:
实际:
变量 D:
预计:
实际:
在这种情况下,您不能说一个结果是正确的,一个是错误的,因为 Apache Commons Math 和 MATLAB 的结果实际上是等价的。请记住:
- 在这两种情况下,您都可以打印具有特定精度的结果。如果您将
0.5045259791
截断为 5 个十进制数字,您将得到 0.50452
。同样的结果。
- 您可以将特征向量与任何标量相乘,包括
-1
,结果也将是一个特征向量。那是因为特征向量集是 线性子空间 并且 在标量乘法 read on Wikipedia 下是封闭的。请注意,第一个实际特征向量是最后一个预期乘以 -1
- 特征分解的不同实现对结果中特征值的排序使用不同的约定。实际的
D
似乎与预期的顺序相反。
- machine epsilon 即 由于浮点运算中的舍入导致的相对误差的上限 对于 双精度 浮动点数是
2.22e-16
。对于接近机器 epsilon 的数字,您可以看到实际结果和预期结果之间看似巨大的差异。对于 2 种不同的特征分解实现,这是可以预期的。
我试图找到特征值的对角矩阵 D 和矩阵 V,其列是三对角矩阵的相应右特征向量(其中 AV = VD)J。我试图在 java 中实现现有的 MATLAB 代码,但是我在 java 中得到的结果与在 MATLAB 中得到的结果不同(MATLAB 结果是正确的结果)。我已经在 MATALB 和 java 矩阵的 google 驱动器上创建了一个文件夹,因此您可以看到差异。
Java 代码段:
RealMatrix J2 = new Array2DRowRealMatrix(j);
EigenDecomposition eig = new EigenDecomposition(J2);
RealMatrix V = eig.getV();
RealMatrix D = eig.getD();
MATLAB代码:
[V,D]=eig(J);
这是每个变量的矩阵:
变量 J:
变量 V:
预计:
实际:
变量 D:
预计:
实际:
在这种情况下,您不能说一个结果是正确的,一个是错误的,因为 Apache Commons Math 和 MATLAB 的结果实际上是等价的。请记住:
- 在这两种情况下,您都可以打印具有特定精度的结果。如果您将
0.5045259791
截断为 5 个十进制数字,您将得到0.50452
。同样的结果。 - 您可以将特征向量与任何标量相乘,包括
-1
,结果也将是一个特征向量。那是因为特征向量集是 线性子空间 并且 在标量乘法 read on Wikipedia 下是封闭的。请注意,第一个实际特征向量是最后一个预期乘以-1
- 特征分解的不同实现对结果中特征值的排序使用不同的约定。实际的
D
似乎与预期的顺序相反。 - machine epsilon 即 由于浮点运算中的舍入导致的相对误差的上限 对于 双精度 浮动点数是
2.22e-16
。对于接近机器 epsilon 的数字,您可以看到实际结果和预期结果之间看似巨大的差异。对于 2 种不同的特征分解实现,这是可以预期的。