7-2 二分法求函数的零点 pintia
- 有函数:f(x)=x5−15x4+85x3−225x2+274x−121
已知f(1.5)>0,f(2.4)<0 且方程f(x)=0 在区间[1.5,2.4] 有且只有一个根,请用二分法求出该根。
提示:判断函数是否为0,使用表达式 fabs(f(x)) < 1e-7
输入格式:
无。
输出格式:x
该方程在区间[1.5,2.4]中的根。要求四舍五入到小数点后6位
代码:
#include <iostream>
#include <cmath> // 包含fabs函数
#include <iomanip> // 用于设置输出精度
using namespace std;
double f(double x) {
return x*x*x*x*x - 15*x*x*x*x + 85*x*x*x - 225*x*x + 274*x - 121;
} double binary_search(double a, double b, double tol = 1e-7) {
if (f(a) * f(b) >= 0) {
cout << "二分法失败,因为f(a)和f(b)同号" << endl;
return 0.0;
}
while ((b - a) / 2 > tol) {
double c = (a + b) / 2;
if (fabs(f(c)) < tol) {
return round(c * 1e6) / 1e6; // 四舍五入到小数点后6位
} else if (f(c) * f(a) < 0) {
b = c;
} else {
a = c;
}
}
// 如果循环结束还没有找到精确到tol的根,返回区间的中点作为近似解
return round((a + b) / 2 * 1e6) / 1e6; // 注意这里也要除以2
}
int main() { // 注意这里修改了括号
double root = binary_search(1.5, 2.4);
cout << fixed << setprecision(6) << root << endl; // 设置输出精度为6位小数
return 0;
}