Java中的复系数多项式根发现

时间:2013-03-13 12:51:15

标签: java matrix polynomial-math complex-numbers

我正试图找到一种方法来计算Java中具有复系数的多项式的根(即,相当于在MATLAB中用根()轻松完成的事情。)

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

我浏览了一段时间,似乎没有任何令人信服的可用性,我觉得这很奇怪。然后,我想问你:

  1. 您是否知道(稳定的)Java库在COMPLEX系数定义的多项式上执行根查找?

  2. 您是否知道在COMPLEX值矩阵上执行evd,svd,inverse等的(稳定)Java库?

  3. 注意:我已经看过JAMA(不处理复杂的),Michael Thomas Flanagan的Java Scientific Library(不再可用),colt(似乎没有处理复杂的),高效的Java Matrix Library(也不复杂),DDogleg Numerics(不处理具有复系数的多项式),JScience(不清楚evd是否可用)和Apache的通用数学(不清楚它们是否允许复杂矩阵,如果是,则如果是,如果是evd可用)。

2 个答案:

答案 0 :(得分:3)

Durand-Kerner method也适用于复系数,不依赖于矩阵计算。

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

编辑:没有看到你也需要evd,更不用说我提到jscience作为复杂矩阵数学的一个选项。

答案 1 :(得分:1)

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

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

检查每个步骤的收敛速度,并在必要时使用不同的初始点重新启动。在通货紧缩之后寻找新根,并通过使用原始多项式和因子作为起点执行方法来修正根或二次因子。