向量积分的应用

要在一个区域内对标量或矢量场进行积分,我们首先需要定义一个区域。SymPy 提供了三种定义区域的方法:

  1. 使用参数方程与 ParametricRegion

  2. 使用隐式方程与 ImplicitRegion

  3. 使用几何模块的对象。

函数 vector_integrate() 用于对任何类型的区域上的标量或向量场进行积分。它根据对象的性质自动确定积分的类型(线积分、面积分或体积分)。

我们定义一个坐标系并为示例进行必要的导入。

>>> from sympy import sin, cos, exp, pi, symbols
>>> from sympy.vector import CoordSys3D, ParametricRegion, ImplicitRegion, vector_integrate
>>> from sympy.abc import r, x, y, z, theta, phi
>>> C = CoordSys3D('C')

周长、表面积和体积的计算

要计算圆的周长,我们需要先定义它。让我们使用其参数方程来定义它。

>>> param_circle = ParametricRegion((4*cos(theta), 4*sin(theta)), (theta, 0, 2*pi))

我们也可以使用其隐式方程来定义一个圆。

>>> implicit_circle = ImplicitRegion((x, y), x**2 + y**2 - 4)

一个图形的周长等于其在单位标量场上的积分的绝对值。

>>> vector_integrate(1, param_circle)
8*pi
>>> vector_integrate(1, implicit_circle)
4*pi

假设用户想要计算三角形的周长。确定三角形的参数表示可能很困难。相反,用户可以使用几何模块中的 Polygon 类对象。

>>> from sympy.geometry import Point, Polygon
>>> triangle = Polygon(Point(1, 2), (3, 5), (1,6))
>>> vector_integrate(1, triangle)
sqrt(5) + sqrt(13) + 4

要定义一个实心球体,我们需要使用三个参数(r、theta 和 phi)。对于 ParametricRegion 对象,极限的顺序决定了积分的符号。

>>> solidsphere = ParametricRegion((r*sin(phi)*cos(theta),r*sin(phi)*sin(theta), r*cos(phi)),
...                             (phi, 0, pi), (theta, 0, 2*pi), (r, 0, 3))
>>> vector_integrate(1, solidsphere)
36*pi

物体的质量计算

考虑一个三角形薄片 ( R ),其顶点为 (0,0), (0, 5), (5,0),且密度为 \(\rho(x, y) = xy\:kg/m^2\)。求总质量。

>>> triangle = ParametricRegion((x, y), (x, 0, 5), (y, 0, 5 - x))
>>> vector_integrate(C.x*C.y, triangle)
625/24

求一个以z轴为中心的圆柱体的质量,该圆柱体高度为h,半径为a,密度为 \(\rho = x^2 + y^2\:kg/m^2\)

>>> a, h = symbols('a h', positive=True)
>>> cylinder = ParametricRegion((r*cos(theta), r*sin(theta), z),
...                     (theta, 0, 2*pi), (z, 0, h), (r, 0, a))
>>> vector_integrate(C.x**2 + C.y**2, cylinder)
pi*a**4*h/2

通量计算

考虑一个空间区域,其中存在一个恒定的矢量场 \(E(x, y, z) = a\mathbf{\hat{k}}\)。一个半径为 r 的半球位于 x-y 平面上。该场通过球体的通量是多少?

>>> semisphere = ParametricRegion((r*sin(phi)*cos(theta), r*sin(phi)*sin(theta), r*cos(phi)),\
...                             (phi, 0, pi/2), (theta, 0, 2*pi))
>>> flux = vector_integrate(a*C.k, semisphere)
>>> flux
pi*a*r**2

2. Consider a region of space in which there is a vector field \(E(x, y, z) = x^2 \mathbf{\hat{k}}\) above the x-y plane, and a field \(E(x, y, z) = y^2 \mathbf{\hat{k}}\) below the x-y plane. What is the flux of that vector field through a cube of side length L with its center at the origin?”

该场平行于z轴,因此只有盒子的顶部和底部面会对通量产生贡献。

>>> L = symbols('L', positive=True)
>>> top_face = ParametricRegion((x, y, L/2), (x, -L/2, L/2), (y, -L/2, L/2))
>>> bottom_face = ParametricRegion((x, y, -L/2), (x, -L/2, L/2), (y, -L/2, L/2))
>>> flux = vector_integrate(C.x**2*C.k, top_face) + vector_integrate(C.y**2*C.k, bottom_face)
>>> flux
L**4/6

验证斯托克斯定理

参见 https://en.wikipedia.org/wiki/Stokes%27_theorem

示例 1
>>> from sympy.vector import curl
>>> curve = ParametricRegion((cos(theta), sin(theta)), (theta, 0, pi/2))
>>> surface = ParametricRegion((r*cos(theta), r*sin(theta)), (r, 0, 1), (theta, 0, pi/2))
>>> F = C.y*C.i + C.z*C.k + C.x*C.k
>>>
>>> vector_integrate(F, curve)
-pi/4
>>> vector_integrate(curl(F), surface)
-pi/4
示例 2
>>> circle = ParametricRegion((cos(theta), sin(theta), 1), (theta, 0, 2*pi))
>>> cone = ParametricRegion((r*cos(theta), r*sin(theta), r), (r, 0, 1), (theta, 0, 2*pi))
>>> cone = ParametricRegion((r*cos(theta), r*sin(theta), r), (r, 0, 1), (theta, 0, 2*pi))
>>> f = (-C.y**3/3 + sin(C.x))*C.i + (C.x**3/3 + cos(C.y))*C.j + C.x*C.y*C.z*C.k
>>> vector_integrate(f,  circle)
pi/2
>>> vector_integrate(curl(f),  cone)
pi/2

验证散度定理

参见 https://en.wikipedia.org/wiki/Divergence_theorem

示例 1
>>> from sympy.vector import divergence
>>> sphere = ParametricRegion((4*sin(phi)*cos(theta),4*sin(phi)*sin(theta), 4*cos(phi)),
...                         (phi, 0, pi), (theta, 0, 2*pi))
>>> solidsphere = ParametricRegion((r*sin(phi)*cos(theta),r*sin(phi)*sin(theta), r*cos(phi)),
...     (r, 0, 4),(phi, 0, pi), (theta, 0, 2*pi))
>>> field = C.x**3*C.i + C.y**3*C.j + C.z**3*C.k
>>> vector_integrate(field, sphere)
12288*pi/5
>>> vector_integrate(divergence(field), solidsphere)
12288*pi/5
示例 2
>>> cube = ParametricRegion((x, y, z), (x, 0, 1), (y, 0, 1), (z, 0, 1))
>>> field = 2*C.x*C.y*C.i + 3*C.x*C.y*C.j + C.z*exp(C.x + C.y)*C.k
>>> vector_integrate(divergence(field), cube)
-E + 7/2 + E*(-1 + E)