发布网友 发布时间:2024-03-21 09:14
共1个回答
热心网友 时间:2024-11-02 09:22
可以使用二分法,弦截法,牛顿法,以前写的,希望对LZ有帮助。①弦截法::用弦截法求方程F(x)=X^3-5X^2+16X-80=0的根。方法如下:(1)取两个不同的点x1,x2,如果f(x1)和f(x2)符号相反,则(x1,x2)区间内必有一个根。如果f(x1)和f(x2)同符号,则应改变x1,x2,直到f(x1)和f(x2)异号为止。注意x1和x2的值不应差太大,以保证(x1,x2)区间内只有一根。(2)连接(x1,f(x1))和(x2,f(x2))两点,此线交x轴于x,x的坐标可以用下式求出:x=(x1*f(x2)-x2*f(x1))/f(x2)-f(x1),再从x求出f(x);(3)若f(x)和f(x1)同符号,则根必在(x,x2)内,此时将x作为新的x1;如果f(x)和f(x2)同符号,则表示根在(x1,x),此时将x作为新的x2。(4)重复步骤(2)和(3),知道|f(x)|#includefloatf(floatx){floaty;y=((x-5.0)*x+16.0)*x-80.0;returny;}floatxpoint(floatx1,floatx2){//求(x1,f(x1)和(x2,f(x2))连线与x轴的交点floaty;y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));returny;}//xpoint函数floatroot(floatx1,floatx2){floatx,y,y1;y1=f(x1);do{x=xpoint(x1,x2);y=f(x);if(y*y1>0){y1=y;x1=x;}elsex2=x;}while(fabs(y)>=0.00001);returnx;}//root函数voidmain(){floatx1,x2,f1,f2,x;do{printf("inputx1,x2:\n");scanf("%f%f",&x1,&x2);f1=f(x1);f2=f(x2);}while(f1*f2>=0);x=root(x1,x2);printf("arootofequationis%8.4f\n",x);getch();}②:牛顿迭代法:牛顿迭代法牛顿迭代法又称牛顿切线法,它采用以下方法求根:先任意设定一个与真实的根接近的值x0作为第一个近似根,由x0求出f(x0),过(x0,f(x0))点做f(x)的切线,交x轴于x1,把它作为第二次近似根,再由x1求出f(x1),再过(x1,f(x1))点做f(x)的切线,交x轴于x2,再求出f(x2),再作切线……如此继续下去,直到足够接近真正的x为止。其中f'(X0)是函数在X0处的斜率,也就是在X0处的导数。代码如下:#include#includefloatf(floata,floatb,floatc,floatd,floatx){floatf;f=((a*x+b)*x+c)*x+d;returnf;}floatf1(floata,floatb,floatc,floatx){floatf;f=(x*3*a+2*b)*x+c;returnf;}floatroot(floata,floatb,floatc,floatd){floatx0,x1=1;do{x0=x1;x1=x0-f(a,b,c,d,x0)/f1(a,b,c,x0);}while(fabs(x1-x0)>=1e-6);returnx0;}voidmain(){floata,b,c,d,x;printf("inputfourfloatnumbers:\n");scanf("%f%f%f%f",&a,&b,&c,&d);x=root(a,b,c,d);printf("%.1fX^3+%.1fX^2+%.1fX+%.1f=0itsrootnearx=1.5is:%.4f\n",a,b,c,d,x);getch();}追问我要答案~~~