3352 - 习题5-15 二分法求方程的根
用二分法求下面方程在区间(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.一旦fx1fx2<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.
题目输入
以空格分隔的区间端点值,确保输入的区间内存在方程的根。
题目输出
二分法求得的方程根,小数点后保留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; }