cub*_*ube 7 c math polynomial-math numerical-methods
这对我来说似乎是一个显而易见的问题,但我无法在任何地方找到它.我有一个三次多项式,我需要找到函数的真正根源.什么是的这样做的方法是什么?
我找到了几个关于立方函数根的封闭形式公式,但它们都使用复数或大量的测角函数而我不喜欢它们(并且也不知道选择哪一个).
我需要简单的东西; 越快越好; 而且我知道我最终需要求解更高阶的多项式,因此使用数值求解器也许会有所帮助.我知道我可以使用一些图书馆来为我做艰苦的工作,但是我想说我想做这个练习.
我用C编码,所以不import magic_poly_solver,请.
额外问题:如何在给定间隔内仅找到根?
对于三次多项式,存在闭合形式解,但它们不是特别适合于数值计算.
我对立方情形做了以下几点:任何三次多项式至少有一个实根,你可以用牛顿方法轻松找到它.然后,您使用通货紧缩来获得剩余的二次多项式求解,请参阅我的答案,了解如何正确执行后一步骤.
需要注意的一点是:如果判别式接近于零,那么将存在数字上的多个实根,牛顿方法将会失败.此外,由于到根的附近,多项式就像(x - x0)^ 2,你将失去一半有效数字(因为P(x)将是<epsilon x - x0 <sqrt(epsilon) )).因此,您可能需要对此进行排除,并在此特定情况下使用闭合形式解,或者求解导数多项式.
如果要在给定区间内找到根,请检查Sturm定理.
用于通用多项式求解的更一般(复杂)算法是Jenkins-Traub算法.这在这里显然有些过分,但在立方体上效果很好.通常,您使用第三方实现.
既然你做C,那么使用GSL肯定是你最好的选择.
另一种通用方法是用例如找到伴随矩阵的特征值.平衡的QR分解,或减少到Householder形式.这是GSL采取的方法.