我不明白如何用tplquad
函数来定义Scipy中三重积分的积分极限。我正在使用Christian Hill的书 Learning Scientific Programming With Python 并试图解决problem E8.14:
单位球的体积4π/3可以表示为具有恒定极限的球极坐标中的三重积分:
我试图评估这个积分:
import scipy.integrate as integrate
#define the integrand
f = lambda r, theta, phi: r**2 * np.sin(theta)
#integrate with tplquad
V_unit_sphere, _ = integrate.tplquad(f, 0,1,0,np.pi,0,2*np.pi)
V_unit_sphere
我的输出是165…显然不等于4pi/3。
Hill的解决方案:
from scipy.integrate import tplquad
In [x]: tplquad(lambda phi, theta, r: r**2 * np.sin(theta),
0, 1,
lambda theta: 0, lambda theta: np.pi,
lambda theta, phi: 0, lambda theta, phi: 2*np.pi)
Out[x]: (4.18879020478639, 4.650491330678174e-14)
我不明白为什么希尔要定义phi, theta, r
的被积函数,而积分则反过来,我也不明白为什么即使积分的所有极限都是常数,它们一定要定义为依赖于某个变量。我也不明白为什么theta的积分极限依赖于theta,为什么phi的极限依赖于phi * 和 * theta。
1条答案
按热度按时间7lrncoxx1#
虽然课本上的解决方法可行,但我认为这不是解决这个问题的正确方法。
根据
scipy.integrate.tplquad
的文档,集成函数应该定义为f(z,y,x)
,并且它将按照该顺序集成(z
,y
,然后x
)。在示例中,积分顺序是r
、theta
、phi
,因此函数应该是f(r, theta, phi)
,正如您定义的那样。极限的定义顺序相反,因此前两个极限是
x
(在本例中为phi
)的积分极限,其次是y
(theta
),最后是z
(r
)。因为积分的顺序是z
,y
,然后是x
,所以z
的极限可以是x
和y
的函数,而y
的极限可以是x
的函数。在这种情况下,限制都是常量,所以我们可以只提供常量(Hill使用返回常量的函数,这更一般,但结果相同)。我认为代码应该是:
故事的寓意:**仅仅因为它工作并且写在书中并不意味着它是正确的方法。**总是自己测试东西并阅读文档。