如何在 Python 中计算复杂 3D 形状的体积积分?
How to calculate numerically a volume integral over a complicated 3D shape in Python?
我想计算函数 f(x,y,z) 在圆柱体上的体积积分,该圆柱体的底部具有类似体育场的形状(它是两端带有半圆的矩形)。
虽然我可以为 space 中的每个点 (x,y,z) 计算 f(x,y,z) 并且形状本身相对简单,但我找不到方法假设原点在体积之外(我不能只是将原点移动到更合适的位置,因为其他原因)。
因此,我真的认为唯一的办法就是用数字来做。这是我第一次遇到这个问题,但我想在 Python 中进行。我搜索了 Python 模块,标准的似乎是 scipy.integrate (我猜 Numpy 也有类似的功能),但这些功能需要集成的限制,我无法指定。有没有办法使用 scipy.integrate 来解决这个问题?
在任意形状上集成函数的一种可靠方法是首先创建该域的 网格 ,例如由四面体构成,然后在所有四面体上集成函数并求和结果。
有各种 Python 软件包可以帮助您(其中一些是我提供的)。
关于网格划分,请参见 。
要在四面体上积分,请选中 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), 0.5),
geom.add_disk((1.0, 0.5), 0.5),
])
geom.extrude(union, [0, 0, 1])
mesh = geom.generate_mesh()
tetra = mesh.get_cells_type("tetra")
t = np.moveaxis(mesh.points[tetra], 0, 1)
scheme = quadpy.t3.get_good_scheme(5)
val = scheme.integrate(
lambda x: np.exp(x[0]),
t
)
print(np.sum(val))
3.3393111615779754
我想计算函数 f(x,y,z) 在圆柱体上的体积积分,该圆柱体的底部具有类似体育场的形状(它是两端带有半圆的矩形)。
虽然我可以为 space 中的每个点 (x,y,z) 计算 f(x,y,z) 并且形状本身相对简单,但我找不到方法假设原点在体积之外(我不能只是将原点移动到更合适的位置,因为其他原因)。
因此,我真的认为唯一的办法就是用数字来做。这是我第一次遇到这个问题,但我想在 Python 中进行。我搜索了 Python 模块,标准的似乎是 scipy.integrate (我猜 Numpy 也有类似的功能),但这些功能需要集成的限制,我无法指定。有没有办法使用 scipy.integrate 来解决这个问题?
在任意形状上集成函数的一种可靠方法是首先创建该域的 网格 ,例如由四面体构成,然后在所有四面体上集成函数并求和结果。
有各种 Python 软件包可以帮助您(其中一些是我提供的)。
关于网格划分,请参见 。
要在四面体上积分,请选中 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), 0.5),
geom.add_disk((1.0, 0.5), 0.5),
])
geom.extrude(union, [0, 0, 1])
mesh = geom.generate_mesh()
tetra = mesh.get_cells_type("tetra")
t = np.moveaxis(mesh.points[tetra], 0, 1)
scheme = quadpy.t3.get_good_scheme(5)
val = scheme.integrate(
lambda x: np.exp(x[0]),
t
)
print(np.sum(val))
3.3393111615779754