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

R 实三次多项式的最快数值解?,r,numerical-methods,R,Numerical Methods,R问题:寻找最快的方法来数值求解一组已知有实系数和三个实根的任意立方。据报道,R中的多根函数对复多项式使用Jenkins-Traub的算法419,但对于实多项式,作者参考了他们早期的工作。对于实数立方或更一般的实数多项式,什么是更快的选择 你需要全部三根还是一根?如果只有一个,我认为牛顿的方法可以。如果这三种方法都适用,那么在两种方法靠得很近的情况下可能会出现问题。常用的方法有:牛顿法、二分法、割线法、不动点迭代法等。谷歌搜索其中任何一种方法 另一方面,如果你有一个非线性系统(例如,在N个未知量

R问题:寻找最快的方法来数值求解一组已知有实系数和三个实根的任意立方。据报道,R中的多根函数对复多项式使用Jenkins-Traub的算法419,但对于实多项式,作者参考了他们早期的工作。对于实数立方或更一般的实数多项式,什么是更快的选择

你需要全部三根还是一根?如果只有一个,我认为牛顿的方法可以。如果这三种方法都适用,那么在两种方法靠得很近的情况下可能会出现问题。

常用的方法有:牛顿法、二分法、割线法、不动点迭代法等。谷歌搜索其中任何一种方法

另一方面,如果你有一个非线性系统(例如,在N个未知量中的N个多项式方程上的系统),可以使用这样一种方法。

已知的寻找N个变量中的任意多项式系统的实解的最快方法是多面体同伦。详细的解释可能超出了StackOverflow的答案,但本质上它是一种利用复曲面几何的每个方程的结构的路径算法。谷歌会给你


也许这个问题更适合于?

以可靠、稳定的方式多次这样做的数值解包括:(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
的系数是一,如果多项式中不是这样,则必须将整件事除以系数,然后继续

祝你好运


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

您是否尝试过查看GSL软件包?

充实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
>a m根1)求导数多项式p'来定位三个根。看看如何正确地做这件事。将这些根称为a和b(a
2) 对于中间根,在a和b之间使用几步平分,当你足够接近时,用牛顿方法完成

3) 对于最小和最大根,“搜索”解决方案。对于最大根目录:

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

通过“解一串”,你是在说几个独立的多项式,还是在试图解一个包含n个变量的多项式系统?数百个独立的立方体,一个接一个,就像用polyroot或householder的任何方法一样。只有一个。一个已知的位于(0,1)中。那么我投票支持牛顿的方法。从0.5开始猜测,将域限制在0和1之间,应该可以正常工作。它应该具有二次收敛性;出现问题的唯一原因是,如果函数的最小值或最大值在该范围内(导数=0),我有福格滕指出这是一个R问题。对不起,我认为这仍然是一个相关的答案,使用“eigen()”函数可以很容易地找到R中伴随矩阵的特征值。+1。GSL也这样做。Jenkins-Traub算法是直接求解多项式的最先进的算法,但它有时会遇到不稳定性(而且非常复杂),当仔细观察时,它看起来像是对伴随矩阵进行幂次迭代。。。您指出的这种方法是防弹的。在所有多项式求根算法中,伴随矩阵法可能是最慢的(尽管对于立方体,它应该仍然非常快)。詹金斯·特劳布的真实系数变量肯定更快。有一个开源的C++实现(BSD许可)的Jenkins Traub算法称为