问题描述
我想在一个圆柱体上计算函数 f(x,y,z) 的体积积分,圆柱体的底部具有类似体育场的形状(它是一个两端有半圆的矩形)。
虽然我可以对空间中的每个点 (x,z) 计算 f(x,z) 并且形状本身相对简单,但我找不到一种方法来分析地写下x、y 和 z(或任何其他常见坐标,如球面或圆柱)的积分,因为原点在体积之外(由于其他原因,我不能只是将原点移动到更合适的位置)。
因此,我真的认为唯一的方法就是用数字来做。这是我第一次遇到这个问题,但我想用 Python 来做。我搜索了 Python 模块,标准的似乎是 scipy.integrate(我猜 Numpy 也有类似的功能),但是这些功能需要集成的限制,我无法指定。有没有办法使用 scipy.integrate 克服这个问题?
解决方法
在任意形状上积分函数的一种可靠方法是首先创建该域的网格,例如由四面体组成,然后在所有四面体上积分函数并求和结果。 >
有各种 Python 包可以帮助您解决这个问题(其中一些是我提供的)。
有关网格划分,请参阅 https://stackoverflow.com/a/37797164/353337。
对于四面体的集成,请检查 quadpy。
这里有一个例子:
import pygmsh
import numpy as np
import quadpy
with pygmsh.occ.Geometry() as geom:
union = geom.boolean_union([
geom.add_rectangle((0.0,0.0,0.0),1.0,1.0),geom.add_disk((0.0,0.5),geom.add_disk((1.0,])
geom.extrude(union,[0,1])
mesh = geom.generate_mesh()
tetra = mesh.get_cells_type("tetra")
t = np.moveaxis(mesh.points[tetra],1)
scheme = quadpy.t3.get_good_scheme(5)
val = scheme.integrate(
lambda x: np.exp(x[0]),t
)
print(np.sum(val))
3.3393111615779754