物理/力学中的质量、惯性、粒子和刚体¶
本文档将描述如何在 sympy.physics.mechanics
中表示质量和惯性,以及如何使用 RigidBody
和 Particle
类。
假设读者熟悉这些主题的基础知识,例如如何找到粒子系统的质心、如何操作惯性张量,以及粒子和刚体的定义。任何高级动力学文本都可以为这些细节提供参考。
质量¶
质量的唯一要求是它需要是一个可以 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
,参考点是一个 Point
。 Dyadic
可以定义为两个向量的外积,返回这些向量的并置。有关更多信息,请参阅 sympy.physics.vector
模块高级文档中的 二元的 部分。另一种更直观的方法来定义 Dyadic
是使用 inertia()
函数,如下文 ‘Inertia (Dyadics)’ 部分所述。指定的 Dyadic
的 Point
可以是任何点,只要它相对于质心定义。最常见的参考点当然是质心本身。
物体的惯性可以用 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
的 .point
, RigidBody
的质量中心 .masscenter
也必须指定。参考框架以类似的方式存储,并包含有关物体方向和角速度的信息。
加载¶
在 sympy.physics.mechanics
中,载荷可以用元组或专门的类 Force
和 Torque
来表示。通常,第一个参数(或元组中的项)是载荷的位置。第二个参数是向量。在力的情形下,第一个参数是一个点,第二个是一个向量。
>>> 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 的线性动量定义为:
其中 \(m\) 是粒子 P 的质量,\(\mathbf{v}\) 是粒子在惯性系中的速度。[Likins1973]。
同样地,刚体的线性动量定义为:
其中 \(m\) 是刚体 B 的质量,\(\mathbf{v^*}\) 是 B 的质量中心在惯性系中的速度。
角动量¶
在惯性系N中,粒子P相对于任意点O的角动量定义为:
其中 \(\mathbf{r}\) 是从点 O 到质量为 \(m\) 的粒子的位置矢量,\(\mathbf{v}\) 是该粒子在惯性系中的速度。
类似地,刚体 B 在惯性系 N 中关于点 O 的角动量定义为:
其中,物体关于其质心的角动量为:
而质量中心关于O的角动量为:
其中 \(\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 的动能定义为
其中 \(m\) 是粒子 P 的质量,\(\mathbf{v}\) 是粒子在惯性系中的速度。
同样地,刚体 B 的动能定义为
其中平动动能由以下公式给出:
旋转动能由以下公式给出:
其中 \(m\) 是刚体的质量,\(\mathbf{v^*}\) 是惯性系中质心的速度,\(\omega\) 是刚体的惯性角速度,\(\mathbf{I^*}\) 是中心惯性并矢。
势能¶
势能被定义为物体或系统因其位置或排列而具有的能量。
由于势能有多种定义,这里不再进一步讨论。关于这一点,可以在任何基础动力学教科书中了解更多。
拉格朗日¶
一个物体或一个物体系统的拉格朗日量定义为:
其中 \(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
请参考文档字符串以了解更多关于每个函数的信息。