如何在Python中求解函数所有根?numpy linspace求解结果异常
解决numpy中无法获取所有根的问题
哈哈,这个问题我之前也碰到过!原因其实很简单——你用np.linspace(-3,3,100)生成的是离散的100个点,而-2和2这两个根刚好不在这100个点里,对应的y值只是非常接近0,但不是严格等于0,所以y==0自然匹配不到它们,只能找到刚好落在1这个点上的值。
下面给你两种靠谱的解决方法:
方法1:从现有离散数据中匹配近似根
既然y值是接近0而不是严格等于0,我们可以用np.isclose()函数来判断y是否接近0,通过设置容差(atol)来控制匹配的严格程度:
import numpy as np x = np.linspace(-3,3,100) y = (x+2)*(x-1)*(x-2) # 匹配y接近0的点,容差设为1e-9(可以根据需求调整) roots = x[np.isclose(y, 0, atol=1e-9)] print("近似根:", roots) # 如果需要得到整数形式的结果,可以四舍五入 rounded_roots = np.round(roots).astype(int) print("整数根:", rounded_roots)
运行后就能得到[-2 1 2]的结果啦。
方法2:直接求解多项式方程(更精确)
既然你已经知道函数的多项式表达式,直接用numpy的np.roots()求解会更准确,不需要依赖离散的x点:
首先把多项式展开:y = (x+2)*(x-1)*(x-2) = x³ - x² -4x +4,对应的系数数组是[1, -1, -4, 4](从最高次到常数项):
import numpy as np # 多项式系数:x³ -x² -4x +4 coeffs = [1, -1, -4, 4] roots = np.roots(coeffs) # 排序后得到预期的顺序 sorted_roots = np.sort(roots) print("精确根:", sorted_roots)
这个方法会直接输出[-2. 1. 2.],完全符合你的预期结果,而且精度更高。
内容的提问来源于stack exchange,提问作者bepoli
相关产品推荐
相关产品推荐

