问题 : 阶段2考试题目3 二分法解方程
时间限制: 1 Sec 内存限制: 128 MB
提交: 4537 解决: 1017
[提交][状态][讨论版]
题目描述
编写程序,用非线性方程二分法求解函数BiRoot(),求任意方程f(x)=0在区间[a,b]之间的一个解,精确到10-6。
函数原型为:double BiRoot(double (*fun)(double), double, double)。
二分法求解的基本思路如下图所示,对于区间[a,b]上连续且f(a)•f(b)<0的函数y=f(x),通过计算a,b中点的函数值,不断把区间一分为二,并舍弃无解的半段区间,并更新a,b,使两个端点逐步逼近零点,迭代的终止条件是计算的函数值小于10-6,最终得到符合精度要求的近似解。
例:如a=-5, b=0,且f(x)= x3-10x2+3x+20.0则函数返回-1.209
如a=0, b=3, 且f(x)= x3-6x-1则函数返回2.529
提示
若f(a)•f(b)>0,则意味着方程在[a,b]之间可能无解,输出信息“error! a,b have the same sign.\n”后,可直接结束程序。
该题目可参考教材P317,tabulate.c代码。
代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <math.h>
double BinarySearch(double (*f)(double),double, double);
double BiRoot(double (*f)(double), double a, double b);
double BinarySearch(double (*f)(double),double a, double b)
{
double x;
x = (a + b) / 2.0;
if (x - a < 1E-6) /* 此处填空 */
return x;
else
{
if (f(a) * f(x) > 0)
return BinarySearch(f,x, b); /* 此处填空 */
else
return BinarySearch(f,a, x); /* 此处填空 */
}
}
double BiRoot(double (*f)(double), double a, double b) {
double x;
scanf("%lf%lf", &a, &b);
if (f(a) * f(b) > 0) /* 此处填空 */
{
printf("error! a,b have the same sign.\n");
return -1;
}
x = BinarySearch(f, a, b); /* 此处填空 */
return x;
}