`points` 在 `integrate.quad` 中是如何工作的?
How does `points` work in `integrate.quad`?
我有一个复杂的函数,我无法理解其集成行为:
points
是否指定 间隔 可能的奇点,或 点 ?
- 无论上面的答案是什么,如何解释
2.1
有效但 2
无效? (还有 1
、5
、...)请注意,奇异点的唯一主题是 0,但即使没有 / w
,函数也不会在那里和附近为 0。
- 即使删除了
/ 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
- 您的积分应该在您指定的积分区间内,即
0
无效。
quad
基于数值积分,由采样和加权函数评估组成。在您的函数中添加一个 print(w)
可以让您看到此采样发生的位置。
- 从输出来看,quad 似乎是 运行 分开的,例如
[1e-8, 2]
和 [2, 40]
.
- 输出还显示没有足够接近
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
我有一个复杂的函数,我无法理解其集成行为:
points
是否指定 间隔 可能的奇点,或 点 ?- 无论上面的答案是什么,如何解释
2.1
有效但2
无效? (还有1
、5
、...)请注意,奇异点的唯一主题是 0,但即使没有/ w
,函数也不会在那里和附近为 0。 - 即使删除了
/ 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
- 您的积分应该在您指定的积分区间内,即
0
无效。 quad
基于数值积分,由采样和加权函数评估组成。在您的函数中添加一个print(w)
可以让您看到此采样发生的位置。- 从输出来看,quad 似乎是 运行 分开的,例如
[1e-8, 2]
和[2, 40]
. - 输出还显示没有足够接近
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