如何将一个类似Dirac-delta的函数与scipy.integrate.quad集成?

epggiuax  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(167)

我想集成一个从0到+inf的函数,如下图所示。

在以x=1为中心的小区间之外,它迅速地变为0。两个最大值的位置是未知的。最小值的位置是已知的。

oyjwcjzk

oyjwcjzk1#

如果您知道脉冲的宽度,但不知道其位置,则必须使用宽度的50%的步长扫描域。
您可以使用points参数将quad转换为this。然而,quad也有对函数采样次数的限制,因此相应地增加。
这里是一个使用标准quad调用和带有推荐参数的调用的示例
r1[0]消失是因为quad没有意识到这些脉冲的存在,r1[0]随着脉冲的宽度线性减小,但是随着脉冲变窄,它变得更慢。

from scipy.integrate import quad
import numpy as np
w = 1
fn = lambda x: sum(np.exp(-(x - cx)**2/(2*w**2)) for cx in [1, 3**0.5, 2*np.pi])
for w in [1, 0.1, 0.01, 0.001]:
    r1 = quad(fn, -10, 10)
    r2 = quad(fn, 0, 10, 
              points=np.arange(-10, 10, w/2), 
              limit=max(100, int(4*20/w)))
    print(w, r1, r2)

相关问题