递归实现的二分法求根算法无法正常运行,求问题排查
二分法代码问题排查及修复
存在的问题
- 缺少numpy依赖导入:代码中使用了
np开头的numpy方法,但没有导入numpy库 - 递归逻辑完全错误:原代码中判断符号时,计算的是
中点函数值 * 中点函数值(因为processinterval(a,b)返回的就是中点intervalmidpoint),二者乘积永远非负,完全不符合二分法判断区间端点符号的逻辑 - 没有设置递归终止条件:传入的
accuracy参数全程未被使用,递归不会主动停止,会触发栈溢出错误 - 无返回值传递:
findroot函数调用recursivefunction没有加return,recursivefunction内部递归调用自身也没有加return,即使得到正确根也无法返回结果 - 边界判断缺失:仅判断了
f(a)<0且f(b)>0的情况,没有处理函数值为0、符号相反的其他情况,也没有预先判断区间端点函数值是否异号的校验
修复后的可运行代码
import numpy as np def calculatefunction2(c0): output = float(np.power(c0, 2) - np.log1p(1 + c0) - 30) return output def processinterval(a, b): intervalmidpoint = (a + b) / 2 return intervalmidpoint def findroot(a, b, accuracy): # 先校验区间端点是否异号 fa = calculatefunction2(a) fb = calculatefunction2(b) if fa * fb > 0: raise ValueError("区间两端点函数值同号,无法使用二分法求根") if fa == 0: return a if fb == 0: return b return recursivefunction(a, b, accuracy) def recursivefunction(a, b, accuracy): # 终止条件:区间长度小于等于精度要求 if b - a <= accuracy: return (a + b) / 2 mid = processinterval(a, b) f_mid = calculatefunction2(mid) if f_mid == 0: return mid # 判断中点和左端点符号是否异号,异号则根在左半区间,否则在右半区间 if f_mid * calculatefunction2(a) < 0: return recursivefunction(a, mid, accuracy) else: return recursivefunction(mid, b, accuracy) def main(): a = 4 b = 6 accuracy = 0.002 root = findroot(a, b, accuracy) print(f"求得的根为:{root}") print(f"代入函数验证结果:{calculatefunction2(root)}") main()
内容的提问来源于stack exchange,提问作者Weightlifting Without Limits
相关产品推荐
相关产品推荐

