一元三次方程的求根公式用通常的演绎思维是作不出来的,用类似解一元二次方程的求根公式的配方法只能将型如ax^3+bx^2+cx+d+0的标准型一元三次方程形式化为x^3+px+q=0的特殊型。
ax^3+bx^2+cx+d=0
为了方便,约去a得到
x^3+kx^2+mx+n=0
令x=y-k/3
代入方程(y-k/3)^3+k(y-k/3)^2+m(y-k/3)+n=0
(y-k/3)^3中的y^2项系数是-k
k(y-k/3)^2中的y^2项系数是k
所以相加后y^2抵消
得到y^3+py+q=0
其中p=(-k^2/3)+m
q=(2k^3/27)-(km/3)+n
一元三次方程的求解公式的解法只能用归纳思维得到,即根据一元一次方程、一元二次方程及特殊的高次方程的求根公式的形式归纳出一元三次方程的求根公式的形式。归纳出来的形如 x^3+px+q=0的一元三次方程的求根公式的形式应该为x=A^(1/3)+B^(1/3)型,即为两个开立方之和。归纳出了一元三次方程求根公式的形式,下一步的工作就是求出开立方里面的内容,也就是用p和q表示A和B。方法如下:
(1)将x=A^(1/3)+B^(1/3)两边同时立方可以得到
(2)x^3=(A+B)+3(AB)^(1/3)(A^(1/3)+B^(1/3))
(3)由于x=A^(1/3)+B^(1/3),所以(2)可化为
x^3=(A+B)+3(AB)^(1/3)x,移项可得
(4)x^3-3(AB)^(1/3)x-(A+B)=0,和一元三次方程和特殊型x^3+px+q=0作比较,可知
(5)-3(AB)^(1/3)=p,-(A+B)=q,化简得
(6)A+B=-q,AB=-(p/3)^3
(7)这样其实就将一元三次方程的求根公式化为了一元二次方程的求根公式问题,因为A和B可以看作是一元二次方程的两个根,而(6)则是关于形如ay^2+by+c=0的一元二次方程两个根的韦达定理,即
(8)y1+y2=-(b/a),y1*y2=c/a
(9)对比(6)和(8),可令A=y1,B=y2,q=b/a,-(p/3)^3=c/a
(10)由于型为ay^2+by+c=0的一元二次方程求根公式为
y1=-(b+(b^2-4ac)^(1/2))/(2a)
y2=-(b-(b^2-4ac)^(1/2))/(2a)
可化为
(11)y1=-(b/2a)-((b/2a)^2-(c/a))^(1/2)
y2=-(b/2a)+((b/2a)^2-(c/a))^(1/2)
将(9)中的A=y1,B=y2,q=b/a,-(p/3)^3=c/a代入(11)可得
(12)A=-(q/2)-((q/2)^2+(p/3)^3)^(1/2)
B=-(q/2)+((q/2)^2+(p/3)^3)^(1/2)
(13)将A,B代入x=A^(1/3)+B^(1/3)得
(14)x=(-(q/2)-((q/2)^2+(p/3)^3)^(1/2))^(1/3)+(-(q/2)+((q/2)^2+(p/3)^3)^(1/2))^(1/3)
式 (14)只是一元三方程的一个实根解,按韦达定理一元三次方程应该有三个根,不过按韦达定理一元三次方程只要求出了其中一个根,另两个根就容易求出了。
ax3+bx2+cx+d=0 记:p=(27a2d-9abc+2b3)/(54a3) q=(3ac-b2)/(9a2) X1=-b/(3a)+(-p+(p2+q3)^(1/2))^(1/3)+ (-p-(p2+q3)^(1/2))^(1/3)
用弦截法求
我给出一个例子
求f(x)=x^3-5x^2+16x-80=0
#include
using namepace std;
#include
float f(float x)
{
float y;
y=((x-0.5)*x+16.0)*x-80.0;
return(y);
}
float xpoint (float x1,float x2)
{
float y;
y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
return(y);
}
float root(float x1,float x2)
{
float x,y,y1;
y1=f(x1);
do
{
x=xpoin(x1,x2);
y=f(x);
if(y*y1>0)
{
y1=y;
x1=x;
}
else
x2=x;
}
return(x);
}
viod main()
{
float x1,x2,f1,f2;
do
{
cout<<"请输入x1,x2:"<
f2=f(x2);
}
while(f1*f2>=0)
x=root(x1,x2);
cout<
顺便说一下算法思想吧
(1)用函数调用xpoint(x1,x2)来求(x1,f(x2))的连线与x轴的交点x的坐标。
(2)用函数调用root(x1,x2)来求(x1,x2)区间的那个实根,显然,执行root函数过程中要用到函数xpoint,而执行xpoint函数过程中要用到f函数。
这种方法求一元三次方程比较简洁方便。
其实用二分法也可以的,不过要在C++上实现是相对比较难点。
如果你要知道更多弦截法,到百度收索一下就有很多,
呵呵~~希望èƒ