MATLAB信号处理---学习小案例(6)---连续时间系统的时域分析

连续时间系统的零状态与零输入响应的求解分析

连续时间线性非时变系统(LTI)可以用如下的线性常系数微分方程来表示:
a n y ( n ) ( t ) + a n − 1 y ( n − 1 ) ( t ) + … … + a 1 y ′ ( t ) + a 0 y ( t ) = b m f ( m ) ( t ) + … … + b 1 f ′ ( t ) + b 0 f ( t ) a_ny^{(n)}(t) + a_{n-1}y^{(n-1)}(t) + …… + a_1y^{'}(t) + a_0y(t) = b_mf^{(m)}(t) + …… + b_1f^{'}(t) + b_0f(t) any(n)(t)+an1y(n1)(t)++a1y(t)+a0y(t)=bmf(m)(t)++b1f(t)+b0f(t)
其中,n>=m,系统的初始条件为: y ( 0 ) , y ′ ( 0 ) , y ′ ′ ( 0 ) , … … , y n − 1 ( 0 ) y(0),y^{'}(0),y^{''}(0),……,y^{n-1}(0) y(0),y(0),y(0),,yn1(0)

系统的响应一般包括两个部分,由当前输入所产生的响应(零状态响应)和由历史输入(初始状态)所产生的响应(零输入响应)

连续时间系统可以使用常系数微分方程来描述,其完全响应由零输入响应和零状态响应组成。

MATLAB符号工具箱提供了函数desolve,可以实现对常系数微分方程的符号求解,其调用格式如下:

dsolve('eq1,eq2……','cond1,cond2,……','v')

其中,参数eq表示各个微分方程,它与MATLAB符号表达式的输入基本相同,微分和导数的输入是使用Dy,D2y,D3y来表示y的一阶导数,二阶导数,三阶导数;参数cond表示初始条件或者起始条件;参数v表示自变量,默认是变量t。通过使用函数dsolve可以求出系统微分方程的零输入响应和零状态响应,进而求出完全响应。

代码:

clear all;
eq = 'D2y + 3 * Dy + 2 * y = 0';
cond = 'y(0) = 1,Dy(0) = 2';
yzi = dsolve(eq,cond);
yzi = simplify(yzi)

输出结果:

yzi =
 
exp(-2*t)*(4*exp(t) - 3)

连续时间系统数值求解

在MATLAB中,控制系统工具箱提供了一个用于求解零初始条件微分方程数值的函数lsim,其调用格式如下:

y=lsim(sys,f,t)

式中,t表示计算系统响应的抽样点向量,f表示系统输入信号向量,sys是LTI系统模型,用来表示微分方程、差分方程或状态方程,其调用格式

sys=tf(b,a)

式中,b和a分别是微分方程的右端和左端系数向量。

例如,对于以下方程:

a 3 y ′ ′ ′ ( t ) + a 2 y ′ ′ ( t ) + a 1 y ′ ( t ) + a 0 y ( t ) = b 3 f ′ ′ ′ ( t ) + b 2 f ′ ′ ( t ) + b 1 f ′ ( t ) + b 0 f ( t ) a_3y^{'''}(t)+a_2y^{''}(t)+a_1y^{'}(t)+a_0y(t)=b_3f^{'''}(t)+b_2f^{''}(t)+b_1f^{'}(t)+b_0f(t) a3y(t)+a2y(t)+a1y(t)+a0y(t)=b3f(t)+b2f(t)+b1f(t)+b0f(t)

可用a=[ a 3 , a 2 , a 1 , a 0 a_3,a_2,a_1,a_0 a3,a2,a1,a0],a=[ b 3 , b 2 , b 1 , b 0 b_3,b_2,b_1,b_0 b3,b2,b1,b0];sys=tf(b,a)获得其LTI模型。注意,如果微分方程的左端或右端表达式中有缺项,则其向量a或b中的对应元素应为零,不能省略不写,否则出错。

clear
ts = 0;te = 5;dt=0.01;
sys=tf([1],[1 2 200]);
t = ts:dt:te;
f = 10 * cos(2 * pi * t);
y = lsim(sys,f,t);
plot(t,y);
xlabel('t(s)');
ylabel('y(s)');
title('零状态响应');
grid on;

在这里插入图片描述

连续时间系统冲激响应和阶跃响应分析

在MATLAB中,求解系统冲激响应可应用控制系统工具箱中提供的函数impulse,求解阶跃响应可使用函数step,其调用形式为

y=impulse(sys,t)
y=step(sys,t)

式中,t表示计算系统响应的抽样点向量,sys是LTI系统模型

clear all;
t = 0:0.002:4;
sys = tf([1,32],[1,4,64]);
h = impulse(sys,t); %冲激响应
g = step(sys,t); %阶跃响应
subplot(2,1,1);
plot(t,h);
grid on;
xlabel('时间/s');
ylabel('h(t)');
title('冲激响应');
subplot(2,1,2);
plot(t,g);
grid on;
xlabel('时间/s');
ylabel('g(t)');
title('阶跃响应');

在这里插入图片描述

案例:

计算下述方程在冲激、阶跃、斜坡、正弦激励下的零状态响应为:

y ( 4 ) ( t ) + 0.64 y ( 3 ) ( t ) + 0.94 y ( 2 ) ( t ) + 0.51 y ( 1 ) ( t ) + 0.01 y ( t ) = − 0.48 f ( 3 ) ( t ) − 0.25 f ( 2 ) ( t ) − 0.12 f ( 1 ) ( t ) − 0.06 f ( t ) y^{(4)}(t) + 0.64y^{(3)}(t) + 0.94y^{(2)}(t) + 0.51y^{(1)}(t) + 0.01y(t) = -0.48f^{(3)}(t)-0.25f^{(2)}(t)-0.12f^{(1)}(t)-0.06f(t) y(4)(t)+0.64y(3)(t)+0.94y(2)(t)+0.51y(1)(t)+0.01y(t)=0.48f(3)(t)0.25f(2)(t)0.12f(1)(t)0.06f(t)

程序:

b = [-0.48 -0.25 -0.12 -0.06];
a = [1 0.64 0.94 0.51 0.01];
sys = tf(b,a);
T = 1000;
t = 0:1/T:10;
t1 = -5:1/T:5;
f1 = stepfun(t1,-1/T) - stepfun(t1,1/T);
f2 = stepfun(t1,0);
f3 = t;
f4 = sin(t);
y1 = lsim(sys,f1,t);
y2 = lsim(sys,f2,t);
y3 = lsim(sys,f3,t);
y4 = lsim(sys,f4,t);
subplot(221);
plot(t,y1);
xlabel('t');
ylabel('y1(t)');
title('冲激激励下的零状态响应');
grid on;
axis([0 10 -1.2 1.2]);
subplot(222);
plot(t,y2);
xlabel('t');
ylabel('y2(t)');
title('阶跃激励下的零状态响应');
grid on;
axis([0 10 -1.2 1.2]);
subplot(223);
plot(t,y3);
xlabel('t');
ylabel('y3(t)');
title('斜坡激励下的零状态响应');
grid on;
axis([0 10 -5 0.5]);
subplot(224);
plot(t,y4);
xlabel('t');
ylabel('y4(t)');
title('正弦激励下的零状态响应');
grid on;
axis([0 10 -1.5 1.2]);

在这里插入图片描述

连续时间系统卷积求解

连续信号的卷积积分定义是

f ( t ) = f 1 ( t ) ∗ f 2 ( t ) = ∫ − ∞ ∞ f 1 ( τ ) f 2 ( t − τ ) d τ f(t) = f_1(t) * f_2(t) = \int_{-\infty}^\infty f_1(\tau)f_2(t - \tau)d\tau f(t)=f1(t)f2(t)=f1(τ)f2(tτ)dτ

信号的卷积运算有符号计算法和数值及算法,此处采用数值计算法,调用MATLAB的函数conv近似计算信号的卷积积分

案例:

用数值计算法求 f 1 ( t ) = u ( t ) − 0.5 u ( t − 2 ) f_1(t)=u(t) - 0.5u(t - 2) f1(t)=u(t)0.5u(t2) f 2 ( t ) = 2 e − 3 t u ( t ) f_2(t)=2e^{-3t}u(t) f2(t)=2e3tu(t)的卷积积分

程序:

dt = 0.01;
t = -1:dt:2.5;
f1 = heaviside(t) - 0.5 * heaviside(t - 2);
f2 = 2 * exp(-3 * t) .* heaviside(t);
f = conv(f1,f2) * dt;
n = length(f);
tt = (0:n-1) * dt - 2;
subplot(221);
plot(t,f1);
grid on;
axis([-1,2.5,-0.2,1.2]);
title('f1(t)');
xlabel('t');
ylabel('f1(t)');
subplot(222);
plot(t,f2);
grid on;
axis([-1,2.5,-0.2,1.2]);
title('f2(t)');
xlabel('t');
ylabel('f2(t)');
subplot(212);
plot(tt,f);
grid on;
title('卷积积分');
xlabel('t');
ylabel('f3(t)');

在这里插入图片描述
参考文献:

  1. 《精通MATLAB信号处理》,沈再阳编写,清华大学出版社

猜你喜欢

转载自blog.csdn.net/Xiao_Jie123/article/details/111598493
今日推荐