15

我正在尝试找到一种方法来计算Java 中具有复系数的多项式的根(即相当于在MATLAB 中使用roots() 可以轻松完成的操作)。

我已经准备好重新编码一个根查找算法,该算法构建伴随矩阵,然后使用广义特征值分解来查找根,但为此我需要一个处理复值矩阵运算的库。

我浏览了一段时间,似乎没有任何令人信服的东西,我认为这很奇怪。那我想问你:

  1. 你知道一个(稳定的)Java 库,它对复杂系数定义的多项式执行求根吗?

  2. 你知道在复杂值矩阵上执行 evd、svd、inverse 等的(稳定的)Java 库吗?

注意:我已经看过 JAMA(不处理复杂)、Michael Thomas Flanagan 的 Java 科学库(不再可用)、colt(似乎不处理复杂)、高效 Java 矩阵库(也不复杂)、DDogleg Numerics (不处理具有复系数的多项式)、JScience(不清楚 evd 是否可用)和来自 Apache 的 common-math(不清楚它们是否允许复杂矩阵,如果是,是否 evd 可用)。

4

2 回答 2

3

Durand-Kerner 方法也适用于复系数并且不依赖于矩阵计算。

实现起来很简单,你可以用谷歌搜索一个实现(Stackoverflow 禁止我链接我找到的那个)或者自己做一个。您可以将jscience库用于复杂数据类型,而不是算法本身。

编辑:没看到你也需要 evd,别介意我提到 jscience 作为做复杂矩阵数学的一个选项。

于 2013-03-13T13:08:08.550 回答
1

如果想保持真实,请使用Bairstow method. 如果多项式有奇数次,首先使用Newton's method找到一个实根并将多项式减少到偶数次。这避免了 Bairstow 方法的奇点,它收敛到一个以无穷大为根的二次多项式。在通常的地方可以找到高质量的信息。其中一些是您真正编写或编辑的。

确定内根半径 r 并使用 z^2-2r*cos(phi)*z+r^2 和随机角度 phi 作为 Bairstow 方法的初始因子。它在每一步中产生一个二次因子,总是在实系数中并带有实系数,包含一对实根或复根的共轭对。

检查每个步骤的收敛速度,并在必要时从不同的初始点重新开始。紧缩后求新根,以原多项式和因式为起点,执行该方法,对根或二次因式进行润色。

于 2013-12-13T20:39:46.870 回答