物理学/力学中的拉格朗日方法

sympy.physics.mechanics 提供了使用 拉格朗日方法 推导运动方程的功能。本文档将描述在此模块中使用的拉格朗日方法,但不涉及方程的实际推导过程。

方程的结构

sympy.physics.mechanics 中,我们假设描述一个系统需要三组基本方程;约束方程、时间导数的约束方程和动态方程。

\[\begin{split}\mathbf{m_{c}}(q, t) \dot{q} + \mathbf{f_{c}}(q, t) &= 0\\ \mathbf{m_{dc}}(\dot{q}, q, t) \ddot{q} + \mathbf{f_{dc}}(\dot{q}, q, t) &= 0\\ \mathbf{m_d}(\dot{q}, q, t) \ddot{q} + \mathbf{\Lambda_c}(q, t) \lambda + \mathbf{f_d}(\dot{q}, q, t) &= 0\\\end{split}\]

在本模块中,使用拉格朗日第二类方程形成的表达式被重新排列成以下形式:

\(\mathbf{M}(q, t) x = \mathbf{f}(q, \dot{q}, t)\)

在没有约束的系统的情况下:

\(x = \ddot{q}\)

对于一个具有 \(n\) 个广义速度和 \(m\) 个约束的受限系统,我们将得到 n - m 个方程。然后,质量矩阵/强制方程按以下方式增广:

\[\begin{split}x = \begin{bmatrix} \ddot{q} \\ \lambda \end{bmatrix} \\ \mathbf{M}(q, t) &= \begin{bmatrix} \mathbf{m_d}(q, t) & \mathbf{\Lambda_c}(q, t) \end{bmatrix}\\ \mathbf{F}(\dot{q}, q, t) &= \begin{bmatrix} \mathbf{f_d}(q, \dot{q}, t) \end{bmatrix}\\\end{split}\]

物理学/力学中的拉格朗日方法

sympy.physics.mechanics 中使用拉格朗日方法构建运动方程的公式,首先需要创建广义坐标和拉格朗日量。拉格朗日量可以通过 Lagrangian 函数创建,也可以是用户提供的函数。在这种情况下,我们将提供拉格朗日量。:

>>> from sympy.physics.mechanics import *
>>> q1, q2 = dynamicsymbols('q1 q2')
>>> q1d, q2d = dynamicsymbols('q1 q2', 1)
>>> L = q1d**2 + q2d**2

为了建立运动方程,我们创建一个 LagrangesMethod 对象。在初始化时需要提供拉格朗日量和广义坐标。

>>> LM = LagrangesMethod(L, [q1, q2])

由此可以形成运动方程。:

>>> mechanics_printing(pretty_print=False)
>>> LM.form_lagranges_equations()
Matrix([
[2*q1''],
[2*q2'']])

可以获取质量矩阵和力矢量。:

>>> LM.mass_matrix
Matrix([
[2, 0],
[0, 2]])

>>> LM.forcing
Matrix([
[0],
[0]])

如果有任何完整或非完整约束,它们必须作为关键字参数(分别为 hol_coneqsnonhol_coneqs)以等于零的表达式列表形式提供。修改上面的示例,然后可以生成运动方程:

>>> LM = LagrangesMethod(L, [q1, q2], hol_coneqs=[q1 - q2])

在这种情况下生成运动方程时,会引入拉格朗日乘数;在这种情况下,它们由 lam1 表示。通常,乘数的数量与约束方程的数量相同。

>>> LM.form_lagranges_equations()
Matrix([
[ lam1 + 2*q1''],
[-lam1 + 2*q2'']])

同样在有约束的系统中,’完整’ 质量矩阵通过 \(k_{dc}(q, t)\) 矩阵进行增广,而力矢量则通过 \(f_{dc}(q, \dot{q}, t)\) 矢量进行增广。’完整’ 质量矩阵的大小为 (2n + o) x (2n + o),即它是一个方阵。:

>>> LM.mass_matrix_full
Matrix([
[1, 0, 0,  0,  0],
[0, 1, 0,  0,  0],
[0, 0, 2,  0, -1],
[0, 0, 0,  2,  1],
[0, 0, 1, -1,  0]])
>>> LM.forcing_full
Matrix([
[q1'],
[q2'],
[  0],
[  0],
[  0]])

如果系统上存在任何非保守力或力矩,它们也必须作为关键字参数以 (点, 矢量)(参考系, 矢量) 形式的 2-元组列表提供,其中 矢量 表示非保守力和力矩。除了这个 2-元组,惯性参考系也必须作为关键字参数指定。这通过修改上面的示例如下所示:

>>> N = ReferenceFrame('N')
>>> P = Point('P')
>>> P.set_vel(N, q1d * N.x)
>>> FL = [(P, 7 * N.x)]
>>> LM = LagrangesMethod(L, [q1, q2], forcelist=FL, frame=N)
>>> LM.form_lagranges_equations()
Matrix([
[2*q1'' - 7],
[    2*q2'']])

鼓励探索提供的示例,以更深入地理解 LagrangesMethod 对象。