标量和向量场功能#

实施同向矢量#

标量场和矢量场#

In sympy.vector, every CoordSys3D instance is assigned basis vectors corresponding to the \(X\), \(Y\) and \(Z\) axes. These can be accessed using the properties named i, j and k respectively. Hence, to define a vector \(\mathbf{v}\) of the form \(3\mathbf{\hat{i}} + 4\mathbf{\hat{j}} + 5\mathbf{\hat{k}}\) with respect to a given frame \(\mathbf{R}\), you would do

>>> from sympy.vector import CoordSys3D
>>> R = CoordSys3D('R')
>>> v = 3*R.i + 4*R.j + 5*R.k

关于向量的向量数学和基本微积分运算已经在本模块文档的前一节中详细阐述过。

另一方面,基本标量(或坐标变量)是在一个名为 BaseScalar ,并被指定给每个坐标系,每个轴对应一个 \(X\)\(Y\)\(Z\) . 这些坐标变量用于形成三维空间中矢量场或标量场的表达式。对于一个系统 R , the \(X\)\(Y\)\(Z\) BaseScalars 实例可以使用 R.xR.yR.z 表达式。

因此,生成上述电势场的表达式 \(2{{x}}^{{2}}y\) ,你必须这样做

>>> from sympy.vector import CoordSys3D
>>> R = CoordSys3D('R')
>>> electric_potential = 2*R.x**2*R.y
>>> electric_potential
2*R.x**2*R.y

值得注意的是 BaseScalar 实例可以像任何其他SymPy一样使用 Symbol ,只不过它们存储了与之对应的坐标系和轴的信息。

对于任何数学/微积分功能,标量字段可以像任何其他SymPy表达式一样处理。因此,为了区分上述电势 \(x\) (即 R.x ),您可以使用 diff 方法。

>>> from sympy.vector import CoordSys3D
>>> R = CoordSys3D('R')
>>> electric_potential = 2*R.x**2*R.y
>>> from sympy import diff
>>> diff(electric_potential, R.x)
4*R.x*R.y

值得注意的是 BaseScalar 在表达式中,表示“字段”在三维空间中随位置而变化。从技术上讲,一个简单的 Expr 没有 BaseScalar s仍然是一个场,尽管是常数。

与标量场一样,也可以使用 BaseScalar 在度量值表达式中。

>>> from sympy.vector import CoordSys3D
>>> R = CoordSys3D('R')
>>> v = R.x**2*R.i + 2*R.x*R.z*R.k

Del运算符#

Del或“Nabla”运算符-写为 \(\mathbf{{\nabla}}\) 通常被称为向量微分算子。根据它在数学表达式中的用法,它可以表示标量场的梯度、向量场的散度或向量场的旋度。

基本上, \(\mathbf{{\nabla}}\) 不是技术上的“运算符”,而是表示上述任何一种现场操作的方便数学符号。

sympy.vector\(\mathbf{{\nabla}}\) 已作为 Del() 班级。此类的实例独立于坐标系。因此 \(\mathbf{{\nabla}}\) 操作员可通过 Del() .

下面给出的是 Del() 班级。

>>> from sympy.vector import CoordSys3D, Del
>>> C = CoordSys3D('C')
>>> delop = Del()
>>> gradient_field = delop(C.x*C.y*C.z)
>>> gradient_field
(Derivative(C.x*C.y*C.z, C.x))*C.i + (Derivative(C.x*C.y*C.z, C.y))*C.j
+ (Derivative(C.x*C.y*C.z, C.z))*C.k

上面的表达式可以用SymPy求值 doit() 例行公事。

>>> gradient_field.doit()
C.y*C.z*C.i + C.x*C.z*C.j + C.x*C.y*C.k

使用 \(\mathbf{{\nabla}}\) 符号 sympy.vector 在后面的小节中有更详细的描述。

正交曲线坐标系中的场算子#

vector 该软件包支持在不同类型的正交曲线坐标系下进行计算。为此,使用比例因子(也称为Lame系数)来表示 curldivergencegradient 在所需的坐标系类型中。

例如,如果我们想计算 gradient 在柱坐标系中,我们需要做的就是创建合适的坐标系

>>> from sympy.vector import CoordSys3D
>>> c = CoordSys3D('c', transformation='cylindrical', variable_names=("r", "theta", "z"))
>>> gradient(c.r*c.theta*c.z)
    c.theta*c.z*c.i + c.z*c.j + c.r*c.theta*c.k

保守场和螺线管场#

在向量演算中,保守场是一些标量场的梯度场。保守场具有这样的性质:它们在任何路径上的线积分只依赖于端点,并且与所经过的路径无关。保守向量场也被称为无旋场,因为保守场的旋度总是零。

在物理学中,保守场代表能量守恒的物理系统中的力。

检查向量场在 sympy.vector , the is_conservative 可以使用函数。

>>> from sympy.vector import CoordSys3D, is_conservative
>>> R = CoordSys3D('R')
>>> field = R.y*R.z*R.i + R.x*R.z*R.j + R.x*R.y*R.k
>>> is_conservative(field)
True
>>> curl(field)
0

另一方面,螺线管场是一个矢量场,它在空间中所有点的散度都为零。

检查矢量场是否为螺线管 sympy.vector , the is_solenoidal 可以使用函数。

>>> from sympy.vector import CoordSys3D, is_solenoidal
>>> R = CoordSys3D('R')
>>> field = R.y*R.z*R.i + R.x*R.z*R.j + R.x*R.y*R.k
>>> is_solenoidal(field)
True
>>> divergence(field)
0

标量势函数#

我们前面已经提到过,每个保守场都可以定义为某个标量场的梯度。这个标量场也被称为“标量势场”,与上述保守场相对应。

这个 scalar_potential 中的函数 sympy.vector 在给定的三维空间中,计算一个保守场中的标量场的负积分。

用法示例-

>>> from sympy.vector import CoordSys3D, scalar_potential
>>> R = CoordSys3D('R')
>>> conservative_field = 4*R.x*R.y*R.z*R.i + 2*R.x**2*R.z*R.j + 2*R.x**2*R.y*R.k
>>> scalar_potential(conservative_field, R)
2*R.x**2*R.y*R.z

提供非保守向量场作为参数 scalar_potential 提高 ValueError .

与保守向量场相对应的标量位差,或简称“位差”,可以定义为其标量位函数在空间两点上的值之差。这在计算相对于保守函数的线积分时很有用,因为它只依赖于路径的端点。

计算如下所示 sympy.vector .

>>> from sympy.vector import CoordSys3D, Point
>>> from sympy.vector import scalar_potential_difference
>>> R = CoordSys3D('R')
>>> P = R.origin.locate_new('P', 1*R.i + 2*R.j + 3*R.k)
>>> vectfield = 4*R.x*R.y*R.i + 2*R.x**2*R.j
>>> scalar_potential_difference(vectfield, R, R.origin, P)
4

如果提供标量表达式而不是向量场, scalar_potential_difference 返回该标量字段在空间中两个给定点的值之间的差。