scipy库PPoly.roots方法疑似Bug:区间内根无法被检测
解答
这不是使用错误,而是PPoly.roots()方法的内部逻辑导致的问题。
核心原因
当extrapolate=False时,该方法仅在每个分段多项式的开区间内搜索根,并且会忽略端点处的近似0值(哪怕数值极接近0,只要不是严格等于0就不会被判定为根)。你的案例中x[1]处的函数值是6.07e-18,属于浮点近似的0而非严格0,因此被排除;同时原区间内的根可能因靠近端点,被方法的根检测逻辑遗漏,导致无结果返回。
当extrapolate=True时,方法会将多项式外推到定义区间之外,外推后的多项式会产生额外根,但同时也涵盖了原区间内的正确根。
解决思路
- 手动确认根的存在:在区间[x[0], x[1]]内采样计算函数值,能看到函数值从负过渡到正,可直接证明根的存在。
- 调整端点或区间:若将x[1]处的函数值设为严格0,
roots(extrapolate=False)会识别该端点为根;或稍微缩小区间范围,让根落在新的开区间内,方法即可检测到。 - 换用根查找工具:使用
scipy.optimize.root_scalar,传入区间[x[0], x[1]]和多项式函数,可直接找到根,不受PPoly.roots()的端点逻辑限制。
内容的提问来源于stack exchange,提问作者Roobie Nuby
相关产品推荐
相关产品推荐

