You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为二分法自动寻找函数零点所在区间?

自动定位函数零点区间的实现方案

要自动定位函数零点所在区间,核心是利用连续函数零点存在定理:若连续函数在区间[a,b]两端的函数值异号(f(a)*f(b)<0),则区间内至少存在一个零点。基于这个定理,我们可以通过在目标范围内均匀采样,遍历相邻采样点的函数值符号变化,自动筛选出可能存在零点的区间。

以下是修改后的完整代码(仅使用NumPy和Matplotlib):

import numpy as np
import matplotlib.pyplot as plt

def f(x):
    return np.sin(x**2 - 13*x -4) - np.cos(2*x**2 -23*x -4)

def find_root_intervals(f, start, end, step=0.01):
    """自动检测存在零点的区间"""
    x_samples = np.arange(start, end, step)
    f_vals = f(x_samples)
    intervals = []
    
    for i in range(len(x_samples) - 1):
        a = x_samples[i]
        b = x_samples[i+1]
        fa = f_vals[i]
        fb = f_vals[i+1]
        
        # 处理端点恰好为零点的情况
        if np.isclose(fa, 0, atol=1e-9):
            print(f"找到零点:x={a:.9f}")
            continue
        if np.isclose(fb, 0, atol=1e-9):
            print(f"找到零点:x={b:.9f}")
            continue
        
        # 检查区间两端函数值异号
        if fa * fb < 0:
            intervals.append((a, b))
    
    return intervals

def bisection(f, a, b, tol=1e-9):
    """二分法求解零点"""
    if f(a) * f(b) >= 0:
        return None
    
    iter_count = 0
    while b - a > tol:
        c = (a + b) / 2
        fc = f(c)
        
        if np.isclose(fc, 0, atol=1e-9):
            return c, iter_count
        elif f(a) * fc < 0:
            b = c
        else:
            a = c
        iter_count += 1
    
    return (a + b) / 2, iter_count

# 1. 自动检测零点区间(搜索范围4到8,采样步长0.01)
root_intervals = find_root_intervals(f, 4, 8, step=0.01)
print(f"自动检测到的零点区间:{root_intervals}")

# 2. 用二分法求解每个区间的零点
roots = []
for a, b in root_intervals:
    result = bisection(f, a, b, tol=1e-7)
    if result is not None:
        root, iters = result
        roots.append((root, iters))
        print(f"区间({a:.2f}, {b:.2f})内的零点:{root:.9f},迭代次数:{iters}")

# 3. 可视化验证
x = np.arange(4, 8, 0.0001)
plt.plot(x, f(x), 'r', x, x*0, 'b')
plt.title('函数图像')
plt.xlabel('x')
plt.ylabel('f(x)')
# 标记自动找到的零点
for root, _ in roots:
    plt.scatter(root, 0, c='g', marker='o', label='自动找到的零点')
plt.legend()
plt.show()

关键说明:

  • find_root_intervals函数:在指定范围[start, end]内以step为步长采样,遍历相邻采样点,通过函数值乘积判断符号变化,收集存在零点的区间。同时处理了采样点恰好为零点的特殊情况。
  • 采样步长选择:步长越小,检测精度越高,但计算量也越大。对于你的函数,step=0.01已经能准确捕捉到所有零点区间,你可以根据需求调整。
  • 二分法兼容:自动检测的区间直接传入你原有的二分法函数,无需修改核心求解逻辑。

运行代码后,程序会自动输出检测到的区间和对应的零点,同时在图像中标记出找到的零点,验证结果的正确性。

内容的提问来源于stack exchange,提问作者Pietro Serenella

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:30:47