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
相关产品推荐
相关产品推荐

