使用状态空间解决电气问题¶
状态空间方法是控制理论中用于建模和分析系统的一种强大方法。与仅关注输入-输出关系的传递函数方法不同,状态空间方法将系统表示为一组一阶微分方程。
系统的状态空间表示可以写成:
\[\begin{split}\dot{x}(t) = A x(t) + B u(t) \\ y(t) = C x(t) + D u(t)\end{split}\]
其中 \(x(t)\) 是状态向量,\(u(t)\) 是输入向量,\(y(t)\) 是输出向量,\(A\)、\(B\)、\(C\) 和 \(D\) 是定义系统动态的矩阵。
以下是一些示例,演示如何使用 StateSpace 解决电气问题。
示例 1¶
在串联 RLC 电路中,我们有一个电阻 \(R\) ,一个电感 \(L\) ,和一个电容 \(C\) 与输入电压 \(v_{in}(t)\) 串联。状态变量是通过电感的电流 \(i(t)\) 和电容两端的电压 \(v_C(t)\) 。
在上图的回路中应用 基尔霍夫电压定律 (KVL) 得到:
\[v_{in}(t) = R \cdot i(t) + L \frac{di(t)}{dt} + V_C(t)\]
其中:\(v_{in}(t)\) 是输入电压,\(i(t)\) 是通过电感的电流,\(v_C(t)\) 是电容器两端的电压。
此方程将输入电压与RLC电路的元件联系起来。
电容器电压方程
电容器两端的电压可以通过以下公式与电流相关联:
\[V_C(t) = \frac{1}{C} \int i(t) \, dt\]
对两边取时间导数,我们得到电容器电压的变化率:
\[\dot{v}_C(t) = \frac{d v_C(t)}{dt} = \frac{i(t)}{C}\]
这个方程表明电容器电压的变化率与电路中的电流成正比。
从KVL方程中,求解电流的导数得到:
\[\frac{di(t)}{dt} = -\frac{R}{L} i(t) - \frac{1}{L} v_C(t) + \frac{1}{L} v_{in}(t)\]
这是一个描述电路元件和输入电压下电流变化率的微分方程。
状态空间表示法通过状态变量来表达系统,这些状态变量通常是描述电路元件中存储的能量(如电流和电压)的变量。
我们将状态向量 \(X(t)\) 定义为:
\[\begin{split}X(t) = \begin{bmatrix} x_1(t) \\ x_2(t) \end{bmatrix} = \begin{bmatrix} i(t) \\ v_C(t) \end{bmatrix}\end{split}\]
这里 \(x_1(t) = i(t)\) 是通过电感的电流,\(x_2(t) = v_C(t)\) 是电容器两端的电压。
输入向量 \(U(t)\) 是输入电压:
\[U(t) = v_{in}(t)\]
以状态变量表示的微分方程系统变为:
当前的导数:
\[\dot{x}_1(t) = -\frac{R}{L} x_1(t) - \frac{1}{L} x_2(t) + \frac{1}{L} v_{in}(t)\]电容器电压的导数:
\[\dot{x}_2(t) = \frac{x_1(t)}{C}\]
串联RLC电路的矩阵为:
\[\begin{split}A = \begin{bmatrix} -\frac{R}{L} & -\frac{1}{L} \\ \frac{1}{C} & 0 \end{bmatrix}, B = \begin{bmatrix} \frac{1}{L} \\ 0 \end{bmatrix}, C = \begin{bmatrix} 0 & 1 \end{bmatrix}, D = \begin{bmatrix} 0 \end{bmatrix}\end{split}\]
因此,串联RLC电路的状态空间表示为:
\[ \begin{align}\begin{aligned}\begin{split}\dot{X}(t) = \begin{bmatrix} -\frac{R}{L} & -\frac{1}{L} \\ \frac{1}{C} & 0 \end{bmatrix} \begin{bmatrix} x_1(t) \\ x_2(t) \end{bmatrix} + \begin{bmatrix} \frac{1}{L} \\ 0 \end{bmatrix} V_{in}(t)\end{split}\\\begin{split}Y(t) = \begin{bmatrix} 0 & 1 \end{bmatrix} \begin{bmatrix} x_1(t) \\ x_2(t) \end{bmatrix} + \begin{bmatrix} 0 \end{bmatrix} V_{in}(t)\end{split}\end{aligned}\end{align} \]
状态空间表示法通过使用矩阵来描述系统的动态特性,提供了一种紧凑的串联RLC电路建模方法。矩阵 \(A\)、\(B\)、\(C\) 和 \(D\) 捕捉了电路状态变量、输入和输出之间的关系。这种表示法特别适用于分析系统在时域中的行为以及设计控制系统。
解决方案
>>> from sympy import Matrix, symbols, pprint >>> from sympy.physics.control import * >>> R, L, C = symbols('R L C') >>> A = Matrix([[-R/L, -1/L], [1/C, 0]]) >>> B = Matrix([[1/L], [0]]) >>> C = Matrix([[0, 1]]) >>> D = Matrix([[0]]) >>> ss = StateSpace(A, B, C, D) >>> ss StateSpace(Matrix([ [-R/L, -1/L], [ 1/C, 0]]), Matrix([ [1/L], [ 0]]), Matrix([[0, 1]]), Matrix([[0]]))我们可以通过重写方法将状态空间转换为传递函数。
>>> tf = ss.rewrite(TransferFunction)[0][0] >>> tf TransferFunction(1, C*L*s**2 + C*R*s + 1, s)
示例 2¶
获取如图所示的电气系统所表示的系统的状态模型
系统通过两个状态变量 \(x_1(t)\) 和 \(x_2(t)\) 进行建模,它们分别与节点 \(v_1(t)\) 和 \(v_2(t)\) 处的物理电压相关。
定义两个状态变量为:
\[v_1(t) = x_1(t) v_2(t) = x_2(t)\]
通过在节点 \(v_1(t)\) 和 \(v_2(t)\) 处应用基尔霍夫电流定律(KCL),推导出控制方程。
在节点 \(v_1(t)\) 应用 KCL:
\[\frac{v_1(t) - u(t)}{R} + C \frac{d v_1(t)}{dt} + \frac{v_1(t) - v_2(t)}{R} = 0\]
替换状态变量:
\[\frac{x_1(t) - u(t)}{R} + C \frac{dx_1(t)}{dt} + \frac{x_1(t) - x_2(t)}{R} = 0\]
简化:
\[C \dot{x_1}(t) = -\frac{2x_1(t)}{R} + \frac{x_2(t)}{R} + \frac{u(t)}{R}\]
因此,\(x_1(t)\) 的状态方程变为:
\[\dot{x_1}(t) = -\frac{2x_1(t)}{RC} + \frac{x_2(t)}{RC} + \frac{u(t)}{RC}\]
在节点 \(v_2(t)\) 应用 KCL:
\[C \frac{d v_2(t)}{dt} + \frac{v_2(t) - v_1(t)}{R} = 0\]
替换状态变量:
\[C \frac{d x_2(t)}{dt} + \frac{x_2(t) - x_1(t)}{R} = 0\]
简化:
\[C \dot{x_2}(t) = \frac{x_1(t)}{R} - \frac{x_2(t)}{R}\]
因此,\(x_2(t)\) 的状态方程变为:
\[\dot{x_2}(t) = \frac{x_1(t)}{RC} - \frac{x_2(t)}{RC}\]
状态空间表示法由以下矩阵方程给出:
\[\begin{split}\begin{bmatrix} \dot{x_1}(t) \\ \dot{x_2}(t) \end{bmatrix} = \begin{bmatrix} -\frac{2}{RC} & \frac{1}{RC} \\ \frac{1}{RC} & -\frac{1}{RC} \end{bmatrix} \begin{bmatrix} x_1(t) \\ x_2(t) \end{bmatrix} + \begin{bmatrix} \frac{1}{RC} \\ 0 \end{bmatrix} u(t)\end{split}\]
电路的输出定义为:
\[y(t) = v_2(t) = x_2(t)\]
因此,输出方程可以写成:
\[\begin{split}y(t) = \begin{bmatrix} 0 & 1 \end{bmatrix} \begin{bmatrix} x_1(t) \\ x_2(t) \end{bmatrix}\end{split}\]
解决方案
>>> from sympy import symbols, Matrix
>>> from sympy.physics.control import *
>>> R, C = symbols('R C')
>>> A = Matrix([[-2/(R*C), 1/(R*C)], [1/(R*C), -1/(R*C)]])
>>> B = Matrix([[1/(R*C)], [0]])
>>> C = Matrix([[0, 1]])
>>> ss = StateSpace(A, B, C)
>>> ss
StateSpace(Matrix([
[-2/(C*R), 1/(C*R)],
[ 1/(C*R), -1/(C*R)]]), Matrix([
[1/(C*R)],
[ 0]]), Matrix([[0, 1]]), Matrix([[0]]))
参考文献¶
bmsce.ac.in 的链接