四次方程的解


10

对于四次方程的解是否有开放的C实现:

ax+bx³+cx²+dx+e=0

我正在考虑实施法拉利解决方案。在Wikipedia上,我读到该解决方案仅对某些可能的系数符号组合具有计算稳定性。但是也许我很幸运……通过使用计算机代数系统分析求解并导出到C,我得到了一个务实的解决方案。但是,如果有经过测试的实现,我更喜欢使用它。我搜索一种快速方法,但不希望使用一般的根查找器。

我只需要真正的解决方案。


您是否同时需要所有(实际)解决方案?就像GertVdE在下面说的那样,如果封闭格式解决方案存在稳定性问题,那么没有充分的理由不使用某些根查找算法。
Godric Seer 2012年

3
我觉得这很有趣,因为它可以被标记为非线性代数,因为您可以简单地计算出已经为Hessenberg形式的伴随矩阵的特征值,并且应用QR扫描将非常简单。
维克多·刘

2
看看ACM TOMS(Algorithm 954)中发布的三次/四次求解器。写入该日记的代码通常质量很高。该文件本身位于付费专线的后面,但是可以从此链接下载代码。
GoHokies

...(稍后编辑)ACM代码是用FORTRAN 90编写的,但我的第一印象是,无需花费很多精力就可以从C调用它。
GoHokies

1
@GoHokies我认为您应该将您的评论转换为答案,因为我认为这是对这个问题的好答案。尤其是因为链接的纸张设法避免了通常的数值不稳定性,所以这绝对不是一件容易的事。
基里尔

Answers:


20

我强烈建议不要使用封闭形式的解决方案,因为它们在数值上往往非常不稳定。您需要格外小心对待判别式和其他参数的评估方式和顺序。

经典示例是二次方程示例。将根计算为会使多项式陷入麻烦,因为自此之后,您在分子。您需要计算。ax2+bx+c=0

x1,2=b±b24ac2a
b4ac
x1=(b+sign(b)b24ac)2a;x2=ca1x1

Higham在他的代表作《数值算法的准确性和稳定性》(第二版,SIAM)中使用直接搜索方法来查找三次多项式的系数,对于该多项式,经典的解析三次解给出的结果非常不准确。他给出的示例是。对于该多项式,根是很好地分离的,因此该问题不是病态的。但是,如果他使用分析方法计算根,并评估这些根中的多项式,则他会使用稳定的标准方法(伴随矩阵方法)获得的残差。,残基的顺序为[a,b,c]=[1.732,1,1.2704]O(102)O(1015)。他提出了对该算法的轻微修改,但是即使那样,他仍然可以找到导致一组系数,这绝对不是一个好方法。请参阅上述书籍的p480-481。O(1011)

在您的情况下,我将采用Bairstow的方法。它使用牛顿迭代的二次形式(然后解二次方)和放气的迭代组合。它很容易实现,甚至在网络上也有一些实现。


1
您能否解释一下“我强烈建议您不要使用封闭形式的解决方案,因为它们在数值上往往非常不稳定”。这仅适用于四次多项式还是这是一般规则?
NoChance 2012年

@EmmadKareem我已经更新了上面的答案。
GertVdE 2012年

3

看到这些:


2
通过在答案中给出系数的多项式上使用此代码,我发现以下内容:,与真实根相比,它的相对误差为(使用使用配套矩阵方法的Octave的roots命令进行计算)。它具有的残差,而伴随矩阵方法根具有的残差。由您决定是否足够好(对于计算机图形学,对于某些其他应用程序,它就不够)x1=1.602644912244132e+00O(108)O(107)O(1015)
GertVdE 2012年

1

c中的数字配方为近似二次方和三次方的实根提供了封闭形式的表达式,它们的精度可能很高。由于四次方程的代数求解涉及求解三次方程,然后求解两个二次方程,因此闭式四次方程可能不会有好的精度。


我只是使用c(press等人)三次公式中的数字配方得到了2e-16内的三次示例的根(略高于我的浮子的精度)。因此,有理由希望。
Nemocopperfield '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.