Python递归实现二分法求根结果不符合预期问题求助
代码问题排查与修复方案
核心问题梳理
- 缺少二分法终止判断逻辑:没有检测当前区间长度是否小于设置的
accuracy精度值,只要中点函数值≥0就会直接打印输出,不会继续缩小区间,导致得到的是第一个满足f(中点)≥0的点,而非达到精度要求的根 - 区间更新逻辑不完整:只处理了中点函数值小于0时更新左边界的情况,中点函数值大于0时没有更新右边界的逻辑,无法持续缩小区间到精度要求
- 缺少numpy依赖导入:原代码没有导入numpy库,直接运行会抛出名称未定义的报错
修复后完整代码
import numpy as np def continousfunction(xpoint): output = float(np.power(xpoint, 2) - np.log1p(1 + xpoint) - 30) return output def processinterval(a, b): intervalmidpoint = (a + b) / 2 return intervalmidpoint def findroot(a, b, accuracy): # 增加区间有效性校验,避免输入区间无符合要求的根 if continousfunction(a) * continousfunction(b) > 0: print("输入区间两端点函数值同号,无法使用二分法求根") return if continousfunction(a) < 0 and continousfunction(b) > 0: return bisection(a, b, accuracy) def bisection(a, b, accuracy): # 先判断区间是否达到精度要求 if b - a < accuracy: final_root = processinterval(a, b) print(f"符合精度要求的根为: {final_root}, 对应函数值为: {continousfunction(final_root)}") return final_root intervalmidpoint = processinterval(a,b) mid_val = continousfunction(intervalmidpoint) # 函数值足够接近0时直接返回精确根 if abs(mid_val) < 1e-9: print(f"找到精确根为: {intervalmidpoint}, 对应函数值为: {mid_val}") return intervalmidpoint if mid_val < 0: # 根在右半区间,更新左端点 return bisection(intervalmidpoint, b, accuracy) else: # 根在左半区间,更新右端点 return bisection(a, intervalmidpoint, accuracy) def main(): a = 4 b = 6 accuracy = 0.002 findroot(a, b, accuracy) main()
运行说明
修复后运行即可得到符合0.002精度要求的根,对应函数值接近0,满足预期结果。
内容的提问来源于stack exchange,提问作者Weightlifting Without Limits
相关产品推荐
相关产品推荐

