Java 中的复系数多项式求根

问题描述 投票:0回答:2

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

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

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

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

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

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

java matrix complex-numbers polynomial-math root-finding
2个回答
3
投票

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

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

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


1
投票

如果想保持真实,请使用

Bairstow method
。如果多项式的次数为奇数,请先使用
Newton's method
求实根并将多项式约化为偶数。这避免了贝尔斯托方法的奇点,即它收敛到以无穷大为根的二次多项式。高质量的信息可以在通常的地方找到。其中一些确实是您自己编写或编辑的。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.