【问题标题】:Complex-coefficient polynomial root finding in JavaJava中的复系数多项式求根
【发布时间】:2013-03-01 10:05:30
【问题描述】:

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

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

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

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

  2. 您知道在 COMPLEX 值矩阵上执行 evd、svd、逆等操作的(稳定的)Java 库吗?

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

【问题讨论】:

    标签: java matrix polynomial-math complex-numbers


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢!这种方法确实很容易实现,而且我得到了这样的好结果 - 问题解决了。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 1970-01-01
      相关资源
      最近更新 更多