控制系统/状态空间方程
控制的“经典”方法(我们一直在学习的)主要基于变换域。当我们想要一般控制系统时,我们使用拉普拉斯变换(对于数字系统使用 Z 变换)来表示它,当我们想要检查系统的频率特性时,我们使用傅里叶变换。问题出现了,我们为什么要这样做呢?
让我们看一个基本的二阶拉普拉斯变换传递函数
我们可以根据系统的输入和输出将此方程分解
现在,当我们对我们的方程进行拉普拉斯逆变换时,我们可以看到
拉普拉斯变换转换了我们正在处理二阶微分方程的事实。拉普拉斯变换将系统从时域移到复频域,以便我们能够将系统研究和处理为代数多项式,而不是线性常微分方程。鉴于微分方程的复杂性,我们为什么要在时域工作呢?
事实证明,为了将我们高阶微分方程分解成多个一阶方程,人们可以找到一种新的方法来轻松地操作系统,而无需使用积分变换。这个问题的解决办法是状态变量。通过获取我们多个一阶微分方程并以向量形式分析它们,我们不仅可以使用简单的矩阵代数做我们在时域中做的事情,而且现在我们可以轻松地处理多输入多输出系统,而无需添加很多不必要的复杂性。这说明了为什么控制的“现代”状态空间方法变得流行起来。
在状态空间系统中,系统的内部状态由一个称为状态方程的方程显式地考虑。系统输出由当前系统状态和当前系统输入的组合给出,通过输出方程。这两个方程组成了一个方程组,统称为状态空间方程。状态空间是包含系统所有可能内部状态的向量空间。
为了使用状态空间方法对系统进行建模,系统必须满足此要求
- 系统必须是“集总的”
在此上下文中,“集总”意味着我们可以找到一个有限维状态空间向量,它完全描述了系统的所有此类内部状态。
本文主要考虑线性状态空间系统,其中状态方程和输出方程满足叠加原理。但是,状态空间方法对于非线性系统同样有效,尽管某些特定方法不适用于非线性系统。
状态空间符号的核心是状态的概念。系统的状态是指系统内部元素的当前值,这些元素独立于系统输出变化(但并非完全无关)。本质上,系统的状态是对系统内部组件值的显式说明。以下是一些示例
考虑一个具有输入和输出端子的电路。该电路可以包含任意数量的电感器和电容器。状态变量可以分别表示电感器和电容器的磁场和电场。
考虑一个弹簧-质量-阻尼器系统。状态变量可以表示弹簧的压缩量,或阻尼器的加速度。
考虑一个化学反应,其中将某些试剂倒入一个混合容器中,输出是随时间推移产生的化学产物的量。状态变量可以表示容器中未反应化学物质的量,或其他属性,例如容器中的热能量,这些热能可以促进反应。
使用状态空间方程对系统进行建模时,我们首先需要定义三个向量
- 输入变量
- SISO(单输入单输出)系统只有一个输入值,但 MIMO(多输入多输出)系统可能有多个输入。我们需要定义系统的所有输入并将它们排列成一个向量。
- 输出变量
- 这是系统输出值,在 MIMO 系统的情况下,我们可能有多个输出值。输出变量应该相互独立,并且只依赖于输入向量和状态向量的线性组合。
- 状态变量
- 状态变量代表系统内部随时间变化的值。例如,在电路中,节点电压或网格电流可以作为状态变量。在机械系统中,弹簧、重力和阻尼器施加的力可以作为状态变量。
我们用 u 表示输入变量,用 y 表示输出变量,用 x 表示状态变量。本质上,我们有以下关系
其中 f(x, u) 是我们的系统。此外,状态变量可以随着当前状态和系统输入的变化而变化
其中 x' 是状态变量的变化率。我们将在下一章定义 f(u, x) 和 g(u, x)。
多输入多输出
[edit | edit source]在拉普拉斯域中,如果我们想考虑具有多个输入和多个输出的系统,我们将需要依靠叠加原理来为每个输入和输出创建一组联立拉普拉斯方程。对于这样的系统,经典方法不仅不能简化情况,而且由于需要先将方程组转换为频域,进行操作,然后再转换回时域,因此操作起来实际上会更加困难。然而,拉普拉斯域技术可以与后面几章讨论的态空间技术相结合,以发挥两种技术的最佳优势。我们将在 MIMO 系统章节 中讨论 MIMO 系统。
态空间方程
[edit | edit source]在态空间系统表示中,我们有一组两个方程:一个用于确定系统状态的方程,另一个用于确定系统输出的方程。我们将使用变量 y(t) 作为系统的输出,x(t) 作为系统的状态,u(t) 作为系统的输入。我们使用符号 x'(t)(注意撇号)表示系统状态向量的导数,作为对系统当前状态和当前输入的依赖。象征性地,我们说存在变换 g 和 h,它们显示了这种关系
如果 x'(t) 和 y(t) 不是 x(t) 和 u(t) 的线性组合,则该系统被称为非线性系统。我们将在以后的章节中尝试讨论非线性系统。
第一个方程表明系统状态变化依赖于前一个系统状态、系统的初始状态、时间和系统输入。第二个方程表明系统输出依赖于当前系统状态、系统输入和当前时间。
如果系统状态变化 x'(t) 和系统输出 y(t) 是系统状态和输入向量的线性组合,那么我们可以说这些系统是线性系统,我们可以用矩阵形式重新写它们
[状态方程]
[输出方程]
如果系统本身是时不变的,我们可以如下重新写它们
状态方程显示了系统当前状态及其输入与系统未来状态之间的关系。输出方程显示了系统状态及其输入与输出之间的关系。这些方程表明,在给定系统中,当前输出依赖于当前输入和当前状态。未来状态也依赖于当前状态和当前输入。
重要的是要注意,特定系统的态空间方程不是唯一的,通过使用行操作操纵 A、B、C 和 D 矩阵,可以有无限多种方法来表示这些方程。但是,这些矩阵有许多“标准形式”,这使得某些计算更容易。在这些形式之间进行转换需要线性代数的知识。
- 态空间基定理
- 任何可以用有限个 n 阶微分方程或 n 阶差分方程来描述的系统,或者任何可以用它们来近似的系统,都可以用态空间方程来描述。因此,态空间方程的通解是所有这些方程组的解。
矩阵:A B C D
[edit | edit source]我们的系统具有以下形式
为了强调这些量可能不是简单的标量,而是向量,我们对它们进行了加粗处理。如果这些系统是时不变的,我们可以通过移除时间变量来简化它们。
现在,如果我们对这些函数关于时间 *t0* 的输入和状态向量求偏导数,我们将得到系统的矩阵。
在我们的时不变状态空间方程中,我们将这些矩阵及其关系写成
我们有四个常数矩阵:*A*,*B*,*C* 和 *D*。我们将在下面解释这些矩阵。
- 矩阵 A
- 矩阵 *A* 是 **系统矩阵**,它描述了当前状态如何影响状态变化 *x'*。如果状态变化不依赖于当前状态,则 *A* 将是零矩阵。状态矩阵的指数,*eAt* 称为 **状态转移矩阵**,这是一个我们将在下面描述的重要函数。
- 矩阵 B
- 矩阵 *B* 是 **控制矩阵**,它决定了系统输入如何影响状态变化。如果状态变化不依赖于系统输入,则 *B* 将是零矩阵。
- 矩阵 C
- 矩阵 *C* 是 **输出矩阵**,它决定了系统状态与系统输出之间的关系。
- 矩阵 D
- 矩阵 *D* 是 **前馈矩阵**,它允许系统输入直接影响系统输出。我们之前考虑过的一种基本的反馈系统没有前馈元素,因此对于我们已经考虑过的大多数系统,*D* 矩阵是零矩阵。
矩阵维度
[edit | edit source]由于我们将多个矩阵和向量加减和相乘,我们需要绝对确保矩阵具有兼容的维度,否则方程将是未定义的。对于整数 *p*,*q* 和 *r*,系统矩阵和向量的维度定义如下
向量 矩阵
矩阵维度
A: p × p
B: p × q
C: r × p
D: r × q
如果矩阵和向量的维度不匹配,则方程无效,结果将毫无意义。矩阵和向量必须具有兼容的维度,否则它们不能使用矩阵运算组合。
在本书的其余部分,我们将使用右侧的小模板作为关于矩阵维度的提醒,以便我们能够在整本书中保持一致的符号。
符号简写
[edit | edit source]系统的状态方程和输出方程可以用矩阵 A、B、C 和 D 表示。由于这些方程的形式总是相同的,我们可以使用有序四元组来表示一个系统。我们可以使用简写 (A, B, C, D) 来表示完整的 state-space 表示。此外,由于状态方程对我们以后的分析非常重要,我们可以写一个有序对 (A, B) 来表示状态方程
获取状态方程
[edit | edit source]状态方程的优点是,它们可以用来透明地描述连续和离散系统。有些教材会区分离散和连续情况下的符号,但本教材不会做出这种区分。相反,我们将选择对连续和离散系统都使用通用的系数矩阵 A、B、C 和 D。偶尔,本书可能会使用下标 C 来表示矩阵的连续时间版本,并使用下标 D 来表示同一矩阵的离散时间版本。其他教材可能会使用字母 F、H 和 G 表示连续系统,并使用 Γ 和 Θ 表示离散系统。但是,如果我们跟踪我们的时域系统,我们就不需要担心这样的符号。
从微分方程
[edit | edit source]假设我们有一个关于输入 u(t) 和输出 y(t) 的一般三阶微分方程
我们可以用以下方式创建状态变量向量 x
现在我们得到以下3个一阶微分方程:
现在,我们可以用各个x分量来定义状态向量x,并且我们也可以创建未来状态向量。
- ,
有了这些,我们可以为系统组装状态空间方程:
当然,这只是一个简单的例子,但大多数读者应该能够理解这种方法。
从传递函数
[edit | edit source]从拉普拉斯域传递函数获得状态空间方程的方法与从时域微分方程获得状态空间方程的方法非常相似。我们将从拉普拉斯域到状态空间域转换系统描述的过程称为实现。我们将在后面的章节中更详细地讨论实现。一般来说,假设我们有一个形式如下所示的传递函数:
我们可以将我们的A、B、C 和D矩阵写成如下形式:
这种形式的方程被称为系统的可控规范形,我们将在后面讨论。
注意,要执行此方法,分母和分子多项式必须是首一多项式,即最高阶项的系数必须为 1。如果最高阶项的系数不是 1,则必须将方程除以该系数以使其变为 1。
状态空间表示
[edit | edit source]需要注意的是,状态变量x 是用户定义的,因此是任意的。对于特定问题,定义x 的方法有很多,每种方法都会导致不同的状态空间方程。
注意:使用状态空间方程来表示系统有无限多种等效方法。有些方法比其他方法更好。一旦获得这些状态空间方程,就可以根据需要对其进行操作,以使其采用特定的形式。
考虑前面的连续时间示例。我们可以将方程改写为以下形式
- .
现在我们定义状态变量
以及一阶导数
- (这里可能存在错误。没有考虑到:。将五行前的内容封装起来:。)
那么该系统的状态空间方程将由以下公式给出:
x 也可以用在任何数量的变量变换中,作为数学上的方便。但是,变量 y 和 u 对应于物理信号,不能像 x 一样任意选择、重新定义或变换。
某型载人飞机的升降控制可以用以下公式表示:
其中 α 是飞机航行的方向,θ 是飞机所指的方向(姿态),δ 是副翼的角度(来自飞行员的控制输入)。该方程并非正确格式,因此我们需要创建一些哑变量
这将为我们提供状态方程:
从该方程可以看出,尽管我们得到了有效的状态方程,但变量 θ1 和 θ2 不一定对应于任何可测量的物理事件,而是用户构造的哑变量,用于帮助定义系统。但是请注意,变量 α 和 δ 确实对应于物理值,不能更改。
如果我们有一个在连续时间内定义的系统(A, B, C, D),我们可以将该系统离散化,以便使用数字计算机执行等效过程。我们可以使用导数的定义,如下所示
将此代入状态方程,并进行一些近似(暂时忽略极限),我们得到
我们可以移除这个极限,因为在离散系统中,样本之间的时间间隔是正数且不可忽略。根据定义,离散系统仅在某些时间点定义,而不是像极限所指示的那样在所有时间点定义。在离散系统中,我们只对系统在离散点的值感兴趣。如果这些点以每T秒(采样时间)均匀间隔,则系统的样本出现在t = kT处,其中k是一个整数。将kT代入我们上面给出的方程,我们得到
或者,使用我们之前开发的方括号速记,我们可以写成
以这种形式,状态空间系统可以使用软件非常容易地实现到数字计算机系统中,而不是使用复杂的模拟硬件。我们将在后面的章节中更详细地讨论这种关系和数字系统。
我们将写出离散时间状态空间方程为
变量T在控制系统中是一个常见变量,特别是在讨论连续时间系统的起点和终点,或讨论数字系统的采样时间时。然而,字母T的另一个常见用法是表示矩阵的转置操作。为了缓解这种歧义,我们将用prime表示矩阵的转置
其中A'是矩阵A的转置。
prime符号也经常用于表示时间导数。我们将在讨论的大多数矩阵都是时不变的;因为我们永远不会对时不变矩阵求时间导数,所以没有歧义。但是,对于时变矩阵,我们将使用以下符号来区分时间导数和转置
- 转置。
- 时间导数。
请注意,某些随时间变化的变量没有用(t)后缀编写,例如变量x、y和u。对于这些变量,prime的默认行为是时间导数,例如在状态方程中。如果需要对其中一个向量进行转置,则会显式添加(t)'后缀,以对应于我们上面的符号。
对于需要使用厄米特转置的实例,我们将使用符号
这种表示法在其他文献中很常见,并且在此处没有明显的歧义。
MATLAB 表示
[edit | edit source]状态空间系统可以使用 4 个系统矩阵 A、B、C 和 D 在 MATLAB 中表示。我们可以使用 ss 函数创建一个系统数据结构
sys = ss(A, B, C, D);
以这种方式创建的系统可以像之前描述的传递函数描述一样进行操作。要将传递函数转换为状态空间表示,我们可以使用 tf2ss 函数
[A, B, C, D] = tf2ss(num, den);
要执行相反的操作,我们可以使用 ss2tf 函数
[num, den] = ss2tf(A, B, C, D);