C语言代码:
// 信息技术例程1 (二分法求函数零点近似值)
// C ver, 2022.01.01
#include <stdio.h>
#include <math.h>
#define ZROAERA_LEFT 2 // 函数零点所在区间左端点, 本例子为2
#define ZROAERA_RIGHT 3 // 函数零点所在区间右端点, 本例子为3
#define ACCURACY 0.01 // 精确度, 本例子为0.01
// 待求的函数, 例子为f(x) = ln x + 2x - 6
double function_base (double arg1) {
return log(arg1) + (2 * arg1) - 6;
}
// stdlib.h的abs函数有问题
double abs2(double arg0) {
if(arg0 < 0) { return -arg0; }
else { return arg0; }
}
int main(void)
{
double left, right, mid; // 区间左端点, 右端点, 中点
int count = 0; //计数器
left = ZROAERA_LEFT;
right = ZROAERA_RIGHT;
while(abs2(left-right) >= ACCURACY) { // 如果零点所在的区间小于精确度
count++;
mid = (left + right) / 2;
if(function_base(left) * function_base(mid) >= 0) { // 零点在中点上或者中点右边
left = mid; // 以中点为新区间左端点
if(function_base(mid) == 0) { // 零点在中点上
break;
}
} else { // 零点在中点左边
right = mid; // 以中点为新区间右端点
}
printf("计算次数:%d, 左端点值:%f, 右端点值:%f, 中点函数值:%f\n", count, left, right, function_base(mid));
}
printf("该函数在区间(%d, %d)上的近似解为%f.\n", ZROAERA_LEFT, ZROAERA_RIGHT, left);
return 0;
}
运行结果:
