目录

1 原理

1.1 数学基础

2 二分法求解

2.1 求解步骤

2.1.1 确定有根区间

2.1.2 二分法求根

3 二分法的几何解释

4 案例与Python代码

4.1 案例介绍

4.2 Python代码实现

4.3 运行结果与解释

4.4 注意事项

5 扩展应用


> 推荐一个很通俗易懂的人工智能教程:

人工智能教程https://www.captainbed.cn/dfd

1 原理

二分法​(Bisection Method)是一种基于区间套定理的数值解法,用于求解单变量连续函数的实数根。其核心思想是通过不断缩小区间范围,逐步逼近方程的根。

1.1 数学基础

设函数 f(x)在闭区间 [a,b]上连续,且 f(a)⋅f(b)<0(即区间两端函数值异号)。根据连续函数零点定理,方程 f(x)=0在区间 (a,b)内至少有一个实根根。如果函数在区间内是严格单调的,则该根是唯一的。

二分法的数学原理可表示为:

其中 k表示迭代次数,每次迭代后区间长度减半:

这里 x∗表示真实解。从公式可以看出,​误差上界随着迭代次数增加而指数级减小,保证了算法的收敛性。

2 二分法求解

2.1 求解步骤

2.1.1 确定有根区间

一般采用等步长扫描法来确定根区间,流程如下:

  1. 设定初始扫描区间 [a,b]和步长 h>0

  2. 取 x0​=a, x1​=x0​+h

  3. 计算 f(x0​)⋅f(x1​):

    • 如果 f(x0​)⋅f(x1​)<0,则扫描成功,有根区间为 [x0​,x1​]

    • 否则令 x0​=x1​, x1​=x0​+h继续扫描

  4. 如果 x1​>b则扫描失败,应缩小步长 h再次扫描

  5. 如果步长足够小仍失败,可能方程在区间内无实根

2.1.2 二分法求根

确定有根区间后,即可使用二分法求近似根:

  1. 输入有根区间 [a,b]和精度要求 ε

  2. 计算中点 c=2a+b​和函数值 f(c)

  3. 若 f(c)=0或区间长度 <ε,则 c为解,算法结束

  4. 若 f(a)⋅f(c)<0,则根在 [a,c]内,令 b=c

  5. 否则根在 [c,b]内,令 a=c

  6. 重复步骤2-5,直到满足精度要求

3 二分法的几何解释

二分法的几何解释非常直观。如图所示,假设 x∗为方程 f(x)=0的真实解,迭代过程如下:

  1. 起始迭代区间为 [a0​,b0​],计算对应的函数值 f(a0​)和 f(b0​)(异号)

  2. 取中点 c1​=2a0​+b0​​,计算函数值 f(c1​)

  3. 根据函数值的符号更新迭代区间为 [a0​,c1​]或 [c1​,b0​]

  4. 取新区间的中点 c2​=2a1​+b1​​,计算函数值 f(c2​)

  5. 如此循环,区间不断缩小,逐步逼近真实解 x∗

几何意义​:每次迭代通过判断函数在中点处的符号,选择包含根的子区间,相当于不断"挤压"区间范围,使区间中点逐步逼近真实根。

4 案例与Python代码

4.1 案例介绍

以求解方程 x^3−x−1=0为例,该方程在区间 [1,2]内有一个实根。

  • f(1)=1^3−1−1=−1<0

  • f(2)=2^3−2−1=5>0

满足 f(1)⋅f(2)<0,故可使用二分法求解。

4.2 Python代码实现

import numpy as np

def f(x):
    """
    定义目标函数
    """
    return x**3 - x - 1

def bisection_method(func, a, b, tol=1e-6, max_iter=100):
    """
    二分法求解方程 func(x) = 0
    
    参数:
    func: 目标函数
    a, b: 初始区间
    tol: 容差(精度要求)
    max_iter: 最大迭代次数
    
    返回:
    近似解和迭代次数
    """
    # 检查初始区间是否满足条件
    if func(a) * func(b) >= 0:
        raise ValueError("区间两端函数值必须异号")
    
    # 迭代过程
    for n in range(max_iter):
        c = (a + b) / 2  # 计算中点
        
        # 检查是否满足精度要求
        if abs(func(c)) < tol:
            return c, n
        
        # 更新区间
        if func(a) * func(c) < 0:
            b = c
        else:
            a = c
    
    # 达到最大迭代次数后返回当前中点
    return (a + b) / 2, max_iter

# 主程序
if __name__ == "__main__":
    try:
        # 设置初始区间和精度
        a, b = 1.0, 2.0
        tolerance = 1e-6
        
        # 调用二分法求解
        root, iterations = bisection_method(f, a, b, tolerance)
        
        # 输出结果
        print(f"方程的近似解为: {root:.8f}")
        print(f"迭代次数: {iterations}")
        print(f"函数值验证: f({root:.8f}) = {f(root):.10f}")
        
    except ValueError as e:
        print(f"错误: {e}")

4.3 运行结果与解释

运行上述代码,可以得到类似以下结果:

方程的近似解为: 1.32471759
迭代次数: 20
函数值验证: f(1.32471759) = -0.0000009554

结果表明,方程 x3−x−1=0在区间 [1,2]内的近似根为 ​1.32471759,经过20次迭代后达到 10−6的精度要求。函数值接近零,验证了解的正确性。

4.4 注意事项

  • 初始区间选择​:必须确保 f(a)⋅f(b)<0,否则算法无法开始

  • 收敛速度​:二分法以线性速度收敛,相对于其他方法(如牛顿法)较慢

  • 精度控制​:可根据需要调整容差 tol值,但过高的精度要求会增加计算时间

  • 函数连续性​:二分法要求函数在区间内连续,否则可能失败

  • 多重根处理​:对于多重根的情况,可能需要结合导数分析或细分区间

5 扩展应用

二分法不仅可用于方程求根,还广泛应用于:

  • 工程计算​:如求解材料力学中的非线性方程

  • 物理模拟​:寻找能量平衡点

  • 金融建模​:计算内部收益率(IRR)

  • 优化算法​:作为一维搜索方法用于优化问题

  • 计算机图形学​:射线与物体交点的快速计算

二分法的优势在于其稳定性简单性,总能收敛到根(需满足前提条件),且逻辑清晰,易于实现。缺点是收敛速度较慢,对于高性能要求的场景,可考虑与牛顿法、割线法等更高效的方法结合使用。

更多推荐