使用 StateSpace 的力学问题

以下是一些可以使用 StateSpace 解决的力学问题。

示例 1

../../../_images/Mechanics_Problems_Q1.svg

一个弹簧-质量-阻尼系统可以用质量 (m)、一个常数为 (k) 的弹簧和一个阻尼系数为 (b) 的阻尼器来建模。弹簧力与质量的位移成正比,阻尼力与质量的速度成正比。求系统的频率响应。该系统的自由体图如下所示:

../../../_images/Mechanics_Problems_Q1_FBD.svg

质量-弹簧-阻尼系统的运动方程为:

\[m\ddot{x} + b\dot{x} + kx = F(t)\]

哪里:

  • \(x\) 是质量的位移,

  • \(\dot{x}\) 是质量的速度,

  • \(\ddot{x}\) 是质量的加速度,

  • \(F(t)\) 是施加在系统上的外力。

为了确定质量-弹簧-阻尼系统的空间状态表示,我们将二阶微分方程简化为一组两个一阶微分方程。我们选择位置和速度作为我们的状态变量:

\[x_1 = x \quad \text{且} \quad x_2 = \dot{x}\]

状态方程变为:

\[ \begin{align}\begin{aligned}\begin{split}\dot{x}_1 = x_2 \\\end{split}\\\begin{split}\dot{x}_2 = -\frac{k}{m}x_1 - \frac{b}{m}x_2 + \frac{1}{m}F(t)\\\end{split}\end{aligned}\end{align} \]

状态空间可以表示为:

\[\begin{split}\mathbf{A} = \begin{bmatrix} 0 & 1 \\ -\frac{k}{m} & -\frac{b}{m} \end{bmatrix}, \quad \mathbf{B} = \begin{bmatrix} 0 \\ \frac{1}{m} \end{bmatrix}, \quad \mathbf{C} = \begin{bmatrix} 1 & 0 \end{bmatrix}\end{split}\]

状态方程可以写为

\[\begin{split}\dot{x} = \begin{bmatrix} \dot{x} \\ \ddot{x} \end{bmatrix} = \begin{bmatrix} 0 & 1 \\ -\frac{k}{m} & -\frac{b}{m} \end{bmatrix} \begin{bmatrix} x \\ \dot{x} \end{bmatrix} + \begin{bmatrix} 0 \\ \frac{1}{m} \end{bmatrix} F(t)\end{split}\]

使用 SymPy 的控制系统工具箱 (CST),我们可以定义状态空间表示并将其转换为传递函数。

解决方案

以下代码演示了如何使用SymPy定义弹簧-质量-阻尼系统的空间状态表示,并将其转换为传递函数:

>>> from sympy import symbols, Matrix
>>> from sympy.physics.control import *

定义变量

>>> m, k, b = symbols('m k b')

定义状态空间矩阵

>>> A = Matrix([[0, 1], [-k/m, -b/m]])
>>> B = Matrix([[0], [1/m]])
>>> C = Matrix([[1, 0]])
>>> D = Matrix([[0]])

创建 StateSpace 模型

>>> ss = StateSpace(A, B, C, D)
>>> ss
StateSpace(Matrix([
[   0,    1],
[-k/m, -b/m]]), Matrix([
[  0],
[1/m]]), Matrix([[1, 0]]), Matrix([[0]]))

通过重写方法将状态空间转换为传递函数。

>>> tf = ss.rewrite(TransferFunction)[0][0]
>>> tf
TransferFunction(1, b*s + k + m*s**2, s)

参考文献

  1. ctms.engin.umich.edu

示例 2

../../../_images/Mechanics_Problems_Q2.svg

这个问题解释了如何将一个旋转系统建模为状态空间模型。系统有输入扭矩 \(τ_a\) 和阻尼效应 \(B_{r1}\)\(B_{r2}\)。系统由两个通过弹簧连接的飞轮组成,其角位置分别记为 \(θ_1\)\(θ_2\)

旋转系统的能量变量包括储存在弹簧中的势能 \(1/2 K_r \theta^ 2\) 和储存在惯性元件中的动能 \(1/2 J \omega ^ 2\)

状态变量: 可以写成:

\[ \begin{align}\begin{aligned}x_1 = \theta_1 \quad \text{(第一个飞轮的角位置)}\\x_2 = \dot{\theta}_1 \quad \text{(第一个飞轮的角速度)}\\x_3 = \dot{\theta_2} \quad \text{(第二个飞轮的角速度)}\end{aligned}\end{align} \]

目标是找到一组一阶微分方程,这些方程以这些状态变量来描述系统。

首先,我们写出两个飞轮的运动方程,包括阻尼的影响。

  1. 对于第一个飞轮 (\(J_1\)):

    ../../../_images/Mechanics_Problems_Q2_FBD1.svg
    \[J_1 \ddot{\theta}_1 + B_{r1} \dot{\theta}_1 + K_r\theta_1 - B_{r1} \dot{\theta}_2 = - \tau_a\]
  2. 对于第二个飞轮 (\(J_2\)):

    ../../../_images/Mechanics_Problems_Q2_FBD2.svg
    \[J_2 \ddot{\theta}_2 + (B_{r2} + B_{r1}) \dot{\theta}_2 - B_{r1} \dot{\theta}_1 = 0\]

现在我们需要状态变量的导数方程。

\[\dot{x}_1 = \dot{\theta}_1 = x_2\]
\[ \begin{align}\begin{aligned}\dot{x}_2 = \ddot{\theta_1} = \frac{1}{J_1} \left(-\tau_a - B_{r1} \dot{\theta_1} - K_r \theta_1 + B_{r1}\dot{\theta_2} \right)\\\dot{x}_2 = \frac{1}{J_1} \left(-\tau_a - B_{r1} x_2 - K_r x_1 + B_{r1} x_3 \right)\end{aligned}\end{align} \]
\[ \begin{align}\begin{aligned}\dot{x}_3 = \ddot{\theta}_2 = \frac{1}{J_2} \left(- (B_{r2} + B_{r1}) \dot{\theta_2} + B_{r1} \dot{\theta_1} \right)\\\dot{x}_3 = \frac{1}{J_2} \left( - (B_{r2} + B_{r1}) x_3 + B_{r1} x_2 \right)\end{aligned}\end{align} \]

系统的状态空间模型可以用标准形式表示:

\[ \begin{align}\begin{aligned}\dot{x} = A x + B u\\y = C x + D u\end{aligned}\end{align} \]

哪里:

  • x 是状态向量:

    \[\begin{split}x = \begin{bmatrix} x_1 \\ x_2 \\ x_3 \end{bmatrix} = \begin{bmatrix} \theta_1 \\ \dot{\theta}_1 \\ \theta_2 \end{bmatrix}\end{split}\]
  • u 是输入扭矩 (\(τ_a\))。

  • y 是输出角位置 (\(θ_1\))。

矩阵 ABCD 定义如下:

A 矩阵 表示状态变量之间的关系。它定义为:

\[\begin{split}A = \begin{bmatrix} 0 & 1 & 0 \\ -\frac{K_r}{J_1} & -\frac{B_{r1}}{J_1} & \frac{B_{r1}}{J_1} \\ 0 & \frac{B_{r1}}{J_2} x_2 & -\frac{B_{r2} + B_{r1}}{J_2} \end{bmatrix}\end{split}\]

B 矩阵 表示输入扭矩对系统的影响。其定义为:

\[\begin{split}B = \begin{bmatrix} 0 \\ \frac{-1}{J_1} \\ 0 \end{bmatrix}\end{split}\]

C 矩阵 定义了输出 (y) 和状态变量 (x) 之间的关系。由于我们只对角位置 θ₁ 感兴趣,C 矩阵 是:

\[C = \begin{bmatrix} 1 & 0 & 0 \end{bmatrix}\]

D 矩阵 是直接传输矩阵。由于输入和输出之间没有直接传输,D 为零:

\[D = 0\]

解决方案

>>> from sympy import symbols, Matrix
>>> from sympy.physics.control import StateSpace
>>> K_r, J1, J2, B_r1, B_r2, x2 = symbols('K_r J1 J2 B_r1 B_r2 x2')
>>> A = Matrix([[0, 1, 0], [-K_r/J1, -B_r1/J1, B_r1/J1], [0, B_r1/J2 * x2, - (B_r2 + B_r1)/J2]])
>>> B = Matrix([[0], [-1/J1], [0]])
>>> C = Matrix([[1, 0, 0]])
>>> ss = StateSpace(A, B, C)
>>> ss
StateSpace(Matrix([
[      0,          1,                 0],
[-K_r/J1,   -B_r1/J1,           B_r1/J1],
[      0, B_r1*x2/J2, (-B_r1 - B_r2)/J2]]), Matrix([
[    0],
[-1/J1],
[    0]]), Matrix([[1, 0, 0]]), Matrix([[0]]))

参考文献

  1. https://lpsa.swarthmore.edu/