如何使用tplquad在SciPy中定义三重积分的积分极限?

zf2sa74q  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(164)

我不明白如何用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。

7lrncoxx

7lrncoxx1#

虽然课本上的解决方法可行,但我认为这不是解决这个问题的正确方法。
根据scipy.integrate.tplquad的文档,集成函数应该定义为f(z,y,x),并且它将按照该顺序集成(zy,然后x)。在示例中,积分顺序是rthetaphi,因此函数应该是f(r, theta, phi),正如您定义的那样。
极限的定义顺序相反,因此前两个极限是x(在本例中为phi)的积分极限,其次是ytheta),最后是zr)。因为积分的顺序是zy,然后是x,所以z的极限可以是xy的函数,而y的极限可以是x的函数。在这种情况下,限制都是常量,所以我们可以只提供常量(Hill使用返回常量的函数,这更一般,但结果相同)。
我认为代码应该是:

import numpy as np
from scipy.integrate import tplquad

volume = tplquad(lambda r, theta, phi: r**2*np.sin(theta),
                 0, 2*np.pi,            # limits of integration for phi
                 0, np.pi,              # limits of integration for theta
                 0, 1)                  # limits of integration for r

print(volume)           # (4.18879020478639, 4.650491330678174e-14)

故事的寓意:**仅仅因为它工作并且写在书中并不意味着它是正确的方法。**总是自己测试东西并阅读文档。

相关问题