物理/力学中的符号系统#

这个 \(SymbolicSystem\) 物理/力学课程是一个多体动力系统相关信息的场所。在其最基本的形式中,它包含了动态系统的运动方程,但是,它也可以包含有关系统所承受的载荷、系统组成的实体以及用户认为对系统很重要的任何附加方程的信息。这个类的目标是为运动方程提供一个统一的输出格式,可以围绕这个格式设计数值分析代码。

符号系统示例用法#

这段代码将手动输入单摆的运动方程,它使用质量的笛卡尔位置作为广义坐标 \(SymbolicSystem\) .

运动方程形成于 physics/mechanics/examples. 在这个点上,变量q1和q2被用来代替x和y,并且参考坐标系被旋转90度。

>>> from sympy import atan, symbols, Matrix
>>> from sympy.physics.mechanics import (dynamicsymbols, ReferenceFrame,
...                                      Particle, Point)
>>> import sympy.physics.mechanics.system as system
>>> from sympy.physics.vector import init_vprinting
>>> init_vprinting(pretty_print=False)

第一步是初始化所有的动态和常量符号。:

>>> x, y, u, v, lam = dynamicsymbols('x y u v lambda')
>>> m, l, g = symbols('m l g')

下一步是以多种形式定义运动方程:

[1] 运动学和动力学结合的显式形式

x'=F_1(x,t,r,p)

[2] 运动学和动力学相结合的隐式形式

M_2(x,p)x'=F_2(x,t,r,p)

[3] 运动学和动力学分离的隐式形式

M_3(q,p)u'=F_3(q,u,t,r,p)q'=G(q,u,t,r,p)

在哪里?

x:状态,例如。 [q, u] t:时间r:指定(外生)输入p:常数q:广义坐标u:广义速度F_1:显式组合方程的右侧F_2:隐式组合方程的右侧F_3:动力方程隐式形式的右侧M 2:组合方程的质量矩阵隐式M_3:动力学方程的质量矩阵隐式G:运动微分方程的右手边

>>> dyn_implicit_mat = Matrix([[1, 0, -x/m],
...                            [0, 1, -y/m],
...                            [0, 0, l**2/m]])
>>> dyn_implicit_rhs = Matrix([0, 0, u**2 + v**2 - g*y])
>>> comb_implicit_mat = Matrix([[1, 0, 0, 0, 0],
...                             [0, 1, 0, 0, 0],
...                             [0, 0, 1, 0, -x/m],
...                             [0, 0, 0, 1, -y/m],
...                             [0, 0, 0, 0, l**2/m]])
>>> comb_implicit_rhs = Matrix([u, v, 0, 0, u**2 + v**2 - g*y])
>>> kin_explicit_rhs = Matrix([u, v])
>>> comb_explicit_rhs = comb_implicit_mat.LUsolve(comb_implicit_rhs)

现在,将设置参考系、点和粒子,以便将这些信息传递到 \(system.SymbolicSystem\) 在一个物体的形式和负荷是不可抗拒的。:

>>> theta = atan(x/y)
>>> omega = dynamicsymbols('omega')
>>> N = ReferenceFrame('N')
>>> A = N.orientnew('A', 'Axis', [theta, N.z])
>>> A.set_ang_vel(N, omega * N.z)
>>> O = Point('O')
>>> O.set_vel(N, 0)
>>> P = O.locatenew('P', l * A.x)
>>> P.v2pt_theory(O, N, A)
l*omega*A.y
>>> Pa = Particle('Pa', P, m)

现在需要初始化body和loads iterables。:

>>> bodies = [Pa]
>>> loads = [(P, g * m * N.x)]

运动方程是微分代数方程(DAE)的形式,DAE解算器需要知道哪些方程是代数表达式。此信息被传递到 \(SymbolicSystem\) 作为指定哪些行是代数方程的列表。在本例中,它是基于所选运动方程格式的不同行。行索引应始终与输入到的质量矩阵相对应 \(SymbolicSystem\) 类,但在从中访问时,将始终与组合的动力学和运动学的行索引相对应 \(SymbolicSystem\) 班级。:

>>> alg_con = [2]
>>> alg_con_full = [4]

现在需要为系统创建一个包含状态的iterable。这个 \(SymbolicSystem\) 类可以通过传入坐标和速度的索引来确定哪些状态被视为坐标或速度。如果不传递这些索引,对象将无法区分坐标和速度。:

>>> states = (x, y, u, v, lam)
>>> coord_idxs = (0, 1)
>>> speed_idxs = (2, 3)

现在可以使用上面提到的运动方程格式创建运动方程实例。:

>>> symsystem1 = system.SymbolicSystem(states, comb_explicit_rhs,
...                                    alg_con=alg_con_full, bodies=bodies,
...                                    loads=loads)
>>> symsystem2 = system.SymbolicSystem(states, comb_implicit_rhs,
...                                    mass_matrix=comb_implicit_mat,
...                                    alg_con=alg_con_full,
...                                    coord_idxs=coord_idxs)
>>> symsystem3 = system.SymbolicSystem(states, dyn_implicit_rhs,
...                                    mass_matrix=dyn_implicit_mat,
...                                    coordinate_derivatives=kin_explicit_rhs,
...                                    alg_con=alg_con,
...                                    coord_idxs=coord_idxs,
...                                    speed_idxs=speed_idxs)

Like coordinates and speeds, the bodies and loads attributes can only be accessed if they are specified during initialization of the \(SymbolicSystem\) class. Lastly here are some attributes accessible from the \(SymbolicSystem\) class.

>>> symsystem1.states
Matrix([
[     x],
[     y],
[     u],
[     v],
[lambda]])
>>> symsystem2.coordinates
Matrix([
[x],
[y]])
>>> symsystem3.speeds
Matrix([
[u],
[v]])
>>> symsystem1.comb_explicit_rhs
Matrix([
[                          u],
[                          v],
[(-g*y + u**2 + v**2)*x/l**2],
[(-g*y + u**2 + v**2)*y/l**2],
[m*(-g*y + u**2 + v**2)/l**2]])
>>> symsystem2.comb_implicit_rhs
Matrix([
[                 u],
[                 v],
[                 0],
[                 0],
[-g*y + u**2 + v**2]])
>>> symsystem2.comb_implicit_mat
Matrix([
[1, 0, 0, 0,      0],
[0, 1, 0, 0,      0],
[0, 0, 1, 0,   -x/m],
[0, 0, 0, 1,   -y/m],
[0, 0, 0, 0, l**2/m]])
>>> symsystem3.dyn_implicit_rhs
Matrix([
[                 0],
[                 0],
[-g*y + u**2 + v**2]])
>>> symsystem3.dyn_implicit_mat
Matrix([
[1, 0,   -x/m],
[0, 1,   -y/m],
[0, 0, l**2/m]])
>>> symsystem3.kin_explicit_rhs
Matrix([
[u],
[v]])
>>> symsystem1.alg_con
[4]
>>> symsystem1.bodies
(Pa,)
>>> symsystem1.loads
((P, g*m*N.x),)