matlab学习006-使用matlab绘出系统的冲激响应和阶跃响应波形并求其冲激响应的数值解

发布于:2024-05-01 ⋅ 阅读:(48) ⋅ 点赞:(0)

目录

题目

1,绘出系统的冲激响应和阶跃响应波形

1)基础

2)效果

3)代码

2,求出t=0.5s,1s,1.5s,2s时系统冲激响应的数值解。

 1)基础

2)效果

3)代码


题目

已知描述某连续系统的微分方程为:y’’(t)+5y’(t)+6y(t)=3f’(t)+2f(t)


1,绘出系统的冲激响应和阶跃响应波形

1)基础

  • 冲激响应是在输入为单位冲激信号时的系统输出。
  • 阶跃响应是在输入为单位阶跃信号时的系统输出。
  • 传递函数 :​零初始条件下线性系统响应量(即输出y(t))的拉普拉斯变换Y(s)(或z变换)Y(z)与激励量(即输入x(t))的拉普拉斯变换X(s)之比。记作G(s)=Y(s)/X(s),传递函数是描述线性系统动态特性的基本数学工具之一。
  • MATLAB中的impulse函数可以得到冲激响应的时间序列数据

为了绘制连续系统的冲激响应和阶跃响应波形,需要先确定系统的传递函数。对于给定的微分方程y''(t) + 5y'(t) + 6y(t) = 3f'(t) + 2f(t)可以转化为传递函数的形式:

  1. 首先,对输入f(t)和输出y(t)进行拉普拉斯变换→F(s)和Y(s)。
  2. 将微风方程转换为:s^2Y(s) + 5sY(s) + 6Y(s) = 3sF(s) + 2*F(s)。
  3. 之后整理得:Y(s) = (3sF(s) + 2F(s)) / (s^2 + 5s + 6)。
  4. 然后,对分子和分母进行因式分解。
  5. 最后利用部分分式展开的方法得到系统的传递函数。(在MATLAB中,tf函数可以直接用来创建传递函数。)

impulse函数: 

 step函数:


 

2)效果

3)代码

% 定义系统的传递函数  
fenzi = [3 2]; % 分子多项式系数  
fenmu = [1 5 6]; % 分母多项式系数  
sys = tf(fenzi, fenmu); % 创建传递函数对象  
  
% 计算冲激响应  
[ y_impulse,t_impulse] = impulse(sys);  %时间向量t_impulse和响应向量y_impulse
  
% 绘制冲激响应波形  
figure;  
subplot(2,1,1);
plot(t_impulse, y_impulse);  
title('冲激响应波形');  
xlabel('时间 (t)');  
ylabel('响应 (y)');  
grid on;  
  
% 计算阶跃响应  
[ y_step,t_step] = step(sys);  
  
% 绘制阶跃响应波形 
subplot(2,1,2);
plot(t_step, y_step);  
title('阶跃响应波形');  
xlabel('时间 (t)');  
ylabel('响应 (y)');  
grid on;

2,求出t=0.5s,1s,1.5s,2s时系统冲激响应的数值解。

 1)基础

可以使用插值或者查找的方法来获取特定时间点的冲激响应值。由于impulse函数返回的时间向量和响应向量通常是等间隔的,我们可以直接通过索引来查找对应时间点的值。

步骤:

  1. 首先定义想要查询的时间点t_query,并使用interp1函数和'nearest'选项来查找这些时间点对应的最近冲激响应值。

注意点:

  1. 如果t_impulse的时间间隔不够小,使用'nearest'选项可能会导致一些误差。
  2. 在这种情况下,可能需要使用更精确的插值方法,如'linear''spline'
  3. 对于大多数控制系统分析,如果t_impulse的时间向量足够密集,'nearest'选项通常就足够了。

  interp1函数:(interp字母后面带着的是数字1)

 num2str函数:

 

2)效果

 

 

3)代码

 

% 定义系统的传递函数  
fenzi = [3 2]; % 分子多项式系数  
fenmu = [1 5 6]; % 分母多项式系数  
sys = tf(fenzi, fenmu); % 创建传递函数对象  
% 计算冲激响应  
[ y_impulse,t_impulse] = impulse(sys);  %响应向量y_impulse和时间向量t_impulse

% 定义想要查询的时间点
t_query = [0.5 1 1.5 2];
% 查找对应时间点的冲激响应值
% 由于t_impulse和y_impulse是等间隔的,可以使用插值或者查找最近点的方法
% 这里假设t_impulse的间隔足够小,可以直接查找最近点
y_query = interp1(t_impulse, y_impulse, t_query, 'nearest');

% 显示结果
disp(['在 t = 0.5s, 1s, 1.5s, 2s 时的冲激响应分别为: ' num2str(y_query)]);
  

有问题请在评论区留言,1天8h在线。