使用示例

本节详细介绍了使用 sympy.vector 包解决向量数学/微积分中的两个基本问题。

四边形问题

问题

OABC 是三维空间中的任意四边形。P 是 OA 的中点,Q 是 AB 的中点,R 是 BC 的中点,S 是 OC 的中点。证明 PQ 平行于 SR

解决方案

这个问题的解决方案展示了 Point 的使用,以及对 Vector 的基本操作。

定义一个坐标系

>>> from sympy.vector import CoordSys3D
>>> Sys = CoordSys3D('Sys')

定义点 O 为 Sys 的原点。我们可以不失一般性地这样做。

>>> O = Sys.origin

以 O 为参考定义点 A

>>> from sympy import symbols
>>> a1, a2, a3 = symbols('a1 a2 a3')
>>> A = O.locate_new('A', a1*Sys.i + a2*Sys.j + a3*Sys.k)

同样定义点 B 和 C

>>> b1, b2, b3 = symbols('b1 b2 b3')
>>> B = O.locate_new('B', b1*Sys.i + b2*Sys.j + b3*Sys.k)
>>> c1, c2, c3 = symbols('c1 c2 c3')
>>> C = O.locate_new('C', c1*Sys.i + c2*Sys.j + c3*Sys.k)

P 是 OA 的中点。让我们相对于 O 定位它(你也可以相对于 A 定义它)。

>>> P = O.locate_new('P', A.position_wrt(O) + (O.position_wrt(A) / 2))

同样地,根据问题定义定义点 Q、R 和 S。

>>> Q = A.locate_new('Q', B.position_wrt(A) / 2)
>>> R = B.locate_new('R', C.position_wrt(B) / 2)
>>> S = O.locate_new('R', C.position_wrt(O) / 2)

现在计算在PQ和SR方向上指定的向量。

>>> PQ = Q.position_wrt(P)
>>> SR = R.position_wrt(S)

计算叉积

>>> PQ.cross(SR)
0

由于叉积是一个零向量,这两个向量必须是平行的,从而证明了 PQ || SR。

Del 算子的第三产品规则

问题

证明第三条规则 - \(\nabla \cdot (f \vec v) = f (\nabla \cdot \vec v) + \vec v \cdot (\nabla f)\)

解决方案

从坐标系开始

>>> from sympy.vector import CoordSys3D, Del
>>> delop = Del()
>>> C = CoordSys3D('C')

标量场 \(f\) 和向量场 \(\vec v\) 的度量数通常都是坐标系坐标变量的函数。因此,按这种方式定义 SymPy 函数。

>>> from sympy import symbols, Function
>>> v1, v2, v3, f = symbols('v1 v2 v3 f', cls=Function)

v1v2v3 分别是向量场的 \(X\)\(Y\)\(Z\) 分量。

将向量场定义为 vfield ,将标量场定义为 sfield

>>> vfield = v1(C.x, C.y, C.z)*C.i + v2(C.x, C.y, C.z)*C.j + v3(C.x, C.y, C.z)*C.k
>>> ffield = f(C.x, C.y, C.z)

使用 Del() 构建方程左侧的表达式。

>>> lhs = (delop.dot(ffield * vfield)).doit()

同样地,右侧将被定义。

>>> rhs = ((vfield.dot(delop(ffield))) + (ffield * (delop.dot(vfield)))).doit()

现在,为了证明乘积法则,我们只需要将左边的展开和简化版本与右边的展开和简化版本等同起来,使得SymPy表达式匹配。

>>> lhs.expand().simplify() == rhs.expand().doit().simplify()
True

因此,上述提到的第三种乘积法则的一般形式可以通过 sympy.vector 来证明。