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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:45:02