物理/力学中的质量、惯性、粒子和刚体

本文档将描述如何在 sympy.physics.mechanics 中表示质量和惯性,以及如何使用 RigidBodyParticle 类。

假设读者熟悉这些主题的基础知识,例如如何找到粒子系统的质心、如何操作惯性张量,以及粒子和刚体的定义。任何高级动力学文本都可以为这些细节提供参考。

质量

质量的唯一要求是它需要是一个可以 sympify 的表达式。请记住,质量可以是随时间变化的。

粒子

粒子是通过 sympy.physics.mechanics 中的类 Particle 创建的。一个 Particle 对象有一个关联点和一个关联质量,这是该对象仅有的两个属性。:

>>> from sympy.physics.mechanics import Particle, Point
>>> from sympy import Symbol
>>> m = Symbol('m')
>>> po = Point('po')
>>> # create a particle container
>>> pa = Particle('pa', po, m)

关联点包含粒子的位置、速度和加速度。sympy.physics.mechanics 允许对点进行运动学分析,而无需考虑它们与质量的关联。

惯性

惯性由两部分组成:一个量和一个参考点。量表示为 Dyadic ,参考点是一个 PointDyadic 可以定义为两个向量的外积,返回这些向量的并置。有关更多信息,请参阅 sympy.physics.vector 模块高级文档中的 二元的 部分。另一种更直观的方法来定义 Dyadic 是使用 inertia() 函数,如下文 ‘Inertia (Dyadics)’ 部分所述。指定的 DyadicPoint 可以是任何点,只要它相对于质心定义。最常见的参考点当然是质心本身。

物体的惯性可以用 Inertia 对象或 tuple 来指定。如果使用 tuple ,那么它应该有两个元素,第一个元素是 Dyadic ,第二个元素是 Point ,惯性并矢量就是围绕这个点定义的。在内部,这个 tuple 会被转换为 Inertia 对象。在 ‘刚体’ 部分下面给出了一个关于质心的 tuple 使用的例子。 Inertia 对象可以如下创建。:

>>> from sympy.physics.mechanics import ReferenceFrame, Point, outer, Inertia
>>> A = ReferenceFrame('A')
>>> P = Point('P')
>>> Inertia(P, outer(A.x, A.x))
((A.x|A.x), P)

惯性 (Dyadics)

A dyadic tensor is a second order tensor formed by the juxtaposition of a pair of vectors. There are various operations defined with respect to dyadics, which have been implemented in vector in the form of class Dyadic. To know more, refer to the sympy.physics.vector.dyadic.Dyadic and sympy.physics.vector.vector.Vector class APIs. Dyadics are used to define the inertia of bodies within sympy.physics.mechanics. Inertia dyadics can be defined explicitly using the outer product, but the inertia() function is typically much more convenient for the user.:

>>> from sympy.physics.mechanics import ReferenceFrame, inertia
>>> N = ReferenceFrame('N')

Supply a reference frame and the moments of inertia if the object
is symmetrical:

>>> inertia(N, 1, 2, 3)
(N.x|N.x) + 2*(N.y|N.y) + 3*(N.z|N.z)

Supply a reference frame along with the products and moments of inertia
for a general object:

>>> inertia(N, 1, 2, 3, 4, 5, 6)
(N.x|N.x) + 4*(N.x|N.y) + 6*(N.x|N.z) + 4*(N.y|N.x) + 2*(N.y|N.y) + 5*(N.y|N.z) + 6*(N.z|N.x) + 5*(N.z|N.y) + 3*(N.z|N.z)

Notice that the inertia() function returns a dyadic with each component represented as two unit vectors separated by a | (outer product). Refer to the sympy.physics.vector.dyadic.Dyadic section for more information about dyadics.

惯性通常以矩阵或张量形式表示,特别是在数值计算中。由于矩阵形式不包含关于惯性并矢所定义的参考系的信息,您必须提供一个或两个参考系来从并矢中提取测量数。有一个方便的函数可以做到这一点:

>>> inertia(N, 1, 2, 3, 4, 5, 6).to_matrix(N)
Matrix([
[1, 4, 6],
[4, 2, 5],
[6, 5, 3]])

刚体

刚体的创建方式与粒子类似。RigidBody 类生成具有四个属性的对象:质量、质心、参考系和 Inertia`(也可以传递一个 ``tuple`)。:

>>> from sympy import Symbol
>>> from sympy.physics.mechanics import ReferenceFrame, Point, RigidBody
>>> from sympy.physics.mechanics import outer
>>> m = Symbol('m')
>>> A = ReferenceFrame('A')
>>> P = Point('P')
>>> I = outer(A.x, A.x)
>>> # create a rigid body
>>> B = RigidBody('B', P, A, m, (I, P))

质量的指定与粒子中的完全相同。类似于 Particle.pointRigidBody 的质量中心 .masscenter 也必须指定。参考框架以类似的方式存储,并包含有关物体方向和角速度的信息。

加载

sympy.physics.mechanics 中,载荷可以用元组或专门的类 ForceTorque 来表示。通常,第一个参数(或元组中的项)是载荷的位置。第二个参数是向量。在力的情形下,第一个参数是一个点,第二个是一个向量。

>>> from sympy.physics.mechanics import Point, ReferenceFrame, Force
>>> N = ReferenceFrame('N')
>>> Po = Point('Po')
>>> Force(Po, N.x)
(Po, N.x)

另一方面,扭矩的位置是一个框架。

>>> from sympy.physics.mechanics import Torque
>>> Torque(N, 2 * N.x)
(N, 2*N.x)

可选地,在使用专用类时也可以传递主体。如果是这样,力将使用质心,而扭矩将使用相关框架。

>>> from sympy.physics.mechanics import RigidBody
>>> rb = RigidBody('rb')
>>> Force(rb, 3 * N.x)
(rb_masscenter, 3*N.x)
>>> Torque(rb, 4 * N.x)
(rb_frame, 4*N.x)

线性动量

粒子 P 的线性动量定义为:

\[L_P = m\mathbf{v}\]

其中 \(m\) 是粒子 P 的质量,\(\mathbf{v}\) 是粒子在惯性系中的速度。[Likins1973]

同样地,刚体的线性动量定义为:

\[L_B = m\mathbf{v^*}\]

其中 \(m\) 是刚体 B 的质量,\(\mathbf{v^*}\) 是 B 的质量中心在惯性系中的速度。

角动量

在惯性系N中,粒子P相对于任意点O的角动量定义为:

\[^N \mathbf{H} ^ {P/O} = \mathbf{r} \times m\mathbf{v}\]

其中 \(\mathbf{r}\) 是从点 O 到质量为 \(m\) 的粒子的位置矢量,\(\mathbf{v}\) 是该粒子在惯性系中的速度。

类似地,刚体 B 在惯性系 N 中关于点 O 的角动量定义为:

\[^N \mathbf{H} ^ {B/O} = ^N \mathbf{H} ^ {B/B^*} + ^N \mathbf{H} ^ {B^*/O}\]

其中,物体关于其质心的角动量为:

\[^N \mathbf{H} ^ {B/B^*} = \mathbf{I^*} \cdot \omega\]

而质量中心关于O的角动量为:

\[^N \mathbf{H} ^ {B^*/O} = \mathbf{r^*} \times m \mathbf{v^*}\]

其中 \(\mathbf{I^*}\) 是刚体 B 的中心惯性偶极子,\(\omega\) 是 B 的惯性角速度,\(\mathbf{r^*}\) 是从点 O 到 B 的质量中心的位矢,\(m\) 是 B 的质量,\(\mathbf{v^*}\) 是质量中心在惯性系中的速度。

在力学中使用动量函数

以下示例展示了如何在 sympy.physics.mechanics 中使用动量函数。

首先创建描述系统所需的符号。然后创建参考框架并完成运动学分析。:

>>> from sympy import symbols
>>> from sympy.physics.mechanics import dynamicsymbols, ReferenceFrame
>>> from sympy.physics.mechanics import RigidBody, Particle, Point, outer
>>> from sympy.physics.mechanics import linear_momentum, angular_momentum
>>> from sympy.physics.vector import init_vprinting
>>> init_vprinting(pretty_print=False)
>>> m, M, l1 = symbols('m M l1')
>>> q1d = dynamicsymbols('q1d')
>>> N = ReferenceFrame('N')
>>> O = Point('O')
>>> O.set_vel(N, 0 * N.x)
>>> Ac = O.locatenew('Ac', l1 * N.x)
>>> P = Ac.locatenew('P', l1 * N.x)
>>> a = ReferenceFrame('a')
>>> a.set_ang_vel(N, q1d * N.z)
>>> Ac.v2pt_theory(O, N, a)
l1*q1d*N.y
>>> P.v2pt_theory(O, N, a)
2*l1*q1d*N.y

最后,构成系统的物体被创建。在这种情况下,系统由一个粒子 Pa 和一个刚体 A 组成。:

>>> Pa = Particle('Pa', P, m)
>>> I = outer(N.z, N.z)
>>> A = RigidBody('A', Ac, a, M, (I, Ac))

然后可以选择评估系统各组成部分的动量或整个系统的动量。:

>>> linear_momentum(N,A)
M*l1*q1d*N.y
>>> angular_momentum(O, N, Pa)
4*l1**2*m*q1d*N.z
>>> linear_momentum(N, A, Pa)
(M*l1*q1d + 2*l1*m*q1d)*N.y
>>> angular_momentum(O, N, A, Pa)
(M*l1**2*q1d + 4*l1**2*m*q1d + q1d)*N.z

需要注意的是,用户可以在 sympy.physics.mechanics 中确定任意参考系中的动量,因为用户在调用函数时可以指定参考系。换句话说,用户不仅限于确定惯性线动量和角动量。请参阅每个函数的文档字符串,以了解每个函数的工作原理。

动能

粒子 P 的动能定义为

\[T_P = \frac{1}{2} m \mathbf{v^2}\]

其中 \(m\) 是粒子 P 的质量,\(\mathbf{v}\) 是粒子在惯性系中的速度。

同样地,刚体 B 的动能定义为

\[T_B = T_t + T_r\]

其中平动动能由以下公式给出:

\[T_t = \frac{1}{2} m \mathbf{v^*} \cdot \mathbf{v^*}\]

旋转动能由以下公式给出:

\[T_r = \frac{1}{2} \omega \cdot \mathbf{I^*} \cdot \omega\]

其中 \(m\) 是刚体的质量,\(\mathbf{v^*}\) 是惯性系中质心的速度,\(\omega\) 是刚体的惯性角速度,\(\mathbf{I^*}\) 是中心惯性并矢。

势能

势能被定义为物体或系统因其位置或排列而具有的能量。

由于势能有多种定义,这里不再进一步讨论。关于这一点,可以在任何基础动力学教科书中了解更多。

拉格朗日

一个物体或一个物体系统的拉格朗日量定义为:

\[\mathcal{L} = T - V\]

其中 \(T\)\(V\) 分别是动能和势能。

在力学中使用能量函数

以下示例展示了如何在 sympy.physics.mechanics 中使用能量函数。

如上文在动量函数中所讨论的,首先通过一个相同的过程创建系统。:

>>> from sympy import symbols
>>> from sympy.physics.mechanics import dynamicsymbols, ReferenceFrame, outer
>>> from sympy.physics.mechanics import RigidBody, Particle
>>> from sympy.physics.mechanics import kinetic_energy, potential_energy, Point
>>> from sympy.physics.vector import init_vprinting
>>> init_vprinting(pretty_print=False)
>>> m, M, l1, g, h, H = symbols('m M l1 g h H')
>>> omega = dynamicsymbols('omega')
>>> N = ReferenceFrame('N')
>>> O = Point('O')
>>> O.set_vel(N, 0 * N.x)
>>> Ac = O.locatenew('Ac', l1 * N.x)
>>> P = Ac.locatenew('P', l1 * N.x)
>>> a = ReferenceFrame('a')
>>> a.set_ang_vel(N, omega * N.z)
>>> Ac.v2pt_theory(O, N, a)
l1*omega*N.y
>>> P.v2pt_theory(O, N, a)
2*l1*omega*N.y
>>> Pa = Particle('Pa', P, m)
>>> I = outer(N.z, N.z)
>>> A = RigidBody('A', Ac, a, M, (I, Ac))

用户随后可以确定系统中任意数量的实体的动能:

>>> kinetic_energy(N, Pa)
2*l1**2*m*omega**2
>>> kinetic_energy(N, Pa, A)
M*l1**2*omega**2/2 + 2*l1**2*m*omega**2 + omega**2/2

需要注意的是,用户可以在 sympy.physics.mechanics 中相对于任何框架确定动能,因为用户在调用函数时可以指定参考框架。换句话说,用户不仅限于确定惯性动能。

For potential energies, the user must first specify the potential energy of every entity of the system using the sympy.physics.mechanics.rigidbody.RigidBody.potential_energy property. The potential energy of any number of entities comprising the system can then be determined:

>>> Pa.potential_energy = m * g * h
>>> A.potential_energy = M * g * H
>>> potential_energy(A, Pa)
H*M*g + g*h*m

也可以确定该系统的拉格朗日量:

>>> from sympy.physics.mechanics import Lagrangian
>>> from sympy.physics.vector import init_vprinting
>>> init_vprinting(pretty_print=False)
>>> Lagrangian(N, Pa, A)
-H*M*g + M*l1**2*omega**2/2 - g*h*m + 2*l1**2*m*omega**2 + omega**2/2

请参考文档字符串以了解更多关于每个函数的信息。