凯恩物理力学方法#
sympy.physics.mechanics
利用凯恩方法推导运动方程提供了功能 [Kane1985]. 本文档将描述本模块中使用的凯恩方法,但不描述如何实际推导方程。
方程结构#
在 sympy.physics.mechanics
我们假设有5组基本方程来描述一个系统。它们是:完整约束、非完整约束、运动微分方程、动力学方程和微分非完整方程。
在 sympy.physics.mechanics
完整约束仅用于线性化过程,假设这些约束过于复杂,无法求解相关坐标。如果你能很容易地解决一个完整的约束,你应该考虑用一组更小的坐标重新定义你的问题。或者,可以提供时间区分的完整约束。
凯恩的方法形成了两个表达式, \(F_r\) 和 \(F_r^*\) ,其和为零。在本模块中,这些表达式重新排列为以下形式:
\(\mathbf{M}(q, t) \dot{u} = \mathbf{f}(q, \dot{q}, u, t)\)
对于非完整系统 \(o\) 总速度和 \(m\) 运动约束下,我们将得到o-m方程。质量矩阵/力方程按以下方式进行扩充:
凯恩物理力学方法#
运动方程的建立 sympy.physics.mechanics
从创建 KanesMethod
对象。初始化 KanesMethod
对象,则需要提供惯性参考系。以及一些基本的系统信息,如坐标和速度:
>>> from sympy.physics.mechanics import *
>>> N = ReferenceFrame('N')
>>> q1, q2, u1, u2 = dynamicsymbols('q1 q2 u1 u2')
>>> q1d, q2d, u1d, u2d = dynamicsymbols('q1 q2 u1 u2', 1)
>>> KM = KanesMethod(N, [q1, q2], [u1, u2])
如果存在相关坐标和速度,则正确提供坐标和速度的顺序也很重要。它们必须在独立的坐标和速度之后或作为关键字参数提供;这将在后面显示。:
>>> q1, q2, q3, q4 = dynamicsymbols('q1 q2 q3 q4')
>>> u1, u2, u3, u4 = dynamicsymbols('u1 u2 u3 u4')
>>> # Here we will assume q2 is dependent, and u2 and u3 are dependent
>>> # We need the constraint equations to enter them though
>>> KM = KanesMethod(N, [q1, q3, q4], [u1, u4])
此外,如果存在辅助速度,则需要在此处进行标识。有关这方面的更多信息,请参见示例。在本例中,u4是辅助速度。:
>>> KM = KanesMethod(N, [q1, q3, q4], [u1, u2, u3], u_auxiliary=[u4])
还必须提供运动微分方程;应提供一个表达式列表,每个表达式都等于零。下面是一个简单的例子:
>>> kd = [q1d - u1, q2d - u2]
开启 mechanics_printing()
使表达式大大缩短,建议使用。或者 mprint
和 mpprint
可以使用命令。
如果存在非完整约束,则需要指定相关速度(相关坐标也是如此,但它们仅在线性化系统时才起作用)。约束需要在表达式列表中提供,表达式等于零,普通运动和配置约束如下所示:
>>> N = ReferenceFrame('N')
>>> q1, q2, q3, q4 = dynamicsymbols('q1 q2 q3 q4')
>>> q1d, q2d, q3d, q4d = dynamicsymbols('q1 q2 q3 q4', 1)
>>> u1, u2, u3, u4 = dynamicsymbols('u1 u2 u3 u4')
>>> #Here we will assume q2 is dependent, and u2 and u3 are dependent
>>> speed_cons = [u2 - u1, u3 - u1 - u4]
>>> coord_cons = [q2 - q1]
>>> q_ind = [q1, q3, q4]
>>> q_dep = [q2]
>>> u_ind = [u1, u4]
>>> u_dep = [u2, u3]
>>> kd = [q1d - u1, q2d - u2, q3d - u3, q4d - u4]
>>> KM = KanesMethod(N, q_ind, u_ind, kd,
... q_dependent=q_dep,
... configuration_constraints=coord_cons,
... u_dependent=u_dep,
... velocity_constraints=speed_cons)
一本词典,它返回解出的 \(\dot{{q}}\) 的也可以求解为:::
>>> mechanics_printing(pretty_print=False)
>>> KM.kindiffdict()
{q1': u1, q2': u2, q3': u3, q4': u4}
形成运动方程的最后一步是提供一个物体和粒子的列表,以及一个形式的2元组的列表 (Point, Vector)
或 (ReferenceFrame, Vector)
表示施加的力和力矩。:
>>> N = ReferenceFrame('N')
>>> q, u = dynamicsymbols('q u')
>>> qd, ud = dynamicsymbols('q u', 1)
>>> P = Point('P')
>>> P.set_vel(N, u * N.x)
>>> Pa = Particle('Pa', P, 5)
>>> BL = [Pa]
>>> FL = [(P, 7 * N.x)]
>>> KM = KanesMethod(N, [q], [u], [qd - u])
>>> (fr, frstar) = KM.kanes_equations(BL, FL)
>>> KM.mass_matrix
Matrix([[5]])
>>> KM.forcing
Matrix([[7]])
当存在运动约束时,质量矩阵由 \(k_{{dnh}}(q, t)\) 矩阵和强制向量 \(f_{{dnh}}(q, \dot{{q}}, u, t)\) 矢量。
还有“全”质量矩阵和“全”力矢量项,包括运动学微分方程;质量矩阵的大小为(n+o)x(n+o)或平方,以及所有坐标和速度的大小。:
>>> KM.mass_matrix_full
Matrix([
[1, 0],
[0, 5]])
>>> KM.forcing_full
Matrix([
[u],
[7]])
鼓励对所提供的示例进行探索,以便更好地理解 KanesMethod
对象。