在Java中进行复系数多项式根查找

15

我正在尝试找到一种在Java中计算具有复系数的多项式根的方法(即与MATLAB中的roots()函数相当简单的等价物)。

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

我浏览了一段时间,但似乎没有什么令人信服的选择可用,我觉得这相当奇怪。所以,我想问你:

  1. 你知道一个(稳定的)Java库,可以对由复系数定义的多项式进行根查找吗?

  2. 你知道一个(稳定的)Java库,可以对复值矩阵进行evd、svd、inverse等操作吗?

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

2个回答

3

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

它非常简单易用,你可以在Google上找到一个实现(Stackoverflow禁止我链接我找到的那个),或者自己编写一个。你可以使用jscience库进行复杂数字类型的操作,但不能用于算法本身。

编辑:没看到您还需要evd,忽略我提到jscience作为进行复杂矩阵运算的选项。


非常感谢!这个方法确实很容易实现,我得到了很好的结果 - 问题解决了。 - Virginie

1
如果想要保持真实性,请使用Bairstow方法。如果多项式次数为奇数,则先使用Newton方法找到一个实根并将多项式降至偶次。这避免了Bairstow方法收敛于具有无限大根的二次多项式的奇异性。可以在通常的地方找到高质量的信息,其中一些是由本人撰写或编辑的。
确定内部根半径r,并使用带有随机角度phi的z^2-2r*cos(phi)*z+r^2作为Bairstow方法的初始因子。它每步产生一个二次因子,始终具有实系数,包含一对实根或一对共轭复根。
每步检查收敛速度,必要时使用不同的初始点重新开始。在除去根后找到新的根,并通过使用原始多项式和因子作为起点执行该方法来优化根或二次因子。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接