【问题标题】:Apache commons math PolynomialSolver: how to get all roots?Apache commons math PolynomialSolver:如何获得所有根?
【发布时间】:2013-01-30 10:34:53
【问题描述】:

您好,尝试使用 commons-math 的 PolynomialSolver 类的基本问题。

根据此处http://commons.apache.org/math/userguide/analysis.html 的文档以及API,求解方法通常采用以下形式

double c = solver.solve(100, function, 1.0, 5.0, AllowedSolution.LEFT_SIDE);

我显然遗漏了一些东西,但考虑到代数的基本定理是 n 次多项式有 n 个根,我如何获得所有根?

根求解器返回一个双精度有什么好处?

我在这个线程Finding roots of polynomial in Java 中注意到解决方案中提供的方法返回一个复杂的数组。这是我所期望的,所以有人可以解释一下为什么公共数学多项式求解器返回一个双根吗?

【问题讨论】:

  • 我看到在 3.1 中为 LaguerreSolver 添加了 SolveAllComplex 选项。我仍然很想知道大多数方法只解决一个双倍是否正确,以及为什么。

标签: java polynomial-math apache-commons-math


【解决方案1】:

这些数值算法中的大多数都在泛型函数(即不一定是多项式)上运行,并且很少对它们做出假设。如果我们不知道给定函数的确切性质是什么,我们甚至不能指望推断它可能有多少根。

那里的一些算法做了额外的假设,即给定的函数是可微的。这使它们更快,但需要您提供一些额外的信息,例如派生值,因此您不能再将它们用于任何功能。

LaguerreSolver 额外假设给定函数是多项式。在这种情况下是否可以找到所有根,因此可以使用 solveAllComplex() 方法。但它是唯一专门研究多项式的算法。所有其他算法都更加通用。

【讨论】:

  • 非常感谢。到目前为止,对 Laguerre 的测试,solveAll 要么挂起,要么花费了很长时间,而对一个解决方案的求解每次都产生几乎相同的值,有些变化低于小数点后 6 位左右。只是想知道您是否能想到一个明显的原因为什么会这样做?
  • 我想变化来自数值不稳定性。要使用单一解决方案方法找到其他根,您必须首先为每个根猜测足够窄的间隔,然后才针对这些间隔运行solve()。如果 commons-math 运行太慢,也许你可能会寻找另一个库:code.google.com/p/efficient-java-matrix-library/wiki/…ee.ucl.ac.uk/~mflanaga/java/Polynomial.html
猜你喜欢
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 2013-02-24
  • 1970-01-01
  • 2014-05-01
  • 2014-08-06
相关资源
最近更新 更多