一、状态空间模型概述

状态空间模型是一种通用的数学框架,可以用来表示在离散/连续时间下,通过已知输入和输出变量所描述的系统行为。在Matlab中,状态空间模型是由连续时间系统的一组常微分方程和离散时间系统的差分方程同时描述的。状态空间模型可以轻易地应用于控制工程、机械工程和电子工程等领域。

二、建立Matlab状态空间模型

1. 通过状态空间矩阵建立模型


% 状态空间模型定义 
A = [0 1 0; 0 0 1; -1 -2 -3];
B = [0; 0; 1];
C = [1 0 0];
D = 0;
sys = ss(A,B,C,D);

上述代码通过定义系统的状态矩阵$A$、输入矩阵$B$、输出矩阵$C$以及直接通路矩阵$D$,建立了一个3阶系统的状态空间模型。函数ss()被用来建立系统,其输出参数sys就是完整的系统状态空间模型。

2. 通过传递函数建立模型


% 系统传递函数
G = tf([1 2], [1 3 2]);
% 将系统传递函数转化为状态空间模型
sys = ss(G);

上面代码先定义系统的传递函数$G(s)=frac{s+2}{s^2+3s+2}$,然后使用函数ss将传递函数转换为状态空间模型。函数ss在不提供状态空间系数矩阵的情况下使用传递函数。

3. 建立离散时间下的状态空间模型


% 系统状态空间定义 
A = [0.9 0; 0 0.8];
B = [1; 0];
C = [0 1];
D = 0;
% 设置系统采样时间 
T = 0.1;
% 建立离散时间下的状态空间模型 
sys = ss(A, B, C, D, T);

代码中通过定义系统的状态矩阵$A$、输入矩阵$B$、输出矩阵$C$以及传递矩阵$D$,建立了一个系统的状态空间模型。另外,函数ss()通过添加采样时间$T$的信息,使得这个状态空间模型变为了一个离散时间下的状态空间模型。

三、Matlab状态空间模型的基本操作

1. 模型矩阵的提取


% 系统状态空间定义 
A = [0.9 0; 0 0.8];
B = [1; 0];
C = [0 1];
D = 0;
% 建立离散时间下的状态空间模型 
sys = ss(A, B, C, D);
% 提取模型矩阵
[p, m, k, e] = ssdata(sys);

上述代码中,通过函数ss()建立了一个状态空间模型sys。然后,模型矩阵可以通过函数ssdata()来提取,并将其分别赋值给$p$、$m$、$k$、$e$四个变量。

2. 系统零极点的计算


% 系统状态空间定义 
A = [0.9 0; 0 0.8];
B = [1; 0];
C = [0 1];
D = 0;
% 建立离散时间下的状态空间模型 
sys = ss(A, B, C, D);
% 计算系统的零极点 
[z, p, k] = zpkdata(sys);

通过函数ss()建立一个状态空间模型sys,之后通过函数zpkdata()计算出系统的零、极点,并分别赋值给变量$z$和$p$。此外,系统增益$k$也可以通过这个函数的输出来进行提取。

3. 可控性和可观性分析


% 系统状态空间定义 
A = [0.9 0; 0 0.8];
B = [1; 0];
C = [0 1];
D = 0;
% 建立离散时间下的状态空间模型 
sys = ss(A, B, C, D);
% 计算可控性和可观性
Co = ctrb(sys);
Ob = obsv(sys);

这段代码中,状态空间模型sys先被定义。然后,通过ctrb()和obsv()函数计算出系统的可控和可观矩阵Co和Ob。计算完成后,这些矩阵可以用于分析系统的可控性和可观性。

四、状态空间模型的系统分析

1. 系统的稳定性分析


% 系统状态空间定义 
A = [0.9 0; 0 0.8];
B = [1; 0];
C = [0 1];
D = 0;
% 建立离散时间下的状态空间模型 
sys = ss(A, B, C, D);
% 检查系统稳定性
if max(abs(eig(A))) < 1
    fprintf('系统是稳定的');
else
    fprintf('系统是不稳定的');
end

对于一个离散时间下的状态空间模型,我们可以通过计算系统的特征值,来判断系统是否是稳定的。在代码中,我们通过在if语句中用max(abs(eig(A))) < 1来做到这一点。如果这个表达式返回true,那么这个系统就是稳定的。

2. 系统步响应的分析


% 状态空间模型定义 
A = [0.9 0; 0 0.8];
B = [1; 0];
C = [0 1];
D = 0;
% 建立离散时间下的状态空间模型 
sys = ss(A, B, C, D);
% 产生一个输入序列
T = 0:0.1:20;
u = 1*sin(T);
% 计算系统的步响应 
[Y, T, X] = lsim(sys, u, T);
% 绘制步响应曲线 
plot(T, Y);

上述代码中,通过函数lsim()、产生一个输入序列,计算出了系统的步响应$Y$。最后,通过绘制步响应曲线来观察系统的响应情况。

3. 系统频率响应的分析


% 系统状态空间定义 
A = [0 1; -0.6 -0.5];
B = [1; 0];
C = [0 1];
D = 0;
% 建立系统状态空间模型 
sys = ss(A, B, C, D);
% 计算系统频率响应 
w = logspace(-1, 1, 500);
[mag, phase] = bode(sys, w);
% 绘制系统频率响应曲线
subplot(2, 1, 1);
loglog(w, mag);
subplot(2, 1, 2);
semilogx(w, phase);

这段代码通过状态空间系数矩阵和传递函数中的数字滤波器,建立了一个系统的状态空间模型。之后,通过bode()函数计算出了系统的幅频响应和相频响应,并将结果存在变量mag和phase中。最后,通过绘制两个子图,从图形中观察系统的频率响应。

4. 系统控制增益的设计


% 系统状态空间定义 
A = [0 1; -0.6 -0.5];
B = [1; 0];
C = [0 1];
D = 0;
% 建立系统状态空间模型 
sys = ss(A, B, C, D);
% 构造控制器 
K = place(A, B, [-0.7, -0.6]);
% 模拟闭环系统的输入响应 
T = 0:0.1:10;
u = zeros(size(T));
u(T >= 1) = 1;
[Y, T, X] = lsim(sys, u, T);
% 计算反馈控制器的响应 
sys_cl = ss(A - B*K, B, C, D);
[Yc, Tc, Xc] = lsim(sys_cl, u, T);
% 画出两个系统的输入和输出响应 
subplot(2, 1, 1);
plot(T, Y, Tc, Yc, 'r--');
subplot(2, 1, 2);
plot(T, u);

这段代码中,先建立一个状态空间模型sys,之后用place()函数计算出了系统的控制增益K。接下来,通过函数lsim()模拟闭环系统的输入$u$和输出$Y$,同时计算了反馈控制器的响应。最后,通过画出两个系统的输入和输出响应曲线来检验控制增益是否符合预期。