【发布时间】:2021-09-09 15:48:00
【问题描述】:
我有一个函数,我需要估计它在许多不同间隔上的定积分,其中一些端点彼此非常接近,
\int_a^{b_k} f(x) dx
我可以为每个间隔重新调用integrate.quad,但这似乎效率很低,因为integrate.quad 将为每次调用多次评估该函数。有什么方法可以重用 quad 已经评估的点来更快地对quad 进行后续调用?
(如果不是 integrate.quad,可能是另一个 scipy 函数或使用不同的公共 python 库?)
或者也许我应该缓存我之前的整数值,然后调用quad 来计算新点与之前最近计算的点之间的差异?
还要注意,所选端点并非都是预先知道的,它们是自适应选择的。
【问题讨论】:
-
quad可以提供很多额外信息(您可以尽我所能阅读),但我看不到返回(或提供)实际集成点和价值观。但是评估你的功能有多昂贵?为新案例缓存和修改值可能与“原始”计算一样昂贵。 -
也许您可以使用不同的集成方法。据说
quad的一个优点是它选择了一个最佳(或至少是好的)评估点数(我还没有研究过细节)。另一方面,对于trapezoid之类的东西,您提供x和y值的数组。根据功能和所需精度,可能需要比quad更多的点,但可以使用numpy数组方法“一次性”评估它们。 -
谢谢。评估可能相当昂贵:O(1000) 三角函数评估,我需要它实时。我发现
quad可以返回这些子区间的子区间和积分近似值。我不确定使用什么方法来计算子区间上的值(我验证它不仅仅是梯形),但它们确实与完整积分的值相加。也许我可以做一次完整的积分,保留这些点及其值,然后对它们之间的点进行自己的插值。 -
序列
bₖ,是单调的吗? -
不一定,但假设单调 b_k 的部分解决方案仍然有用。
标签: python scipy integration numeric quad