版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
版权
最近在写程序的时候遇到一些公式需要求解一元三次、一元四次方程,在google上搜索到不少公式和公式后面的故事。以下将逐步讨论各阶次的一元方程的解法及程序上的实现。
1、一次方程
a1x+a0=0
一元一次方程实际上也可以叫做一元线性方程,这个求解很简单,编程上也不需做特出处理。
x=-a0/a1
2、二次方程
a2x2+a1x+a0=0
一元二次方程的求根公式推导很简单,这里不赘述。编程的时候要注意处理一种比较特殊的情况。例如求解方程x2-20000x+1=0的时候,如果直接使用求根公式编写程序的话,求得跟为20000和0,而实际的根约为19999.99995和0.00005。使用下面的办法可以避免上面这种方程的较小根为0的情况。
判别式Δ=a1-4a2a0
令p1=-0.5*a1/a2,p2=0.5*SQRT(|Δ|)
当Δ>=0时,x1=p1+SGN(p1)*p2,若|x1|>0,x2=a0/(a2*x1),否则,x2=p1-SGN(p1)*p2
3、三次方程
a3x3+a2x2+a1x+a0=0
令y=3a3x+a2,方程可变形为y3+py+q=0
p=9a3a1-3a22
q=2a23-9a3a2a1+27a32a0
关于方程y3+py+q=0的求解过程主要参考了百度百科关于“解一元三次方程”的条目,下面简单复述一下。
首先假定方程y3+py+q=0的根的形式为y=A1/3+B1/3,也即两数开立方之和。等式两边立方,整理可得
y3-3(AB)1/3y-(A+B)=0,与原方程比较则有
A+B=-q
AB=(-q/3)3
这是可以根据韦达定理建立一元二次方程W2-(A+B)W+AB=0
解次方程可得
A=W1=-(q/2)-SQRT((q/2)2+(p/3)3)
B=W2=-(q/2)+SQRT((q/2)2+(p/3)3)
这样方程的一个根y1=[-(q/2)-SQRT((q/2)2+(p/3)3)]1/3+[-(q/2)+SQRT((q/2)2+(p/3)3)]1/3
再根据韦达定理y1+y2+y3=0和y1y2y3=-q,可求得y2+y3和y2y3,再次使用韦达定理建立一元二次方程即可求解。
仔细观察y1的表达式会发现存在一个判别式的问题,也即Δ=((q/2)2+(p/3)3是否大于零,但是比较巧妙的是,无论Δ是否大于零,y1始终为实数根,Δ的符号对其他两个根有影响,Δ>0时,y2、y3为共轭的虚数根,Δ