使用 StateSpace 的力学问题¶
以下是一些可以使用 StateSpace 解决的力学问题。
示例 1¶
一个弹簧-质量-阻尼系统可以用质量 (m)、一个常数为 (k) 的弹簧和一个阻尼系数为 (b) 的阻尼器来建模。弹簧力与质量的位移成正比,阻尼力与质量的速度成正比。求系统的频率响应。该系统的自由体图如下所示:
质量-弹簧-阻尼系统的运动方程为:
哪里:
\(x\) 是质量的位移,
\(\dot{x}\) 是质量的速度,
\(\ddot{x}\) 是质量的加速度,
\(F(t)\) 是施加在系统上的外力。
为了确定质量-弹簧-阻尼系统的空间状态表示,我们将二阶微分方程简化为一组两个一阶微分方程。我们选择位置和速度作为我们的状态变量:
状态方程变为:
状态空间可以表示为:
状态方程可以写为
使用 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)
参考文献¶
示例 2¶
这个问题解释了如何将一个旋转系统建模为状态空间模型。系统有输入扭矩 \(τ_a\) 和阻尼效应 \(B_{r1}\) 和 \(B_{r2}\)。系统由两个通过弹簧连接的飞轮组成,其角位置分别记为 \(θ_1\) 和 \(θ_2\)。
旋转系统的能量变量包括储存在弹簧中的势能 \(1/2 K_r \theta^ 2\) 和储存在惯性元件中的动能 \(1/2 J \omega ^ 2\)。
状态变量: 可以写成:
目标是找到一组一阶微分方程,这些方程以这些状态变量来描述系统。
首先,我们写出两个飞轮的运动方程,包括阻尼的影响。
对于第一个飞轮 (\(J_1\)):
\[J_1 \ddot{\theta}_1 + B_{r1} \dot{\theta}_1 + K_r\theta_1 - B_{r1} \dot{\theta}_2 = - \tau_a\]对于第二个飞轮 (\(J_2\)):
\[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} \]
系统的状态空间模型可以用标准形式表示:
哪里:
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\))。
矩阵 A、B、C 和 D 定义如下:
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]]))