计算numeric.js中特征值的异常

时间:2018-03-17 13:33:37

标签: javascript eigenvalue

我在使用numeric.js库的 eig 方法时面临一个奇怪的问题,该方法用于计算方阵的特征值。如果矩阵的大小是4或5,则该方法计算特征值没有任何问题,当大小为6时,我得到

Uncaught Error: eig: internal error
  at Function.numeric.house (VM145 numeric.min.js:1)
  at Function.numeric.QRFrancis (VM145 numeric.min.js:1)
  at Function.numeric.QRFrancis (VM145 numeric.min.js:1)
  at Function.numeric.eig (VM145 numeric.min.js:1)
  at js:32

我创建了一个小脚本,使用不同大小的方矩阵复制问题。



ns = [4,5,6]

for (var h=0; h<ns.length; h++){
  matr = []
  n = ns[h]
  for (var i=0; i<n; i++){
    row = []
    for (var j=0; j<n; j++){
      row.push(1)
    }
    matr.push(row)
  }
  
  eigenvalues = numeric.eig(matr)
  console.log(eigenvalues.lambda.x)
}
&#13;
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/numeric/1.2.6/numeric.min.js"></script>
</head>

<body>
Nothing to see here, look at your console.
</body>
&#13;
&#13;
&#13;

有人面临同样的问题吗?有任何解决方法吗?

1 个答案:

答案 0 :(得分:1)

我在 numeric.js 库中遇到了同样的问题。它可以解决这样的适定矩阵:

numeric.eig([[1, 0.5],[0, -1.4]]);

给出结果:

 x: [ -1.4000000000000004, 1.0000000000000002 ]

然而,numeric.js 无法解决这个问题的特征值 -

matrix = 
[
  [ 0, 1, 0, 1, 0, 1 ],
  [ 0, 0, 0, 0, 0, 0 ],
  [ 0, 1, 0, 1, 0, 1 ],
  [ 0, 0, 0, 0, 0, 0 ],
  [ 0, 0, 0, 0, 0, 0 ],
  [ 1, 0, 1, 0, 0, 0 ]
]

我尝试了许多类似的二进制/稀疏矩阵,但遇到了内部错误,例如您的问题。

评论建议了替代方案,例如 mathjs 库。在找到更强大的选项之前,我尝试了这个和其他几个库但没有成功。

  1. mathjs - 仅限于对称实矩阵的特征值分解。
  2. sylvester-es6 - 返回我尝试过的大多数二元矩阵的 NaN 特征值向量。
  3. eigen - 糟糕的文档,从未想出如何实例化 Solver 对象。
  4. jamaJS - 理论上可行,但需要几个外部依赖项,例如 Java 8 JDK 和 Maven。
  5. CindyJS - 在 NPM 上不可用
  6. LALOlib - 在 NPM 上不可用
  7. 线性代数不包括特征值分解
  8. linear-algebra-js 不包括特征值分解

一个令人沮丧的下午。幸运的是,我最终在 Reddit 线程中浏览了这个库:

https://www.npmjs.com/package/ml-matrix

这个库终于解决了我的问题:

const mlMatrix = require('ml-matrix');
const M = new mlMatrix.Matrix(matrix);
const e = new mlMatrix.EigenvalueDecomposition(M);

e.realEigenvalues -> [-1.4142135623730945, 2.220446049250313e-16, 1.4142135623730954, 0, 0, 0 ]
e.imaginaryEigenvalues -> [ 0, 0, 0, 0, 0, 0 ]

设置合理的零容忍度(例如 1e-10)可以解决舍入误差。