Description
下面程序的功能是采用弦截法求方程 x^3- 11.1x^2+38.8x-41.77=0
的根。其中函数root用来求区间(x1,x2)的实根。
请将程序补充完整。
#include<stdio.h>
double root(double,double);
int main()
{
double x1,x2,ans;
scanf("%lf%lf",&x1,&x2);
ans=root(x1,x2);
printf("%lf\n",ans);
return 0;
}
//你提交的代码将放在这里
提交答案时,只需要提交自己补充的代码。
Input
2个实数x1和x2(x1 \leq x2x1≤x2),中间用空格隔开。保证区间内有实根。
Output
按照样例要求格式输出方程的根。
Sample Input 1
2 3
Sample Output 1
2.096316
注意误差精度不能小于1e-5,即0.00001。需要按照输出小数点位数来设置精度误差,不然最后得到的值为2.096315。
double f(double x)
{
return pow(x, 3) - 11.1 * pow(x, 2) + 38.8 * x - 41.77;
}
double root(double x1, double x2)
{
double x = ((f(x1)*x2-f(x2)*x1)/(f(x1)-f(x2)));
while (fabs(f(x))> 0.00001)
{
if (f(x) * f(x1) > 0)
x1 = x;
else x2 = x;
x = (x1 * f(x2) - x2 * f(x1)) / (f(x2) - f(x1));
}
return x;
}
别人的递归写法:
double root(double x1,double x2)
{
double y1,y2,y,x;
y1 = x1*x1*x1 - 11.1*x1*x1 + 38.8*x1 - 41.77;
y2 = x2*x2*x2 - 11.1*x2*x2 + 38.8*x2 - 41.77; //求出函数值
x = (x1*y2 - x2*y1)/(y2 - y1); //求出弦的零点
y = x*x*x - 11.1*x*x + 38.8*x - 41.77; //求出对应零点函数值的误差
if(fabs(y) < 0.00001) //两根精度
return x; //递归出口
else if(y*y2<0)
return root(x,x2); //对应函数值正负的改变
else
return root(x1,x);
}