3352 - 习题5-15 二分法求方程的根

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 12 MB

用二分法求下面方程在区间(a,b)之间的根:

2x3-4x2+3x-6=0

区间端点a, b由键盘输入,确保输入区间内有根。

计算至误差小于10-6为止。

程序中,浮点型数据请定义为双精度double类型。

提示:二分法求方程根的步骤如下:

先将方程写成f(x)=0的形式,再按照如下步骤计算:

1.求出给出的两个端点之间的值fx1,fx2.当fx1fx2<0,则表明x1和x2之间必存在一根
           要么就不存在,一直提示输出x1和x2.
2.一旦fx1
fx2<0,就表明在x1和x2之间有根,继续判断,求的x1和x2的中点值x0,求出fx0.
3.在判断fx0*fx1>0,则在x0和x2中间去找根,此时x1不起作用,用x0代替x1,用fx0代替fx1.
  要么就在x0和x1中去找根,此时x2不起作用,用x0代替x2,用fx0代替fx2.

&nbsp;

题目输入

以空格分隔的区间端点值,确保输入的区间内存在方程的根。

题目输出

二分法求得的方程根,小数点后保留6位小数,末尾换行。

输入/输出样例

输入格式

-10 10

输出格式

2.000000

C语言解答

#include <stdio.h>
#include <math.h>

double hanshu(float x);

int main()
{
	double j, k, x1, x2, x0;
	scanf("%lf%lf", &x1, &x2);
/*	while (hanshu(x1)*hanshu(x2) > 0)
		scanf("%lf%lf", &x1, &x2);
*/
	while (fabs(hanshu(x0)) > 1e-6)
	{
		x0 = (x1+x2) / 2;
		if (hanshu(x0)*hanshu(x1) < 0)
			x2 = x0;
		else
			x1 = x0;
	}
	printf("%.6f\n", x0);
}

double hanshu(float x)
{
	double y;
	y = 2*pow(x, 3) - 4*pow(x, 2) + 3*x - 6;
	return y;
}

C++解答

#include<stdio.h>
#include<math.h>

const double eps=1e-6;

double fun(double x)
{
	return 2*x*x*x-4*x*x+3*x-6;
}

int main()
{
	double a,b;
	while(scanf("%lf%lf",&a,&b)!=EOF)
	{
		double mid;
		while(fabs(a-b)>eps)
		{
			mid=(a+b)/2;
			if(fun(mid)*fun(a)>0)
				a=mid;
			else if(fun(mid)*fun(b)>0)
				b=mid;
			else
				break;
		}
		printf("%lf\n",mid);
	}
	return 0;
}