弦截法计算一元多次方程的根

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);
}

上一篇:Endnote自定义style的保存路径


下一篇:差分与前缀和