真三次多项式的最快数值解?

时间:2010-01-05 00:59:56

标签: r numerical-methods

R问题:寻找最快的方法来数值地解决一堆已知具有真实系数和三个真实根的任意立方体。据报道,R中的多根函数使用Jenkins-Traub的算法419用于复数多项式,但对于实数多项式,作者参考了他们早期的工作。对于真实的多项式,或者更普遍的真实多项式,有哪些更快的选项?

7 个答案:

答案 0 :(得分:6)

以可靠,稳定的方式多次这样做的数值解包括:(1)形成伴随矩阵,(2)找到伴随矩阵的特征值。

您可能认为这是一个比原始问题更难解决的问题,但这就是大多数生产代码(例如,Matlab)中解决方案的实现方式。

对于多项式:

p(t) = c0 + c1 * t + c2 * t^2 + t^3

伴随矩阵是:

[[0 0 -c0],[1 0 -c1],[0 1 -c2]]

找出这种矩阵的特征值;它们对应于原始多项式的根。

为了快速完成这项工作,请从LAPACK下载奇异值子程序,编译它们,并将它们链接到您的代码。如果您有太多(例如,大约一百万)个系数集,请同时执行此操作。

请注意,t^3的系数是1,如果在多项式中不是这种情况,则必须将整个系数除以系数,然后继续。

祝你好运。

编辑:Numpy和octave也依赖于这种方法来计算多项式的根。例如,请参阅this link

答案 1 :(得分:4)

最快的已知方式(我知道)在 n 变量中找到任意多项式系统的真实解是多面体同伦。详细解释可能超出了StackOverflow的答案,但实质上它是一种路径算法,它使用复曲面几何结构利用每个方程的结构。 Google会给你a number of papers

也许这个问题更适合mathoverflow

答案 2 :(得分:2)

充实Arietta的答案:

> a <- c(1,3,-4)
> m <- matrix(c(0,0,-a[1],1,0,-a[2],0,1,-a[3]), byrow=T, nrow=3)
> roots <- eigen(m, symm=F, only.values=T)$values

这比使用GSL包中的三次解算器更快还是更慢(如上面的knguyen所建议的)是在系统上对其进行基准测试的问题。

答案 3 :(得分:1)

你需要所有3根还是只需要一根?如果只有一个,我会认为牛顿的方法可行。如果全部3,那么在两个相近的情况下可能会出现问题。

答案 4 :(得分:1)

1)求解导数多项式P'来定位你的三个根。请参阅there以了解如何正确执行此操作。称那些根a和b(用&lt; b)

2)对于中间根,在a和b之间使用几个二分步,当你足够接近时,用牛顿方法完成。

3)对于最小和最大根,“寻找”解决方案。对于最大根:

  • 从x0 = b开始,x1 = b +(b - a)* lambda,其中lambda是中等数字(比如1.6)
  • do x_n = b +(x_ {n - 1} - a)* lambda直到P(x_n)和P(b)有不同的符号
  • 在x_ {n - 1}和x_n
  • 之间执行二分+牛顿

答案 5 :(得分:0)

常用的方法有:牛顿方法,二分法,正割,定点迭代等。谷歌中的任何一个。

另一方面,如果你有一个非线性系统(例如N个未知数的N多项式方程中的系统),可以使用high-order Newton之类的方法。

答案 6 :(得分:0)