开学之后这段时间就一直在补控制理论相关的内容,看到了DR_CAN关于“连续系统离散化”的介绍,顿时觉得醍醐灌顶!然后自己编写了一个Matlab脚本,主要是了解一些常见的连续系统离散化方法,以及通过比较连续时间系统和离散时间系统对单位阶跃输入的响应,从而加深对连续系统和离散系统二者关系的理解。
首先,通过定义状态矩阵A、输入矩阵B、输出矩阵C、直接传递矩阵D,使用ss函数(State Space,状态空间)建立了连续时间的状态空间系统sys(System缩写)。
然后,使用c2d函数(将一个连续时间系统离散化的函数),指定采样时间 Ts 和离散化方法(默认为零阶保持法,'zoh'),将连续时间系统sys_c转换为离散时间系统sys_d,使系统离散化。
%%% 使用 MATLAB 将一个连续时间的状态空间系统通过零阶保持法(Zero-Order Hold, ZOH)离散化为一个离散时间系统
A = [0 1;-0.5 -0.5] % 状态矩阵
B = [1;0] % 输入矩阵
C = [1 0] % 输出矩阵
D = [0] % 直接传递矩阵
% ss 函数(State Space)建立连续时间状态空间系统
sys = ss(A,B,C,D)
% 离散化是将一个连续时间系统转化为在离散时间点(时间步长是采样时间Ts)描述的离散系统
% c2d函数 形式:sys_d = c2d(sys_continuous, Ts, method)
% sys_continuous连续时间系统 sys_discrete离散时间系统
% Ts 是采样时间(单位:秒)
% method 是离散化方法,默认是 'zoh'(零阶保持)
Ps:顺带简单了解了一下连续系统离散化的方法, 在Matlab中通过c2d函数都能直接调用,如下:
% 离散化方法
% 1.零阶保持法 Zero-Order Hold
sys_d = c2d(sys,1,'zoh')
% 2.一阶保持法 First-Order Hold
% sys_d = c2d(sys,0.1,'foh')
% 3.双线性变换法 Tustin
% sys_d = c2d(sys,0.1,'tustin')
% 4.带预拉伸的双线性变换 Prewarp Tustin Method
% omega_p = 5; % omega_p表示预拉伸频率(单位:rad/s)
% sys_d = c2d(sys, 0.1, 'prewarp', omega_p);
% 5.冲激响应不变法 Impulse Invariant
% sys_d = c2d(sys,0.5,'impulse')
这样可能还不是很直观,接下来通过比较连续时间系统和离散时间系统的单位阶跃响应,利用step函数计算系统的单位阶跃响应(单位阶跃响应是系统对输入为单位阶跃信号(从 0 突然跳到 1)的输出响应),帮助加深对两者动态行为的理解。
% 生成连续时间系统的单位阶跃响应
t_c = 0:0.01:5; % 连续时间范围
[y_c, t_c] = step(sys, t_c); % 连续时间系统的阶跃响应
% 生成离散时间系统的单位阶跃响应
Ts = 1;
t_d = 0:Ts:5; % 离散时间点
u_d = ones(size(t_d)); % 离散单位阶跃输入
[y_d, t_d] = lsim(sys_d, u_d, t_d); % 离散时间系统的响应
% 绘制响应曲线
figure;
plot(t_c, y_c, 'b-', 'LineWidth', 1); hold on; % 连续系统响应
stairs(t_d, y_d, 'm-', 'LineWidth', 1.5); % 离散系统响应
xlabel('时间 (s)');
ylabel('响应');
title('连续时间系统与离散时间系统的单位阶跃响应');
legend('连续时间系统', '离散时间系统');
grid on;
以上代码可以直观地比较连续时间系统和离散时间系统的动态行为,通过调整不同采样时间,分别取Ts=0.1s,Ts=0.5s,Ts=1s,绘制出连续和离散系统的响应曲线如下(均采用零阶保持法):
Ts=0.1s
Ts=0.5s
Ts=1.0s
确实,这样看来就好理解多了,当然,还可以——
① 改变采样时间Ts:观察采样时间对离散系统响应精度的影响
② 改变离散化方法:在c2d函数中尝试其他离散化方法(上文有写),观察对离散系统响应的影响
③ 改变连续时间系统的参数:修改状态矩阵A或输入矩阵B,观察系统响应的变化
总之,可做的实验还有很多,最起码对“连续系统离散化”这一概念不算陌生了就,今天还是有收获哒!!!
最后附上完整代码:
%%% 使用 MATLAB 将一个连续时间的状态空间系统通过零阶保持法(Zero-Order Hold, ZOH)离散化为一个离散时间系统
A = [0 1;-0.5 -0.5] % 状态矩阵
B = [1;0] % 输入矩阵
C = [1 0] % 输出矩阵
D = [0] % 直接传递矩阵
% ss 函数(State Space)建立连续时间状态空间系统
sys = ss(A,B,C,D)
% 离散化是将一个连续时间系统转化为在离散时间点(时间步长是采样时间Ts)描述的离散系统
% c2d函数 形式:sys_d = c2d(sys_continuous, Ts, method)
% sys_continuous连续时间系统 sys_discrete离散时间系统
% Ts 是采样时间(单位:秒)
% method 是离散化方法,默认是 'zoh'(零阶保持)
% 离散化方法
% 1.零阶保持法 Zero-Order Hold
sys_d = c2d(sys,1.0,'zoh')
% 2.一阶保持法 First-Order Hold
% sys_d = c2d(sys,0.1,'foh')
% 3.双线性变换法 Tustin
% sys_d = c2d(sys,0.1,'tustin')
% 4.带预拉伸的双线性变换 Prewarp Tustin Method
% omega_p = 5; % omega_p表示预拉伸频率(单位:rad/s)
% sys_d = c2d(sys, 0.1, 'prewarp', omega_p);
% 5.冲激响应不变法 Impulse Invariant
% sys_d = c2d(sys,0.5,'impulse')
% 生成连续时间系统的单位阶跃响应
t_c = 0:0.01:5; % 连续时间范围
[y_c, t_c] = step(sys, t_c); % 连续时间系统的阶跃响应
% 生成离散时间系统的单位阶跃响应
Ts = 1.0;
t_d = 0:Ts:5; % 离散时间点
u_d = ones(size(t_d)); % 离散单位阶跃输入
[y_d, t_d] = lsim(sys_d, u_d, t_d); % 离散时间系统的响应
% 绘制响应曲线
figure;
plot(t_c, y_c, 'b-', 'LineWidth', 1); hold on; % 连续系统响应
stairs(t_d, y_d, 'm-', 'LineWidth', 1.5); % 离散系统响应
xlabel('时间 (s)');
ylabel('响应');
title('连续时间系统与离散时间系统的单位阶跃响应');
legend('连续时间系统', '离散时间系统');
grid on;