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

如何查看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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:00:49