题目描述
求下面方程的根:f(x)=x3−5x2+10x−80=0
精确到小数点后 9 位。
代码实现:
cs
#include <stdio.h>
#include <math.h>
// 定义函数 f(x)
double f(double x) {
return x*x*x - 5*x*x + 10*x - 80;
}
int main() {
double left, right, mid;
// 寻找一个包含根的区间
// 观察:f(0) = -80 < 0, f(10) = 1000 - 500 + 100 - 80 = 520 > 0
left = 0;
right = 10;
// 确保区间两端函数值异号
if (f(left) * f(right) >= 0) {
printf("初始区间不包含根\n");
return 1;
}
// 二分法迭代,直到精度达到 1e-10(比要求高一点保证 1e-9 正确)
while ((right - left) > 1e-10) {
mid = (left + right) / 2;
if (f(mid) == 0) {
break;
} else if (f(mid) * f(left) < 0) {
right = mid;
} else {
left = mid;
}
}
// 输出结果,保留 9 位小数
printf("%.9lf\n", mid);
return 0;
}
上述二分法求连续函数在区间[a,b]内的根:
介值定理的应用:
如果函数 f(x) 在区间 [a,b] 上连续,且 f(a)⋅f(b)<0(即两端点函数值异号),则区间内至少存在一个根。
如果f(mid) * f(left) < 0说明mid和left之间有一个根,这时就将right=mid,再求一个新的更小区间的mid再进行比较。如果f(mid) * f(left) > 0说明mid和left之间没有根,那根就存在于mid和right之间,所以将left=mid再进行右半边的小区间划分,再进行根的求解。