向量积分的应用¶
要在一个区域内对标量或矢量场进行积分,我们首先需要定义一个区域。SymPy 提供了三种定义区域的方法:
使用参数方程与
ParametricRegion
。使用隐式方程与
ImplicitRegion
。使用几何模块的对象。
函数 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)