本章的解决方案深深扎根于对
常微分方程 的先验知识。读者在阅读本章之前应该先了解该主题。
状态方程是一个一阶线性微分方程,或更准确地说,是一个线性微分方程组。由于这是一个一阶方程,我们可以使用 常微分方程 的结果来找到关于状态变量x 的方程的通解。一旦状态方程对x 求解,该解就可以代入输出方程。得到的方程将显示系统输入和系统输出之间的直接关系,无需明确考虑系统的内部状态。本章中的各节将讨论状态空间方程的解,从最简单的案例(时不变、无输入)开始,到最复杂的案例(时变系统)结束。
再次看看状态方程
我们可以看到,这个方程是一个一阶微分方程,只是变量是向量,系数是矩阵。然而,由于矩阵微积分的规则,这些区别并不重要。我们可以忽略输入项(现在),并将该方程改写为以下形式
我们可以像这样分离变量
对两边积分,并将两边都乘以e 的幂,我们得到结果
其中C 是一个常数。我们可以将D = eC 赋值以使方程更容易,但我们也知道,D 然后将成为系统的初始条件。如果我们将变量t 中的值零代入,这将变得很明显。该方程的最终解如下所示
我们将矩阵指数eAt 称为状态转移矩阵,计算它虽然有时很困难,但对于分析和操纵系统至关重要。我们将在下面详细讨论计算矩阵指数。
然而,如果我们的输入是非零的(通常情况下,任何有趣的系统都是这样),我们的解决方案会稍微复杂一些。请注意,现在我们有了输入项,我们不能再轻松地分离变量并对两边积分。
我们减去以获得 在左侧,然后我们做一些奇怪的事情;我们用逆状态转移矩阵在两边预乘
这最后一步的理由可能看起来很模糊,所以我们将用一个例子来说明这一点
对以下表达式关于时间求导
微分中的乘积法则提醒我们,如果我们有两个函数相乘
然后我们对 t 求导,结果为
如果我们相应地设置我们的函数
则输出结果为
如果我们看一下这个结果,它与我们上面方程的结果相同。
使用我们例子中的结果,我们可以将我们方程左侧浓缩成一个导数
现在我们可以对两边积分,从初始时间 (t0) 到当前时间 (t),使用一个哑变量 τ,我们将更接近我们的结果。最后,如果我们预乘以 eAt,我们将得到最终结果
如果我们将这个解代入输出方程,我们将得到
这是状态空间方程的非零输入的广义时不变解。这些方程是重要的结果,对控制系统有进一步研究兴趣的学生应该记住这些方程。
状态转移矩阵,eAt,是上述时不变情况下广义状态空间解的重要组成部分。计算这个矩阵指数函数是分析新系统时首先要做的几件事之一,计算结果将揭示有关所讨论系统的关键信息。
可以使用泰勒级数展开直接计算矩阵指数
有关
对角矩阵和
约旦型矩阵的更多信息,请参阅
工程分析
此外,我们可以尝试将矩阵 A 对角化为对角矩阵或约旦标准型矩阵。对角矩阵的指数只是对角元素分别乘以该指数。约旦标准型矩阵的指数稍微复杂一些,但存在一个有用的模式可以利用来快速找到解。有兴趣的读者应该阅读工程分析中的相关段落。
状态转移矩阵,以及一般意义上的矩阵指数,是控制工程中非常重要的工具。
如果矩阵是对角矩阵,则状态转移矩阵可以通过将矩阵的每个对角元素作为e的幂次方来计算。
如果A矩阵是约旦标准型,则可以使用以下公式快速生成矩阵指数
其中λ是约旦标准型矩阵的特征值(对角线上的值)。
我们可以通过对以下拉普拉斯反变换求解来计算状态转移矩阵(或任何矩阵指数函数)
如果A是高阶矩阵,则求逆运算可能难以解决。
如果A矩阵是约旦标准型,则可以使用以下公式快速生成矩阵指数
其中λ是约旦标准型矩阵的特征值(对角线上的值)。
如果我们知道A的所有特征值,我们可以创建我们的转移矩阵T和逆转移矩阵T-1。这些矩阵将分别是右特征向量和左特征向量的矩阵。如果我们同时拥有左特征向量和右特征向量,我们可以计算出状态转移矩阵为
请注意,wi' 是第i个左特征向量的转置,而不是它的导数。我们将在后面的章节中详细讨论“特征值”、“特征向量”以及谱分解技术。
凯莱-哈密顿定理也可以用来找到矩阵指数的解。对于系统矩阵A的任何特征值λ,我们可以证明这两个方程是等价的
一旦我们解出方程的系数a,就可以将这些系数代入以下方程
给定以下矩阵A,求状态转移矩阵
我们可以找到该矩阵的特征值为λ = i,-i。如果我们将这些值代入我们的特征向量方程,得到
我们可以解出特征向量
有了特征向量,我们就可以解出左特征向量
现在,利用谱分解,我们可以构建状态转移矩阵
如果我们记得欧拉恒等式,我们可以将复指数分解成正弦函数。执行向量相乘后,所有的虚数项都会抵消,剩下的就是我们的结果
鼓励读者进行乘法运算,并尝试推导出该结果。
使用免费的 Python 库 'sympy',我们可以非常容易地自动计算状态转移矩阵
>>> from sympy import *
>>> t = symbols('t', positive = true)
>>> A = Matrix([[0,1],[-1,0]])
>>> exp(A*t).expand(complex=True)
⎡cos(t) sin(t)⎤
⎢ ⎥
⎣-sin(t) cos(t)⎦
你也可以在这个网站上尝试一下
sympy live
使用 MATLAB 中的符号工具箱,我们可以编写 MATLAB 代码来自动生成给定输入矩阵A的状态转移矩阵。以下是一个可以执行此任务的 MATLAB 代码示例
function [phi] = statetrans(A)
t = sym('t');
phi = expm(A * t);
end
使用此 MATLAB 函数来查找以下矩阵的状态转移矩阵(警告,计算可能需要一些时间)
矩阵 1 是一个对角矩阵,矩阵 2 具有复特征值,矩阵 3 是约旦标准型。这三个矩阵应该代表系统矩阵的一些常见形式。以下代码片段是输入到 MATLAB 中以生成这些矩阵的输入命令以及输出结果
- 矩阵 A1
>> A1 = [2 0 ; 0 2];
>> statetrans(A1)
ans =
[ exp(2*t), 0]
[ 0, exp(2*t)]
- 矩阵 A2
>> A2 = [0 1 ; -1 0];
>> statetrans(A1)
ans =
[ cos(t), sin(t)]
[ -sin(t), cos(t)]
- 矩阵 A3
>> A1 = [2 1 ; 0 2];
>> statetrans(A1)
ans =
[ exp(2*t), t*exp(2*t)]
[ 0, exp(2*t)]
在 MATLAB 中,有多种方法可以从标量(时不变)矩阵 A 计算状态转移矩阵。以下方法都将依赖于 *符号工具箱* 来执行方程操作。在每个代码片段的末尾,变量 **eAt** 包含矩阵 A 的状态转移矩阵。
- 直接法
t = sym('t');
eAt = expm(A * t);
- 拉普拉斯变换法
s = sym('s');
[n,n] = size(A);
in = inv(s*eye(n) - A);
eAt = ilaplace(in);
- 谱分解
t = sym('t');
[n,n] = size(A);
[V, e] = eig(A);
W = inv(V);
sum = [0 0;0 0];
for I = 1:n
sum = sum + expm(e(I,I)*t)*V(:,I)*W(I,:);
end;
eAt = sum;
这三种方法都应该产生相同的答案。鼓励学生验证这一点。