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

sympy.physics.mechanics 提供了使用以下命令导出运动方程的功能: Lagrange's method . 本文档将描述本模块中使用的拉格朗日方法,但不描述如何实际推导方程。

方程结构#

sympy.physics.mechanics 我们假设描述一个系统需要三个基本方程组:约束方程、时微分约束方程和动力学方程。

\[\begin{split}\mathbf{m{c}}(q,t)\dot{q}+\mathbf{f{c}}(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}\\\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元组形式的列表中 (Point, Vector)(ReferenceFrame, Vector) 何处 Vector 表示非保守力和扭矩。除了这个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 对象。