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

Python二分法迭代异常求助:循环仅执行2次终止问题排查

二分法循环提前终止的问题排查与修复

我看了你的二分法实现代码,问题主要出在循环逻辑写反了,再加上初始误差值设置不合理,咱们一步步拆解清楚:

核心问题:循环条件完全搞反了

你的while循环写的是:

while eA < max_eA and total_iter < iteration+1:

这意味着只有当误差已经小于允许值的时候,才会继续循环——这完全和我们想要的逻辑相反!

正确的逻辑应该是:只要误差还没达标(eA > max_eA),并且还没达到最大迭代次数,就继续执行循环。所以循环条件必须改成:

while total_iter < iteration and eA > max_eA:

辅助问题:初始误差值设置不当

你把eA初始设为0,这会让第一次循环直接满足错误的eA < max_eA条件,但实际上第一次迭代前我们还没有有效误差数据,应该把eA初始设为一个远大于max_eA的值(比如1),这样才能保证第一次循环正常启动。

其他可以优化的细节

  • 代码里x_l = x_l这种完全多余的赋值可以直接删掉,比如第一个分支只需要写x_u = Xr;
  • 初始的Xr计算可以整合到循环里,避免重复代码;
  • 迭代次数判断:你写的total_iter < iteration+1会多执行一次(比如iteration=20会跑21次),直接用total_iter < iteration更准确。

修改后的完整代码

def bisection(f, Xl, Xu, max_eA, iteration):
    x_l = Xl
    x_u = Xu
    # 初始设为大于max_eA的值,保证第一次循环能执行
    eA = 1
    total_iter = 0
    if f(Xl)*f(Xu) >= 0:
        print("Bisection method fails.")
        return None
    # 修正后的循环条件
    while total_iter < iteration and eA > max_eA:
        print("iteration", total_iter+1)
        xr_old = (x_l + x_u)/2
        print("xr old", xr_old)
        Xr = xr_old
        f_xr = f(Xr)
        if f_xr == 0:
            print("Found exact solution.")
            print("Xr fix", Xr)
            return Xr
        elif f(x_l)*f_xr < 0:
            x_u = Xr
            print("x_l use", x_l)
            print("x_u use", x_u)
        elif f(x_l)*f_xr > 0:
            x_l = Xr
        else:
            print("Bisection method fails.")
            return None
        xr_new = (x_l + x_u)/2
        print("xr new", xr_new)
        print("xr old 2", xr_old)
        print("ea use", eA)
        # 计算误差,避免除以0的情况
        if xr_new != 0:
            eA = abs((xr_new - xr_old)/xr_new)
        else:
            eA = 0
        print("max ea", max_eA)
        print("eA after calculate", eA)
        total_iter += 1
    return (x_l + x_u)/2

f = lambda x: ((10000000 * (1.2 ** x)) / ((1.2 ** x) - 1)) \
            + ((-10000000*x) / ((1.2 ** x) - 1)) \
            + 10000000
print(bisection(f,5,10,0.0001,20))

为什么会出现你遇到的现象?

  • 保留两个条件时:第一次循环后eA变为0,第二次循环计算后eA突然变成0.2(远大于0.0001),此时eA < max_eA不成立,循环直接终止;
  • 移除最大误差条件后:循环只受迭代次数控制,所以能执行到设定的20次;
  • 移除最大迭代次数条件后:第二次循环后eA=0.2>0.0001,但你的循环条件要求eA < max_eA才继续,不满足就停止,所以只执行2次。

内容的提问来源于stack exchange,提问作者apin pipin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:22:44