`points` 在 `integrate.quad` 中是如何工作的?

How does `points` work in `integrate.quad`?

我有一个复杂的函数,我无法理解其集成行为:

  1. points 是否指定 间隔 可能的奇点,或
  2. 无论上面的答案是什么,如何解释 2.1 有效但 2 无效? (还有 15、...)请注意,奇异点的唯一主题是 0,但即使没有 / w,函数也不会在那里和附近为 0。
  3. 即使删除了 / w,行为仍然存在

import numpy as np
from scipy.integrate import quad

def fn(w, mu=11.316582914572866):
    return (np.exp(-1 / (1 - ((w - mu) * (np.abs(w - mu) < .999))**2))
            ) * (np.abs(w - mu) < .999) / w

for pt2 in (1.0, 2.0, 2.1, 5.0):
    print(pt2, '--', quad(fn, 1e-8, 40, points=(0, pt2))[0])
1.0 -- 0.039282478570060606
2.0 -- 0.0
2.1 -- 0.03928247857037831
5.0 -- 0.03928247859275705
  1. 您的积分应该在您指定的积分区间内,即0无效。
  2. quad基于数值积分,由采样和加权函数评估组成。在您的函数中添加一个 print(w) 可以让您看到此采样发生的位置。
  3. 从输出来看,quad 似乎是 运行 分开的,例如[1e-8, 2][2, 40].
  4. 输出还显示没有足够接近 mu 的样本。因此,quad 只看到一个几乎始终为零的函数,因此是结果。
根据文档,

points 用于指示积分区间中的“有趣”区域。给出的点用于初始细分。因此,给出 points=(mu,) 会将 [0,40] 上的积分细分为区间 [0,mu] 和 [mu,40]。中点值不会落在通过端点值的线上,因此误差估计将不为零,并触发进一步细分以对函数进行适当的采样。也可以给出所有 points=(mu-1,mu,mu+1) 以便在第一步中处理外部间隔。这都不需要很精确,得到函数的特征所在的细分点或者特征大小的区间就可以了。

for pt2 in (1.0, 2.0, 2.1, 5.0):
    print(pt2, '--', quad(fn, 1e-8, 40, points=(11,))[0])
1.0 -- 0.03928247857032486
2.0 -- 0.03928247857032486
2.1 -- 0.03928247857032486
5.0 -- 0.03928247857032486

for pt2 in (1.0, 2.0, 2.1, 5.0):
    print(pt2, '--', quad(fn, 1e-8, 40, points=(9,13))[0])
1.0 -- 0.039282478570323645
2.0 -- 0.039282478570323645
2.1 -- 0.039282478570323645
5.0 -- 0.039282478570323645