scipy.integrate.tplquad对大体积积分给出错误的结果

时间:2018-07-10 12:54:50

标签: python scipy integrate quad

我正在尝试在所有空间上集成3个变量f(x,y,z)的函数。

当我进行少量集成时,我得到的结果大致正确。但是,当我增加积分量时,python表示积分为零。

我非常有信心,这里的问题是函数f在很小的空间区域内只是非零的,并且当积分量很大时,tplquad在该区域的采样不够。我在此链接中找到了针对1D中类似问题的答案。 scipy.integrate.quad gives wrong result on large ranges。一维解决方案是将参数“ points”传递给scipy.integrate.quad,这有助于Quad将焦点集中在积分不为零的区间上。

我的问题是; tplquad是否有与“点”类似的论点? 还是我可以指示tplquad专注于特定空间区域的其他方式?

1 个答案:

答案 0 :(得分:1)

方法tplquad只是nquad的包装,它没有公开后者的所有选项。使用nquad,它支持通过points参数将quad传递到opts。一个简单的示例,所有范围都具有相同的点:

import numpy as np
from scipy.integrate import nquad
f = lambda x, y, z: np.exp(-x**2-y**2-z**2)
nquad(f, [[-150, 90], [-150, 90], [-150, 90]])[0]   # 2.260158041551299e-16, wrong
nquad(f, [[-150, 90], [-150, 90], [-150, 90]], opts={"points": [-5, 5]})[0]   # 5.568327996820292, correct

通常,opts可以是多重集成的不同步骤的不同选项的列表,points可以在它们之间有所不同。它们还可以依赖于其他变量,例如积分限制。请参阅文档中的示例。