Python 积分在integrate.quad中是如何工作的?
我有一个复杂的函数,我无法理解它的集成行为:Python 积分在integrate.quad中是如何工作的?,python,scipy,numerical-methods,Python,Scipy,Numerical Methods,我有一个复杂的函数,我无法理解它的集成行为: 点是否指定了可能的奇点或点的间隔 无论上述答案是什么,如何解释2.1工作而不是2?(还有1,5,…)请注意,奇点的唯一主题是0,但如果没有/w,情况甚至不是这样,函数在那里和附近都是0 即使删除了/w,行为仍然存在 将numpy导入为np 从scipy.integrate导入四元组 def fn(w,mu=11.316582914572866): 回报率(np.exp(-1/(1-((w-mu)*(np.abs(w-mu)
点
是否指定了可能的奇点或点的间隔2.1
工作而不是2
?(还有1
,5
,…)请注意,奇点的唯一主题是0,但如果没有/w
,情况甚至不是这样,函数在那里和附近都是0/w
,行为仍然存在将numpy导入为np
从scipy.integrate导入四元组
def fn(w,mu=11.316582914572866):
回报率(np.exp(-1/(1-((w-mu)*(np.abs(w-mu)<.999))**2))
)*(np.abs(w-mu)<.999)/w
对于pt2英寸(1.0,2.0,2.1,5.0):
打印(pt2,'--',四边形(fn,1e-8,40,点=(0,pt2))[0])
0
无效quad
基于数值积分,包括采样和加权函数评估。在函数中添加一个print(w)
,可以让您查看采样发生的位置[1e-8,2]
和[2,40]
上的mu
附近没有采集足够的样本。因此,quad
只看到一个几乎始终为零的函数,因此得到结果0
无效quad
基于数值积分,包括采样和加权函数评估。在函数中添加一个print(w)
,可以让您查看采样发生的位置[1e-8,2]
和[2,40]
上的mu
附近没有采集足够的样本。因此,quad
只看到一个几乎始终为零的函数,因此得到结果点
根据文档,用于指示积分间隔中的“有趣”区域。给定的点用于初始细分。因此给出点=(mu,)
将[0,40]上的积分细分为区间[0,mu]和[mu,40]。中点值不在通过端点值的直线上,因此误差估计值将不为零,并触发进一步细分,以实现函数的适当采样。还可以给出所有点=(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
或
1.0--0.039282478570323645
2.0 -- 0.039282478570323645
2.1 -- 0.039282478570323645
5.0 -- 0.039282478570323645
点
根据文档,用于指示集成间隔中的“感兴趣”区域。给定的点用于初始细分。因此给出点=(mu,)
将[0,40]上的积分细分为区间[0,mu]和[mu,40]。中点值不在通过端点值的直线上,因此误差估计值将不为零,并触发进一步细分,以实现函数的适当采样。还可以给出所有点=(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
或
1.0--0.039282478570323645
2.0 -- 0.039282478570323645
2.1 -- 0.039282478570323645
5.0 -- 0.039282478570323645
将0更改为1e-8没有什么区别(至少在这里是这样),但我确实通过2确认了4,这很有帮助。积分
行为仍然是一个谜,“区间对积分”的问题没有得到解决。区间对积分的问题我没有一个确定的答案,但我强烈倾向于区间。例如,使用点=[2]
,产生间隔[1e-8,2]
和[2,40]
。采样点表明在这些间隔上连续运行quad
。检查源代码并没有为我提供关于到底发生了什么的额外线索。+1提供有用的信息,我同意points
是更可能的间隔,但保持q打开,以便更明确地采取行动。在我看来,点
移动采样空间,有可能完全错过狭窄的非零区域。我最终选择了trapz
,因为关键行为很容易预测。将0更改为1e-8没有什么区别(至少在这里),但我确实通过2确认了4,这很有帮助。积分
行为仍然是一个谜,“区间对积分”的问题没有得到解决。区间对积分的问题我没有一个确定的答案,但我强烈倾向于区间。例如,使用点=[2]
,产生间隔[1e-8,2]
和[2,40]
。采样点表明在这些间隔上连续运行quad
。检查源代码并没有为我提供关于到底发生了什么的额外线索。+1提供有用的信息,我同意points
是更可能的间隔,但保持q打开,以便更明确地采取行动。在我看来,点
改变了采样空间,有可能完全错过了narro
for pt2 in (1.0, 2.0, 2.1, 5.0):
print(pt2, '--', quad(fn, 1e-8, 40, points=(9,13))[0])