怎么用C语言救元三次方的解

用C语言求方程:X3-5X2+16x-80=0的根.(X的立方-5X的平方+16X-80=0的根)写出详细的编程过程....... 用C语言求方程:X3-5X2+16x-80=0的根.
(X的立方-5X的平方+16X-80=0的根)
写出详细的编程过程....
展开
 我来答
instigator
2007-03-19 · TA获得超过1593个赞
知道小有建树答主
回答量:3172
采纳率:0%
帮助的人:1549万
展开全部
有三次方程一般公式的
一元三次方程的求根公式用通常的演绎思维是作不出来的,用类似解一元二次方程的求根公式的配方法只能将型如ax^3+bx^2+cx+d+0的标准型一元三次方程形式化为x^3+px+q=0的特殊型。
一元三次方程的求解公式的解法只能用归纳思维得到,即根据一元一次方程、一元二次方程及特殊的高次方程的求根公式的形式归纳出一元三次方程的求根公式的形式。我归纳出来的形如 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)只是一元三方程的一个实根解,按韦达定理一元三次方程应该有三个根,不过按韦达定理一元三次方程只要求出了其中一个根,另两个根就容易求出了。由于计算太复杂及这个问题历史上已经解决,我不愿花过多的力气在上面,我做这项工作只是想考验自己的智力,所以只要关键的问题解决了另两个根我就没有花力气去求解。
二、我也曾用类似的方法去求解过一元四次方程的解,具体就是假设一元四次方程的根的形式为x=A^(1/4)+B^(1/4)+C^(1/4),有一次我好象解出过,不过后来多次求解好象说明这种方法求解一元四次方程解不出。不过我认为如果能进一步归纳出A、B、C的形式,应该能求出一元四次方程的求根公式的。由于计算实在太复杂及这个问题古人已经解决了,我后来一直没能完成这项工作。
三、通过求解一元三次方程的求根公式,我获得了一个经验,用演绎法(就是直接推理)求解不出来的问题,换一个思维,用归纳法(及通过对简单和特殊的同类问题的解法的归纳类比)常常能取得很好的效果。事实上人类常常是这样解决问题的,大科学家正是这样才成为大科学家的

一般算法有了
实现就很简单了
419457485
2007-03-25 · TA获得超过293个赞
知道答主
回答量:188
采纳率:0%
帮助的人:93.7万
展开全部
用弦截法求方程:f(x)=x3-5x2+16x-80=0的根。代码如下:
#include<math.h>
float f(float x) /*定义f函数,以实现f(x)=x3-5x2+16x-80 */
{
float y;
y=((x-5.0)*x+16.0)*x-80.0;
return(y);
}
float xpoint(float x1,float x2) /*定义xpoint函数,求出弦与X轴交点 */
{
float y;
y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
return(y);
}
float root(float x1,float x2) /* 定义root函数,求近似根 */
{
float x,y,y1;
y1=f(xl);
do
{
x=xpoint(x1,x2);
y=f(x);
if(y*y1>0) /* f(x)与f(x1)同符号 */
{ y1=y;
x1=x;
else
x2=x;
}
while(fabs(y)>=0.0001);
return(x);
}
main() /* 主函数 */
{
float x1,x2,f1,f2,x;
do{
printf("input x1,x2:\n");
scanf("%f,%f",&x1,&x2);
f1=f(x1);
f2=f(x2);
}while(f1*f2>=0);
x=root(x1,x2);
printf("A root of equation is %8.4f",x);
}
运行情况如下:
input x1,x2:
2,6 (回车)
A root of equation is 5.0000
}

参考资料: 谭浩强《C程序设计》第二版

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式