如何在 Python 中计算复杂 3D 形状上的体积积分?

问题描述

我想在一个圆柱体上计算函数 f(x,y,z) 的体积积分,圆柱体的底部具有类似体育场的形状(它是一个两端有半圆的矩形)。

enter image description here

虽然我可以对空间中的每个点 (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

enter image description here