二分法求函数的零点

GitHub跳转原题关系图返回列表

在函数值异号且根唯一的区间上二分,逐步缩小零点范围。

OJ: noi_openjudge

题目 ID: ch0111-02

难度:入门

标签:二分数学python

日期: 2026-07-30 23:01

题意

已知五次函数在区间 [1.5,2.4][1.5, 2.4] 内恰有一个零点,输出该零点并保留六位小数。

思路

区间端点函数值异号,且根唯一。每次取中点,根据中点函数值的符号保留仍包含零点的一半区间。固定迭代 100 次后误差远小于输出精度。

代码

Python代码

python
def function(x: float) -> float:
    return x**5 - 15 * x**4 + 85 * x**3 - 225 * x**2 + 274 * x - 121


left, right = 1.5, 2.4
for _ in range(100):
    middle = (left + right) / 2
    if function(middle) > 0:
        left = middle
    else:
        right = middle

print(f"{(left + right) / 2:.6f}")

C++代码

cpp
/* author: Rainboy email: rainboylvx@qq.com  time: 2021年 04月 07日 星期三 12:53:57 CST */
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+5,maxe = 1e6+5; //点与边的数量

int n,m;
/* 定义全局变量 */

double f(double x){
    return pow(x,5) - 15*pow(x,4) + 85*pow(x,3) - 225*pow(x,2) + 274*x -121;
}


double bs(double l,double r){
    double pc = 0.00000001;
    while (r-l > pc) {
        double m = (l+r) / 2;
        if( f(m) > 0 )
            l = m; 
        else 
            r = m;
    }
    return l;
}

int main(){
    double ans = bs(1.4,2.5);
    printf("%0.6lf",ans);
    return 0;
}

复杂度

固定进行 100 次二分,时间复杂度为 O(1)O(1),空间复杂度为 O(1)O(1)

总结

连续函数的唯一零点可用端点异号性质定位,二分时无需显式求解方程。