如何查看scipy.integrate.quad计算积分时函数f的调用x值?
实现方法
- 不用全局变量也能搞定,用闭包记录求值点更干净。先初始化一个列表存x值,再写个包装函数,每次调用原函数时把传入的x塞进列表里
- 把这个包装函数传给
quad,自适应积分过程中所有被调用的x值就都会被记录下来
示例代码:
import numpy as np import matplotlib.pyplot as plt from scipy.integrate import quad # 原函数定义 def f(x): return 1 / x**2 # 存储求值点的列表 eval_points = [] # 包装函数:记录x值并执行原函数逻辑 def wrapped_f(x): eval_points.append(x) return f(x) # 调用quad计算积分 result, error = quad(wrapped_f, 0, 1) # 查看求值情况 print(f"总求值次数: {len(eval_points)}") print(f"前10个求值点: {eval_points[:10]}") # 绘制求值点分布直方图 plt.hist(eval_points, bins=50, edgecolor='black') plt.xlabel('x 取值') plt.ylabel('求值次数') plt.title('[0,1]区间内f(x)的求值点分布') plt.xlim(0, 1) plt.show()
补充说明
- 由于
f(x)=1/x²在x趋近于0时发散,quad会自动在靠近0的区域增加求值次数,所以直方图里靠近0的区间频次会明显更高 - 要是你坚持用全局变量,只需要把
eval_points声明为全局变量,在wrapped_f里加global eval_points即可,但闭包的方式更清爽,不会污染全局命名空间
内容的提问来源于stack exchange,提问作者tinky
相关产品推荐
相关产品推荐

