MATLAB仿真学习课件_第1页
MATLAB仿真学习课件_第2页
MATLAB仿真学习课件_第3页
MATLAB仿真学习课件_第4页
MATLAB仿真学习课件_第5页
已阅读5页,还剩112页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二讲MATLAB仿真教学目标:学会用MATLAB进行仿真,包括编程仿真和SIMULINK仿真。

MATLAB程序设计

MATLAB编程仿真

Simulink仿真

第二章主要内容matlab的演示功能

demo

在线演示两种方法进入demo演示

第一部分MATLAB程序设计MATLAB的两种工作方式:M文件的两种形式:一、M文件简介(1)命令窗口的指令方式(2)M文件形式(1)脚本文件;(2)函数文件(1)for…end语句调用形式:

forv=表达式语句1;

…语句n;

end二、程序控制流语句例:

k=1:10;x=k.^2;x=149162536496481100fork=1:10

x(k)=k.^2;end(2)while…end语句调用形式:

whilev=表达式语句1;

…语句n;

end“if”调用形式:

if表达式语句段1;else语句段2;

end(3)条件分支结构“if”、“break”、“switch”“break”语句一般出现在循环体中,它表示跳出循环。Switch开关表达式:

case表达式1语句,…,语句case{表达式1,表达式2,…}语句,…,语句

…otherwise语句,…,语句end“switch”语句用来实现多重分支结构。用法:四、MATLAB函数编程

1、关键字”function“开头2、函数内部所定义的变量仅在函数内部有效—局部变量3、函数文件的文件名必须和函数名相同例:function[mean,stdev]=stat(x)n=length(x);mean=sum(x)/n;stdev=sqrt(sum((x-mean).^2/n));(1)尽量避免采用循环语句,可用向量化语句替代(2)对大型数组或矩阵先进行初始化,即用“zeros”或”ones”对矩阵定维,可减少内存分配耗时(3)尽量使用MATLAB内在函数(4)更先进有效的算法五、提高程序执行速度的原则

第二部分MATLAB编程仿真时间连续信号也称为模拟信号.时间连续的确定信号在物理上是一个随时间变化的(电压或电流)波形。数学上表示为一个时间连续的函数f(t).时间离散的确定信号数学上表示为确定序列{f(n)}。可使f(t)与{f(n)}一一对应。一、时间连续信号与系统的计算机仿真满足取样定理(1)建立数学模型(2)选择适合的计算机求解方法解仿真模型(3)编写MATLAB仿真程序或建立Simulink

模块方框图,调试并运行程序(4)得出数值解,分析并确定结果的可靠性连续信号与系统的计算机仿真步骤:MATLAB编程仿真求解:(1)零状态响应:系统在t=-1秒时刻初状态为零,输入信号为阶跃信号f(t)=u(t),输出为电容电压,试对时间t=[-1,10]秒的输出信号波形进行仿真求解。

+-f(t)RL+-改写为标准式并令状态变量列出KVL方程:微分方程的MATLAB函数格式是固定的,必须按照MATLAB所规定格式来编写.本例中需要将方程参数”R,L,C”传入.传入参数前的标志变量

“flag”是必须的,以符合求解函数”ode45”的要求。微分方程的MATLAB函数引导语句格式:

functionxdot=方程函数名(t,x,flag,附加参数)

编写微分方程组的MATLAB函数functionxdot=funcforex123(t,x,flag,R,L,C)

xdot=zeros(2,1);

xdot(1)=-R/L*x(1)-1/L*x(2)+1/L*f(t);

xdot(2)=1/C*x(1);

functionin=f(t)%输入信号

in=(t>0)*1;%阶跃信号

编写微分方程组的MATLAB函数%filenameex123.m

L=1;%电感值

C=0.1;%电容值

forR=[1.535]%仿真电阻值分别为1.5,3,5

[t,x]=ode45(‘funcforex123’,[-1,10],[0;0],[],R,L,C);

figure(1);plot(t,x(:,1));holdon;xlabel(‘timesec’);

text(0.9,0.17,’\leftarrow

i_L(t)’);grid;

figure(2);plot(t,x(:,2));holdon;xlabel(‘timesec’);

text(0.5,0.3,‘\leftarrow

u_C(t)’);grid;

end微分方程组求解:

a电感电流单位阶跃响应(零状态响应)波形仿真结果b电容电压单位阶跃响应(零状态响应)波形仿真结果[t,x]=ode45(方程函数名,仿真时间范围,状态变量初始值,算法选项,附加参数)

MATLAB中微分方程的求解方法有多种。较常用的ode23,ode45和ode15s等。调用方式完全相同,但针对的方程类型不同MATLAB编程仿真求解:(2)零输入响应:系统在t=-1秒时刻电容电压为Uc=1V,当t=-1秒时刻信号输入两端闭合,试对时间t=[-1,10]秒的输出信号波形进行仿真求解。

+-f(t)RL+-functionxdot=funcforex123(t,x,flag,R,L,C)

xdot=zeros(2,1);

xdot(1)=-R/L*x(1)-1/L*x(2)+1/L*f(t);

xdot(2)=1/C*x(1);

functionin=f(t)%输入信号

in=0;

%输入信号始终为0

编写微分方程组的MATLAB函数%filenameex123.m

L=1;%电感值

C=0.1;%电容值

forR=[1.535]%仿真电阻值分别为1.5,3,5

[t,x]=ode45(‘funcforex123’,[-1,10],[0;1],[],R,L,C);

figure(1);plot(t,x(:,1));holdon;xlabel(‘timesec’);

text(0.9,0.07,’\leftarrow

i_L(t)’);grid;

figure(2);plot(t,x(:,2));holdon;xlabel(‘timesec’);

text(0.5,0.3,‘\leftarrow

u_C(t)’);grid;

end微分方程组求解:a电感电流零输入响应波形仿真结果b电容电压零输入响应波形仿真结果

MATLAB编程仿真求解:(3)全响应:系统在t=-1秒时刻电容电压为Uc=1V,输入信号为阶跃信号f(t)=u(t),对时间t=[-1,10]秒的输出信号波形进行仿真求解+-f(t)RL+-functionxdot=funcforex123(t,x,flag,R,L,C)

xdot=zeros(2,1);

xdot(1)=-R/L*x(1)-1/L*x(2)+1/L*f(t);

xdot(2)=1/C*x(1);

functionin=f(t)%输入信号

in=(t>0)*1;

%输入信号为阶跃信号

编写微分方程组的MATLAB函数%filenameex123.m

L=1;%电感值

C=0.1;%电容值

forR=[1.535]%仿真电阻值分别为1.5,3,5

[t,x]=ode45(‘funcforex123’,[-1,10],[0;1],[],R,L,C);

figure(1);plot(t,x(:,1));holdon;xlabel(‘timesec’);

text(0.9,0.07,’\leftarrow

i_L(t)’);grid;

figure(2);plot(t,x(:,2));holdon;xlabel(‘timesec’);

text(0.5,0.3,‘\leftarrow

u_C(t)’);grid;

end微分方程组求解:a电感电流全响应波形仿真结果b电容电压全响应波形仿真结果

本例演示了对于一个动态电路瞬态响应的仿真过程.

对于任何电子电路:

(1)电路理论知识得出数学模型

(2)以MATLAB规定格式编写状态方程描述函数

(3)选择合适的求解方式并编写M文件求解

这也就完成了对电路的仿真.小结:分析:由于输入冲激信号是超越函数,不适于作数值计算,因此首先求系统的阶跃响应,然后对其进行微分得到冲激响应。为了应用差分函数”diff”进行近似微分,首先需要通过插值将被微分的数据在时间上均匀化,然后再利用”diff”进行近似微分,得出系统的冲激响应波形。例:对于上例系统,输出信号从电容电压取出,仿真计算系统的冲激响应,并与理论值对比?仿真计算步骤:(1)建立数学模型(2)编写函数文件描述要求解的微分方程(3)求解函数文件所描述的微分方程,得到电容电压(4)插值得出电容电压均匀取样点的输出波形值——阶跃响应(5)“diff”近似微分得出冲激响应波形(6)计算理论值,并对比(1)计算电路中电容电压的冲激响应的解析解冲激响应解析解:(2)求上例电路中电容电压的均匀取样点的输出波形值(阶跃响应),再对该波形微分得到冲激响应,最后与理论值比较。

1、状态方程函数程序funcforex123.m如下functionxdot=funcforex123(t,x,flag,R,L,C)

xdot=zeros(2,1);

xdot(1)=-R/L*x(1)-1/L*x(2)+1/L*f(t);

xdot(2)=1/C*x(1);

functionin=f(t)%输入信号

in=(t>0)*1;

%输入信号为阶跃信号

%filenameex123.m

[t,x]=ode45(‘funcforex123’,[-1,10],[0;0],[],3,1,0.1);

%求解上例电路的阶跃响应

ts=0.001;

t1=-1:ts:10;

x1=interp1(t,x(:,2),t1,’spline’);插值得均匀时间采样点电容电压波形

plot(t1,x1,’k-.’);%阶跃响应波形绘制

holdon;x1dot=[diff([x1])/ts,0];%近似微分得出冲激响应波形

plot(t1,[diff([x1])/ts,0],’k’);xlabel(‘timesec’);

ht=10/sqrt(7.75).*exp(-1.5*t1).*sin(sqrt(7.75)*t1).*(t1>0);

plot(t1(1:50:length(t1)),ht(1:50:length(t1)),’ko’);

legend(‘step

response’,’impluse

response’,’theoretic

impl

useresponse’);

2、主程序ex123b.m如下:

第三部分SIMULINK仿真什么是SIMULINK?SIMULINK是MATLAB中的一个建立系统方框图和基于方框图级的系统仿真环境,是一个对动态系统进行建模、仿真并对仿真结果进行分析的软件包。SIMULINK的特点可视化建模仿真结果可近乎“实时”地通过可视化模块,如示波器模块、频谱仪模块及数据输入、输出模块等显示出来。附带大量的专业仿真模块库在通信与电子工程领域,Simulink提供的常用专业模块库有:

(1)CDMA参考库(2)通信系统模块库

(3)DSP模块库等SIMULINK仿真步骤:启动MATLAB,进入simulink模块库窗口在simulink窗口单击菜单项file\new\model,新建一个simulink模型文件在simulink库中选取所需模块,拖到新建模型窗口,连接成目标系统各模块参数设置仿真

第三部分SIMULINK仿真MATLAB命令窗口与simulink的交互将该模型文件存盘为lizil.mdlopenlizil.mdl;sim('lizil.mdl');t=ScopeData.time;signal=ScopeData.signals;wave1=signal(1,1).values;wave2=signal(1,2).values;subplot(2,1,1);plot(t,wave1);subplot(2,1,2);plot(t,wave2);axis([0,20,-2,2]);MATLAB命令窗口与simulink的交互从工作空间中读入将Simulink中数据送回工作空间测试与MATLAB工作空间进行交互的Simulink模型%pro4lizi2.mclear;T=(0:0.1:20)′;%仿真时间段和步进,为列向量U=(T>5);%在时间为5秒跃变的阶跃信号sim(′lizi2.mdl′);%运行仿真lizi2.mdlfigure(1);plot(simout1.time,simout1.signals.values)xlabel(′timesec′)%阶跃响应figure(2);plot(simout2.time,simout2.signals.values)xlabel(′timesec′)%冲激响应

Simulink子系统的构造实际建模会遇到一些复杂的系统,难以在一张模型方框图中画出。这时就需要以层次结构来绘制框图。也就是首先将大系统中的一些具有独立功能的部分封装起来,形成一些子系统,然后再利用这些子系统来构成整个系统。Simulink允许构造多层子系统,即在子系统中仍然允许包含若干下层子系统。参数设置封装子系统建立子系统可以方便地构建大型的复杂系统,且这些子系统还是可以重用的。然而,上例子系统模型还存在一些缺点:子系统中的参数(如增益G),传递函数系数等,是通过MATLAB工作空间传入的,这就破坏了子系统内部的隐藏性质。为此,Simulink中给出了一种解决办法,也就是所谓的模块封装技术。对子系统封装以后,它就可以像Simulink模块库所提供的模块一样来使用,子系统模块内部的参数可以通过一个设计的对话框来输入。组建用户自定义模块库如果建立了许多自定义的子系统,并且已经封装好了,而这些已经封装的自定义模块又是会反复使用的,就像Simulink提供的模块库中那些模块一样,在这种情况下,就有必要对这些自定义的重用性较好的模块进行建库,以方便管理和反复使用,同时也可以作为新的专业库提供给其他用户使用。S函数与系统方框图

Simulink进行仿真本质上是用某种求解算法对系统状态方程求解的过程。那么,Simulink如何将系统状态方程与系统方框图模型联系起来?事实上,Simulink设计了固定格式的S函数接口,通过S函数可将系统的数学方程表达形式与方框图表达形式联系起来。通过编写和使用S函数可以构建出Simulink普通模块难以搭建系统模型,Simulink内建的标准模块库就是用S函数编写并进行编译后形成的。S函数建模和仿真

Simulink仿真的过程:仿真开始时,调用各个模块的初始化函数进行系统初始化,接着进入仿真阶段,反复调用模型中的每一个模块,即调用这些模块对应的S函数,对每个模块执行诸如计算输出、计算连续函数导数以及计算离散函数的更新值等任务。在仿真结束时,调用终止仿真函数以结束仿真任务。具体某时刻Simulink执行什么任务,取决于当时调用S函数时传入的标志flag的值。MATLAB语言的S函数模板MATLAB语言的S函数编写方法是固定的,MATLAB提供了标准S函数的模板sfuntmpl.m,文件在\Toolbox\simulink\blocks\目录下。function[sys,x0,str,ts]=sfuntmpl(t,x,u,flag)switchflag,case0,%初始化部分[sys,x0,str,ts]=mdlInitializeSizes;case1,%计算导数sys=mdlDerivatives(t,x,u);case2,%差分方程递推更新sys=mdlUpdate(t,x,u);case3,%计算输出sys=mdlOutputs(t,x,u);case4,%取得下一步仿真的时间sys=mdlGetTimeOfNextVarHit(t,x,u);例:S函数仿真实现连续滤波器。要仿真的滤波器的传递函数为一个单输入、单输出的三阶线性时不变系统,将其状态变量设为x1,x2,x3,输入为u(t),输出为y(t),根据系统信号流图有状态空间方程:以及输出方程:

y=4x2矩阵表示为:简写为通式:Function[sys,x0,str,ts]=myHsapp(t,x,u,flag)%连续系统状态方程%x′=Ax+Bu,y=Cx+Du%定义A,B,C,D矩阵A=[010;001;-4-6-3];B=[0;0;1];C=[040];D=0;switchflag,case0%flag=0初始化[sys,x0,str,ts]=mdlInitializeSizes(A,B,C,D);%注意要将ABCD送入初始化case1%flag=1计算连续系统状态方程(导数)sys=mdlDerivatives(t,x,u,A,B,C,D);case3%flag=3计算输出sys=mdlOutputs(t,x,u,A,B,C,D);case{2,4,9}%其它作不处理的flagsys=[];otherwise%异常处理

error([‘Unhandledflag=‘,num2str(flag)]);end%主函数结束%---------------------------------------Function[sys,x0,str,ts]=mdlInitializeSizes(A,B,C,D)%模型初始化函数sizes=simsizes;%取系统默认设置sizes.NumContStates=3;%连续系统的状数为3sizes.NumDiscStates=0;%离散系统的状态数sizes.NumOutputs=1;%输入信号数目是1sizes.NumInputs=1;%输出信号数目是1sizes.DirFeedthrough=0;%该系统不是直通的sizes.NumSampleTimes=1;%采样周期个数sys=simsizes(sizes);%设置系统参数str=[];%系统阶字串通常为空矩阵x0=[0;0;0];%初始状态矩阵x(零状态)ts=[00];%连续取样时间%初始化函数结束%-----------------------------------------functionsys=mdlDerivatives(t,x,u,A,B,C,D)%系统状态方程函数sys=A*x+B*u;%系统状态函数结束%------------------------------------------%系统输出函数functionsys=mdlOutputs(t,x,u,A,B,C,D)sys=C*x;

例:设计一个理想放大器,其增益可由用户设定,并将设计好的S函数模块封装分析:

对理想放大器,其输入输出是直通的,且是一个无记忆系统,因此状态数为0,状态矩阵x=[]是空矩阵,而输出方程为:y(t)=G×u(t),其中G为增益参数。Function[sys,x0,str,ts]=Ampvar(t,x,u,flag,G)%G是辅助参数,增益%实现输入输出关系:y=G*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论