物理力学中的拉格朗日方法#
sympy.physics.mechanics
提供了使用以下命令导出运动方程的功能: Lagrange's method . 本文档将描述本模块中使用的拉格朗日方法,但不描述如何实际推导方程。
方程结构#
在 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元组形式的列表中 (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
对象。