控制理论——连续系统离散化(常见离散方法及直观理解连续系统和离散系统之间的关系)

开学之后这段时间就一直在补控制理论相关的内容,看到了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;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值