Java中的复系数多项式根查找

我试图找到一种方法来计算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 可用)。


答案 1

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

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

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


答案 2

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

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

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


推荐