我想计算一个球体和无限圆柱在一定距离 b 处相交的体积,我想我会使用一个快速而肮脏的 python 脚本来完成。我的要求是一个 <1s 的计算,具有 >3 个有效数字。
我的想法是这样的:我们放置半径为 R 的球体,使其中心位于原点,我们放置半径为 R' 的圆柱体,使其轴在 z 中从 (b,0,0 )。我们在球体上积分,使用一个阶跃函数,如果我们在圆柱体内部,则返回 1,如果不是,则返回 0,因此在受球体和圆柱体内部约束的集合上积分 1,即相交。
我用 scipy.intigrate.tplquad 试过这个。它没有成功。我认为这是因为 step 函数的不连续性,因为我收到以下警告。当然,我可能只是做错了。假设我没有犯一些愚蠢的错误,我可以尝试制定相交的范围,从而消除对阶跃函数的需要,但我想我可能会先尝试获得一些反馈。任何人都可以发现任何错误,或者指出一些简单的解决方案。
警告:已达到最大细分数 (50)。
如果增加限制没有改善,建议分析
被积函数以确定困难。如果可以确定局部难度的位置(奇点、不连续性),则可能会从拆分区间并调用子范围上的积分器中获益。也许应该使用专用的积分器。
代码:
from scipy.integrate import tplquad
from math import sqrt
def integrand(z, y, x):
if Rprim >= (x - b)**2 + y**2:
return 1.
else:
return 0.
def integral():
return tplquad(integrand, -R, R,
lambda x: -sqrt(R**2 - x**2), # lower y
lambda x: sqrt(R**2 - x**2), # upper y
lambda x,y: -sqrt(R**2 - x**2 - y**2), # lower z
lambda x,y: sqrt(R**2 - x**2 - y**2), # upper z
epsabs=1.e-01, epsrel=1.e-01
)
R=1
Rprim=1
b=0.5
print integral()