物理学/力学中的拉格朗日方法¶
sympy.physics.mechanics
提供了使用 拉格朗日方法 推导运动方程的功能。本文档将描述在此模块中使用的拉格朗日方法,但不涉及方程的实际推导过程。
方程的结构¶
在 sympy.physics.mechanics
中,我们假设描述一个系统需要三组基本方程;约束方程、时间导数的约束方程和动态方程。
在本模块中,使用拉格朗日第二类方程形成的表达式被重新排列成以下形式:
\(\mathbf{M}(q, t) x = \mathbf{f}(q, \dot{q}, t)\)
在没有约束的系统的情况下:
\(x = \ddot{q}\)
对于一个具有 \(n\) 个广义速度和 \(m\) 个约束的受限系统,我们将得到 n - m 个方程。然后,质量矩阵/强制方程按以下方式增广:
物理学/力学中的拉格朗日方法¶
在 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_coneqs
和 nonhol_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
对象。