【问题标题】:Exception calculating eigenvalues in numeric.js在 numeric.js 中计算特征值的异常
【发布时间】:2018-03-17 13:33:37
【问题描述】:

我在使用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)
}
<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>

有人遇到同样的问题吗?有什么解决方法的想法吗?

【问题讨论】:

  • 会不会和这个有关? github.com/sloisel/numeric/issues/50
  • 我完全不建议使用该库。看来作者已经死了,至少他忽略了自 2013 年以来的所有相关内容。
  • 至于解决方法,我使用了一个 6x6 矩阵,而不是全 1,它似乎工作正常。 [[1,2,5,1,2,5],[3,5,-1,3,5,-1],[7,-3,5,7,-3,5],[1,2,5,1,2,5],[3,5,-1,3,5,-1],[7,-3,5,7,-3,5]]。线性代数是很久以前的事了,如果这是一个无效的矩阵,我很抱歉。
  • 肯定与@callback 发布的问题有关 我现在不知道该怎么办,我需要另一个库来一致地计算特征值,看起来 JavaScript 没有什么。
  • 这对你有好处吗? mathjs.org/examples/import.js.html

标签: javascript eigenvalue


【解决方案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 ]
]

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

cmets 建议使用 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)可以解决舍入误差。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 2018-08-04
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多