




已阅读5页,还剩158页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2020/6/7,1,第5周MATLAB电路仿真,5.1MATLAB5.2MATLAB编程电路仿真5.3Simulink电路仿真,2020/6/7,2,2.2MATLAB编程仿真,2.2.1时间连续信号与系统的计算机仿真问题时间连续的确定信号在物理上是一个随时间变化的(电压或电流)波形,在数学上表示为一个时间连续的函数f(t)。时间连续信号也称为模拟信号。而时间离散的确定信号在数学上可以表示为一个确定的序列fn。如果以满足取样定理的取样速率对时间连续函数f(t)进行取样,就可以得到对应的时间离散序列fn,而将时间离散序列fn通过取样定理所规定的理想低通滤波器后,就能够恢复连续信号f(t)。,2020/6/7,3,换句话说,在满足取样定理的前提下,f(t)与fn是一一对应的关系。对时间离散序列fn进行幅度值上的离散化(这个过程称为量化)就得到了数字信号。数字信号通常以二进制编码的形式存储在计算机中。因此,利用计算机所表达的时间连续信号f(t)实质上是其所对应的数字信号。本质上,计算机不能直接处理模拟信号,计算机中的信号处理均是对数字信号的处理。而由取样定理保证了它与模拟信号处理之间的一一对应关系。,2020/6/7,4,连续系统可以用微分方程来描述,离散系统可以用差分方程来描述。当系统为无记忆系统时,微分方程或差分方程退化为代数方程。因此,对系统进行仿真的过程就数学意义而言,就是求解这些微分方程、差分方程或代数方程的过程。为了对连续系统进行仿真,首先需要建立其数学模型,然后利用计算机求解这些数学模型,从而得出数学模型的数值解。计算机对数学模型的求解过程就是对系统的仿真过程。由于连续系统是通过微分方程来建模的,因此对此的计算机仿真本质上就是微分方程的数值求解问题。通常,对连续系统进行计算机仿真的过程是:,2020/6/7,5,(1)建立数学模型:就是将物理模型转换为数学模型的过程。对于电子电路而言,就是利用电路的拓扑、元件的属性,列出网孔方程或节点方程,并简化为标准形式的计算机可求解的一阶微分方程组(即状态方程)的过程。对于线性时不变系统来说,就是建立其传递函数模型,并简化为计算机易于求解的线性一阶微分方程组(即状态方程)的过程。而对于一般的系统,通常可建模为一组非线性的微分方程组。(2)选择适合的计算机求解方法求解仿真模型。不同的微分方程求解算法的精度和适用范围均有所不同。(3)编写MATLAB仿真程序或建立Simulink模块方框图,调试并运行程序。(4)得出数值解,即仿真结果,对仿真结果进行分析,以确定结果的可靠性和有效性。,2020/6/7,6,图2-2一个二阶电路系统,2020/6/7,7,对于一个二阶系统,电路如图2-2所示,试利用MATLAB编程仿真求解:(1)零状态响应:系统在t=-1秒时刻的初状态为零,输入信号为阶跃信号f(t)=u(t),输出为电容电压,试对时间t=-1,10秒的输出信号波形进行仿真求解。(2)零输入响应:系统在t=-1秒时刻电容电压为uC=1V,当t=-1秒时刻信号输入二端闭合,试对时间t=-1,10秒的输出信号波形进行仿真求解。(3)全响应:系统在t=-1秒时刻电容电压为uC=1V,输入信号为阶跃信号f(t)=u(t),试对时间t=-1,10秒的输出信号波形进行仿真求解。,2020/6/7,8,解(1)设电感电流为iL(t),电容电压为uC(t),根据电路,列出KVL方程:(2-2)改写为标准形式:,2020/6/7,9,令电路的状态变量iL(t)=x1(t),uC(t)=x2(t),输入信号为f(t),则微分方程简写为写出该微分方程的MATLAB函数。注意,这一组微分方程组就是该二阶电路的状态方程,对于同一个物理系统,如果选取的状态变量不同,所得到的状态方程也就不同,但都表达了该物理系统的状态信息。,(2-3),2020/6/7,10,按照MATLAB的固定写法,编写出该微分方程组的MATLAB函数(函数文件名为funcforex123.m)如下:程序2-3functionxdot=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);%方程1xdot(2)=1/C*x(1);%方程2functionin=f(t)%输入信号in=(t0)*1;%阶跃信号,2020/6/7,11,然后,利用MATLAB提供的求解微分方程的指令对该微分方程组求解。MATLAB提供的求解微分方程的算法有多个,如“ode45”、“ode23”、“ode15s”等,不同的算法适用的场合稍有不同。例如,通过“ode45”函数求解,MATLAB程序(程序名为ex123.m)如下:程序2-4%filenameex123.mL=1;%电感值C=0.1;%电容值forR=1.535%仿真电阻值分别为1.5,3,5欧姆的情况t,x=ode45(funcforex123,-1,10,0;0,R,L,C);,2020/6/7,12,%也可采用ode23,ode15s等求解figure(1);plot(t,x(:,1);holdon;xlabel(timesec);text(0.9,0.17,leftarrowi-L(t);grid;figure(2);plot(t,x(:,2);holdon;xlabel(timesec);text(0.5,0.3,leftarrowu-C(t);grid;end运行程序后,得到的电感电流、电容电压波形仿真结果如图2-3(a)、(b)所示。,2020/6/7,13,图2-3电感电流、电容电压零状态响应波形仿真结果(a)电感电流单位阶跃响应(零状态响应)波形仿真结果;(b)电容电压单位阶跃响应(零状态响应)波形仿真结果,2020/6/7,14,(2)当t=-1秒时刻信号输入二端闭合,相当于输入信号为零,因此修改MATLAB函数funcforex123.m如下:程序2-5functionxdot=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);%方程1xdot(2)=1/C*x(1);%方程2functionin=f(t)%输入信号in=0;%信号始终为零,2020/6/7,15,并修改ex123.m的“ode45”语句,将系统状态改为0,1,程序如下:程序2-6%filenameex123.mL=1;%电感值C=0.1;%电容值forR=1.535%仿真电阻值分别为1.5,3,5欧姆的情况t,x=ode45(funcforex123,-1,10,0;1,R,L,C);%也可采用ode23,ode15s等求解figure(1);plot(t,x(:,1);holdon;xlabel(timesec);,2020/6/7,16,text(0.9,0.07,leftarrowi-L(t);grid;figure(2);plot(t,x(:,2);holdon;xlabel(timesec);text(0.5,0.3,leftarrowu-C(t);grid;end然后运行,得到的波形仿真结果如图2-4所示。,2020/6/7,17,图2-4电感电流、电容电压零输入响应波形仿真结果(a)电感电流零输入响应波形仿真结果;(b)电容电压零输入响应波形仿真结果,2020/6/7,18,(3)对于全响应情况,可相应修改MATLAB函数funcforex123.m如下:程序2-7functionxdot=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);%方程1xdot(2)=1/C*x(1);%方程2functionin=f(t)%输入信号in=(t0)*1;%信号阶跃而ex123.m的“ode45”语句中仍然将系统状态改为0,1。运行后得到的波形仿真结果如图2-5所示。,2020/6/7,19,图2-5电感电流、电容电压全响应波形仿真结果(a)电感电流全响应波形仿真结果;(b)电容电压全响应波形仿真结果,2020/6/7,20,由此可见,一旦从物理系统中建立了其数学模型,也即得出系统的微分方程描述之后,给定其边界条件,就可得出其数值解,求解的过程就是仿真的过程。在MATLAB中,我们可以方便地修改微分方程函数以及求解指令的参数,从而得出系统的零输入响应、零状态响应以及全响应等各种状态下的输出信号。可以将这个例子中的输入信号修改为一个宽度为0.3s的矩形脉冲,然后观察其响应波形。(提示:只需修改funcforex123.m中语句“in=(t0)*1;”为“in=(t0)*1-(t0.3)*1;”即可。)本例演示了对于一个动态电路瞬态响应的仿真过程。仿真的关键在于建立正确的数学模型。,2020/6/7,21,对于任何电子电路,都可以根据电路理论的知识得出其数学模型,即一阶微分方程组,也称为状态方程。接下来以MATLAB所规定的格式编写状态方程的描述函数,然后选择合适的求解方式求解,也就完成了对电路的仿真。最后,对所得出的仿真波形进行分析。需要强调的是,微分方程的MATLAB函数格式是固定的,必须按MATLAB所规定的格式来编写。本例中,需要将方程参数“R;L;C”传入。传入参数前的标志变量“flag”是必需的,以符合求解函数“ode45”的要求。微分方程的MATLAB函数引导语句的格式为functionxdot=方程函数名(t,x,flag,附加参数),2020/6/7,22,其中,“t”为时间变量矩阵,“x”为方程的状态变量矩阵,“xdot”为状态变量对时间的一阶导数矩阵。在MATLAB中,对微分方程的求解有多种算法可供利用。通常有“ode23”、“ode45”以及“ode15s”等等,这些函数的调用方式完全相同,但针对的方程类型有所不同。其中,“ode23”和“ode45”分别采用二阶三级RKF算法和四阶五级RKF算法,适用于一般微分方程的求解;“ode15s”则适用于刚性微分方程的求解。所谓刚性方程,指的是方程的某些解(这些解是时间“t”的函数)变化缓慢,而另外一些解变化快速,两者形成明显对比的这样一类方程。“ode15s”同时也适合于一般微分方程的求解。关于其它解法和使用方法详见MTALAB的在线手册。,2020/6/7,23,以“ode45”为例,其用法是:t,x=ode45(方程函数名,仿真时间范围,状态变量初始值,算法选项,附加参数)例如,以默认算法选项计算微分方程组funcforex123.m,仿真时间从-1s到10s,状态变量初始值为:电感电流x1(0)=0A,电容电压x2(0)=1V,附加参数为R=1.5,L=1H,C=0.1F,则解法写为t,x=ode45(funcforex123,-1,10,0;1,1.5,1,0.1);funcforex123(t,x,flag,R,L,C),2020/6/7,24,另外需要注意的是,为了达到算法快速有效,MATLAB中的状态方程的求解函数是自适应步长的,即其数值结果中时间自变量t的离散取值是非均匀的,在解变化剧烈的地方取值点密,而在解变化缓慢的曲线段相对取值会稀疏一些。在信号处理中,进一步对求解信号进行分析时,往往又需要在时间上均匀取样间隔点上的波形函数值。可以采用一维插值的办法来解决。下面介绍求解系统的冲激响应的方法。由于输入冲激信号是超越函数,不适于作数值计算,因此首先求系统的阶跃响应,然后对其进行微分得到冲激响应。为了应用差分函数“diff”进行近似微分,首先需要通过插值将被微分的数据在时间上均匀化,然后再利用差分函数“diff”进行近似微分,从而得出系统的冲激响应波形。,2020/6/7,25,例如,对于电路如图2-2所示的一个二阶系统,输出信号从电容电压取出。现在通过仿真计算求系统的冲激响应,并与理论值相对比,分析仿真结果的正确性和仿真精度。为了分析仿真结果的正确性和仿真精度,我们首先计算电路中电容电压的冲激响应的解析值。将状态方程写为二阶微分方程形式,有,(2-4),2020/6/7,26,进行拉氏变换,得出传递函数为将R=3,L=1H,C=0.1F代入,并将H(s)化简为利用拉氏变换对,(2-5),(2-6),(2-7),2020/6/7,27,得出冲激响应为(2-8)利用下面的程序求出上例电路中电容电压的均匀取样点的输出波形值(阶跃响应),然后对该波形进行微分得出冲激响应,并与理论值进行比较。程序运行结果如图2-6所示。,2020/6/7,28,图2-6冲激响应的仿真结果与理论结果的比较,2020/6/7,29,(1)状态方程函数程序funcforex123.m如下:程序2-8functionxdot=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);%方程1xdot(2)=1/C*x(1);%方程2functionin=f(t)%输入信号是in=(t0)*1;%阶跃信号,2020/6/7,30,(2)主程序ex123b.m如下:程序2-9%filenameex123b.mt,x=ode45(funcforex123,-1,10,0;0,3,1,0.1);%求解上例电路的阶跃响应ts=0.001;t1=-1:ts:10;%均匀取样点间隔0.001sx1=interp1(t,x(:,2),t1,spline);%插值得出均匀时间样点的电容电压波形值;,2020/6/7,31,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).*(t10);%冲激响应的理论值plot(t1(1:50:length(t1),ht(1:50:length(t1),ko);legend(Stepresponse,Impluseresponse,Theoreticimpluseresponse);,2020/6/7,32,从图2-6中可以得出,在插值精度达到足够高的条件下,采用仿真数值计算方法所得出的系统冲激响应与采用理论解析公式计算的曲线是吻合的,这也从一个侧面说明了仿真数值计算的正确性。通过以上仿真的实例,我们可总结出连续系统建模的一般规律。一般地,设线性时不变系统中有n个独立的储能元件(电容或电感),则系统中存在n个独立的状态,记为x1(t),x2(t),xn(t)(2-9),2020/6/7,33,又设该系统有m个输入信号,记为f1(t),f2(t),fm(t)(2-10)系统有r个输出,记为y1(t),y2(t),yr(t)(2-11)由于所有输入输出信号、系统状态都是时间t的函数,简写时可以省略(t),于是状态方程和输出方程可表示为矩阵形式:,(2-12),2020/6/7,34,对于更一般的(非线性)时不变系统,状态方程和输出方程可表示为一般函数式:对于线性时不变系统,状态方程为n元一阶线性微分方程组,输出方程是r元线性方程组,其中,(2-13),(2-14),2020/6/7,35,(2-15),(2-16),2020/6/7,36,(2-17),(2-18),(2-19),2020/6/7,37,对连续系统的计算机仿真,实质上就是利用求解常微分方程的数值算法求解的过程。那么,计算机是如何求解这样一个一阶常微分方程组的呢?不失一般性,设常微分方程组用矩阵形式表示为式中,(2-20),(2-21),(2-22),(2-23),2020/6/7,38,式,atb的解x是时间t的连续函数,数值解法就是求解x在若干离散时间点a=t0t10)*1;%阶跃信号,2020/6/7,45,对欧拉算法与“ode45”算法精度进行比较的主程序如下:(其中,欧拉算法采用步长分别为0.01,0.1,0.2。“ode45”算法以默认参数进行)%filenamesybeulerTEST.mtic;%记时开始t,x=ode45(mystateEQforODE45,0,10,0;0,310.1);toc%记时结束,测定ode45计算耗时plot(t,x,r.);holdon;forh=0.2,0.1,0.01,2020/6/7,46,tic;t,x=sybeuler(mystateEQ,0,h,10,0;0,310.1);toc%记时结束,测定sybeuler计算耗时plot(t,x,k);endlegend(u-C(t)ode45,i-L(t)ode45,sybeuler);程序运行结果如图2-7所示。,2020/6/7,47,图2-7欧拉算法与“ode45”算法的比较(欧拉算法精度随着计算步长减小而提高),2020/6/7,48,计算耗时:“ode45”算法自适应步长0.1s欧拉算法步长0.2DW0.02s欧拉算法步长0.1DW0.04s欧拉算法步长0.01DW0.32s可见,欧拉算法的计算精度是比较低的,当欧拉算法步长达到0.01时,其计算曲线才基本与“ode45”算法的曲线吻合。同时我们也看到,数值求解算法以及算法参数的选择在系统仿真中对仿真结果的影响是相当大的。,2020/6/7,49,MATLAB中的“ode45”算法是四阶龙格-库塔算法的改进算法,称为四阶五级的龙格-库塔算法。与传统的四阶龙格-库塔算法相比较,它具有更高的计算精度和稳定性。对于线性时不变连续时间系统,其数学模型为线性微分方程组(也即状态方程),这种方程组在数学上已经有了解析算法,可以得出解析解。然而,对于一般的连续时间信号与系统,其数学模型为一般微分方程组,通常可能是非线性的,对于非线性微分方程组的解析求解,目前数学上并无统一的方法,这时大量的要求求解非线性微分方程组的工程问题最为方便的办法就是数值求解了。可以说,MATLAB仿真和数值计算扩展了传统线性系统的研究范围,为非线性系统的数值研究提供了一条捷径。,2020/6/7,50,总之,对连续时间信号与系统的计算机仿真问题就是建立连续系统的数学模型状态方程,然后利用适当的数值分析和求解算法计算其数值解的过程。类似地,对离散时间信号与系统的计算机仿真问题就是建立该离散时间系统的差分方程组(离散状态方程)并递推求解的过程。而对于混合系统的计算机仿真问题就成为了混合系统所对应的微分方程和差分方程联合方程组的求解问题。对于无记忆系统,以上系统的建模方程组退化为代数方程组,仿真的问题也就相应简化为对这些代数方程的数值计算问题。,2020/6/7,51,2.2.2基于数据流的仿真方法MATLAB编程对数学方程的数值计算一般是基于数据流的,这称为基于数据流的仿真方法。所谓基于数据流的仿真,就是指在数值计算的一个阶段完成之后,所得出的数据才进入下一个阶段的数值计算中。例如,如果对由两个传递函数H1(s)和H2(s)级联的系统进行MATLAB编程仿真,第一步是求解在输入信号激励下H1(s)的输出波形数据,第二步,再利用这些得出的波形数据作为系统H2(s)的激励信号,去求解系统H2(s)的输出波形数据。可见,在求解的时间段上,我们无法“实时”地观察到系统各个输出点上的信号,只有当系统各个阶段均已经计算完毕之后,才能够观察到计算时间段上系统的状态和各个输出点的变化情况。,2020/6/7,52,2.3Simulink仿真,2.3.1Simulink仿真入门1.Simulink的特点Simulink是MATLAB中的一个建立系统方框图和基于方框图级的系统仿真环境,是一个对动态系统进行建模、仿真并对仿真结果进行分析的软件包。使用Simulink可以更加方便地对系统进行可视化建模,并进行基于时间流的系统级仿真,使得仿真系统建模与工程中的方框图统一起来。并且仿真结果可以近乎“实时”地通过可视化模块,如示波器模块、频谱仪模块以及数据输入输出模块等显示出来,使得系统仿真工作大为方便。,2020/6/7,53,Simulink使得用户可以用鼠标操作将一系列可视化模块连接起来,从而建立直观的功能上更为复杂的系统模型,避免了编写MATLAB仿真程序,简化了仿真建模过程,更加适用于大型系统的建模和仿真,如对IS-95CDMA通信系统全系统的建模仿真工作。通过上节的讨论我们知道,由于MATLAB具有微分方程的求解算法,利用MATLAB编程可以对微分方程进行求解,从而得到系统的仿真结果。然而,对于更为复杂的大系统,往往是一种连续、离散系统的混合,要通过编程语句的方式来建立整个系统的状态方程模型将是一件不容易的事情,况且这样的手工编程,直观性不好,对于复杂系统的建模编程来说往往错误难以避免,因此仿真结果的可信度也就成了问题,而且手工编程的效率低下,出错(往往是算法上的错误)检查困难,编程程序的可重复利用程度不高。,2020/6/7,54,这些原因使得MATLAB向易用性和可视化方向努力,Simulink就是这种努力的结果。1990年,Simulink首次作为MATLAB的软件工具包出现,彻底改变了系统仿真界的软件工具和建模模式,很快成为了系统建模和仿真的主流软件工具,甚至将成为通用系统仿真的基准测试平台。Simulink仿真环境附带了许多专业仿真模块库,利用这些模块库可以快速建立该专业领域的系统模型并进行仿真,而不需要用户详细了解各个模块内部的实现细节,大大方便了复杂的大系统的建模,而且,由于Simulink提供的这些专业模块库均通过各专业权威专家的评测,可信度和稳定性都大为提高,从而也保证了系统建模整体的质量和仿真精度。在通信工程和电子工程领域,Simulink提供的常用专业模块库有:CDMA参考模块库、通信系统模块库、DSP(数字信号处理器)模块库等等。随着MATLAB版本升级,还将添加更多的专业模块库。,2020/6/7,55,Simulink全方位地支持动态系统的建模仿真,它支持连续系统、离散系统、连续离散混合系统、线性系统、非线性系统、时不变系统、时变系统的建模仿真,也支持具有多采样速率的多速率系统。可以说,在通用系统仿真领域,Simulink是无所不包的。结合MATLAB编程和Simulink可视化建模仿真各自的特点,可以构建更为复杂的系统模型,并进行自动化程度更高的仿真和仿真结果的数据分析,这是MATLAB的高级应用方面。,2020/6/7,56,2.使用Simulink建模和仿真的过程我们首先通过实例来简单介绍Simulink建模和仿真的全过程。启动MATLAB之后,在命令窗口中输入命令“simulink”或单击MATLAB工具栏上的Simulink图标,打开Simulink模块库窗口(使用命令“simulink3”可以打开老版本的Simulink模块库界面)。在Simulink模块库窗口中单击菜单项“File|New|Model”,就可以新建一个Simulink模型文件,如图2-8所示。,2020/6/7,57,图2-8Simulink模块库界面和新建模型文件窗口,2020/6/7,58,为了与MATLAB编程仿真进行对比,我们仍然以2.3.1小节描述的二阶系统为例。其输入输出的传递函数为(2-28)其中,R=3,L=1H,C=0.1F。H(s)简化为利用鼠标单击Simulink基础库中的Continuous子库,选取传递函数模块,将它拖动到新建模型窗口中的适当位置,如图2-9所示。,(2-29),2020/6/7,59,图2-9利用模块库建立仿真模型,2020/6/7,60,如果需要对模型模块进行参数设置和修改,只需选中模型文件中的相应模块,单击鼠标右键,弹出快捷菜单,从中选取相应参数进行修改,如图2-10所示。还可以在选中模块之后通过鼠标拖动修改模块的位置、大小和形状。单击模块下方的“TransferFun”可以对其进行编辑,例如修改为“传递函数”字样。从快捷菜单中选取“TransferFunparameters.”项修改传递函数参数,在弹出的对话框中的传递函数分子系数“Numerator:”栏填入10;在传递函数分母系数“Denominator”栏填入1,3,10,其余参数使用默认值。如果需要进了解该模块的参数设置说明,可以单击该对话框下方的“Help”按钮,然后确认,就得到了所要进行仿真的传递函数。,2020/6/7,61,图2-10修改仿真模型的参数,2020/6/7,62,通过快捷菜单的其它选项还可以修改模型的颜色、旋转、字体、阴影等属性,也可对模型进行剪切、拷贝或删除。采用同样的方法,在Simulink基础库中的Sources子库中选取激励信号源,例如我们选取阶跃信号源,将之拖入建模窗口中。在Sinks子库中选取示波器作为系统输出波形显示。接下来利用鼠标将这三个模块连接起来。模块外部的大于符号“”分别表示信号的输入输出节点,为了连接两个模块的输入输出,可以将鼠标置于节点处,这时鼠标显示为“十”字形状,拖动鼠标到另一个模块的端口,然后释放鼠标按钮,则形成了带箭头的连线,箭头方向表示信号的流向。完成后的建模系统可以通过“File”菜单存盘为模型文件,扩展名为“mdl”,如“lizi1.mdl”,如图2-11所示。,2020/6/7,63,图2-11完成的建模方框图,2020/6/7,64,接下来,需要对输入信号源(阶跃)的参数进行设置。将鼠标指向阶跃信号模块双击或通过快捷菜单打开属性设置对话框,设置阶跃信号的参数,如图2-12所示。图中右边的帮助窗口是通过单击参数设置对话框下方的“Help”按钮显示的。通过阅读帮助文档可以了解参数的含义和设置情况。对于阶跃信号源来说,其参数含义、默认值以及我们根据仿真需要修改后的参数值如表2-1所示。,2020/6/7,65,表2-1阶跃信号源的参数含义、默认值及修改后的参数值,2020/6/7,66,图2-12阶跃信号源模块的参数设置对话框及其帮助文档,2020/6/7,67,根据仿真要求,我们将仿真-210s时间区间内的系统阶跃响应的输出波形,在时间为0s时的跃变。然后设置仿真参数,主要是仿真求解器的选择和仿真步长等参数的选取。通过前面的分析可知,动态系统仿真的本质就是求解其状态方程,而对状态方程的数值求解算法有多种,求解算法的步长也可以不同。不同的算法适用的范围有所不同,而算法的步长也直接影响求解的精度。因此,对求解器的选择以及其仿真步长等参数的设定对系统仿真来说就成为相当重要的事情。从系统建模窗口的状态栏可以看到当前使用的求解器,如图2-11中显示的仿真求解器是“ode45”算法。从建模窗口菜单项“Simulation|SimulationParameters.”打开仿真参数设置对话框(快捷键为Ctrl+E),我们现在设置求解器标签下的参数部分,如图2-13所示。,2020/6/7,68,设置仿真起始时间为-2秒,仿真结束时间为10秒,其余参数为默认值:求解器采用“ode45”算法,步长设定为自适应变步长的,最大步长、最小步长以及初始步长均设为自动选取,相对求解精度为1e-3,绝对求解精度自动选取。,2020/6/7,69,图2-13仿真参数设置对话框,2020/6/7,70,最后,双击示波器模型图标,打开示波器显示窗口。在显示窗口中单击鼠标右键,通过快捷菜单设置显示坐标范围等属性,这里我们设置为自动刻度,如图2-14所示。,2020/6/7,71,图2-14示波器显示窗口以及参数设置,2020/6/7,72,所有这些工作完成之后,就可以进行仿真了。可通过建模窗口菜单项“Simulation|Start”启动仿真,也可以单击工具栏上的小三角按钮或使用快捷键Ctrl+T启动仿真。仿真结果如图2-15所示。读者可以将结果与图2-3所示的结果进行比较。,2020/6/7,73,图2-15仿真结果,2020/6/7,74,更换信号源为Sources子模块库中的SignalGenerator,并设置信号源为0.2Hz的方波,幅度为1,如图2-16左边对话框所示。设置示波器显示窗口的属性(Parameters),使之成为双踪显示,然后将示波器第二输入节点与信号源输出相连,这样我们就可以同时观察系统的输入输出波形了。系统建模如图2-16中间窗口所示。将仿真时间设定为0秒到20秒,其余参数使用默认参数。运行仿真后的结果如图2-16右边窗口显示。读者还可以进一步修改信号源参数,使用三角波、正弦波等作为激励信号,观察输出信号的情况。,2020/6/7,75,图2-16更换信号源并使用双踪示波器之后的仿真结果,2020/6/7,76,3.MATLAB命令窗口与Simulink之间的交互从以上仿真过程中我们可以感受到Simulink的方便和快捷。事实上,我们还可以通过MATLAB命令来打开Simulink模型并进行仿真。在MATLAB命令窗口中,使用“openlizi1.mdl”,然后使用“sim(lizi1.mdl)”就可以启动对模型lizi1.mdl的仿真计算,从而实现Simulink仿真的自动化。而Simulink仿真的数据结果也可以送回MATLAB工作空间中作进一步数值分析。仍以上例加以说明。首先设置示波器,使得显示波形数据能够送回MATLAB工作空间。在示波器波形显示窗口单击“参数Parameters”工具图标,打开显示参数设置对话框。选中Datahistory标签下的Savedatatoworkspace,并设传递变量名称,例如设为ScopeData,格式选择为Structurewithtime(带时间的结构型变量)。参数设置的情况如图2-17所示。,2020/6/7,77,图2-17示波器显示窗口的参数设置,2020/6/7,78,将建模存盘为lizi1.mdl,然后在MATLAB下运行如下命令(参见图2-18):clear;%工作空间初始化openlizi1.mdl;%这时将看到建模模型文件被打开sim(lizi1.mdl);%启动模型仿真,显示出仿真波形whosNameSizeBytesClassScopeData1x13578structarrayGrandtotalis307elementsusing3578bytes,2020/6/7,79,图2-18通过命令启动Simulink仿真,2020/6/7,80,可见,仿真完成之后,工作空间中出现了“ScopeData”结构变量,其中包含了示波器显示的全部波形数据。通过“plot”命令可以作出这些数据对应的波形,即t=ScopeData.time;%仿真的时间变量signal=ScopeData.signals;wave1=signal(1,1).values;wave2=signal(1,2).values;subplot(2,1,1);plot(t,wave1);axis(0,20,-2,2);subplot(2,1,2);plot(t,wave2);axis(0,20,-2,2);作出的波形如图2-19所示。读者可以对比示波器上得到的波形(参见图2-18)。我们在此说明了Simulink与MATLAB工作空间进行数据交换的一种方法。,2020/6/7,81,图2-19示波器数据传入工作空间后进行波形作图显示,2020/6/7,82,事实上,MATLAB提供了许多途径用于与Simulink的数据交互。通过Sources子模型库中的FromWorkspace模块可以从工作空间中读入仿真所需要的输入数据,而通过Sinks子模型库中的ToWorkspace模块可以将Simulink中产生的数据回送到工作空间,从而可以实现MATLAB编程与Simulink模型相结合的混合仿真,这样就大大加强了仿真的功能。下面的例子中,我们将从工作空间中读入输入波形数据,通过Simulink建模仿真之后,将仿真结果再送回工作空间中进行处理。通过这种方式,我们可以通过MATLAB程序产生任意的数据送入Simulink中加以处理,然后再利用MATLAB强大的统计分析功能来处理数据。,2020/6/7,83,首先建立Simulink模型,如图2-20所示。图中使用了Sources子模型库中的FromWorkspace模块,以便从工作空间中读入数据。使用Sinks子模型库中的ToWorkspace模块,将输出数据回送到工作空间。设计输入为阶跃信号,仿真建模中使用Continuous子库中的微分器来获得系统的阶跃响应的微分冲激响应。,2020/6/7,84,图2-20用于测试与MATLAB工作空间进行数据交互的Simulink模型,2020/6/7,85,图2-20中,FromWorkspace模块的参数设置如图2-21所示。其中,Data项使用了两个矢量T,U参数组合。T表示离散时间序列,U表示对应于离散时间序列T的波形取值。Sampletime项设置为0,表示采用仿真求解器的默认采样时间间隔。Interpolatedata选中表示允许数据插值,并且通过数据外插(Extrapolation)方式在最终数值后形成输出。,2020/6/7,86,图2-21FromWorkspace模块的参数设置,2020/6/7,87,模型中我们使用了两个ToWorkspace模块,分别接不同的输出信号,这两个ToWorkspace模块的输出变量分别为simout1和simout2。数据格式可设置为带时间的结构变量,如图2-22所示。仿真求解器采用ode45算法。但是为了获得更为精细的波形,可以设定求解的初始步长和最大步长为0.01,最小步长为auto,仿真时间段为020s。其余参数采用默认值。建模完成之后,将模型文件存盘为lizi2.mdl文件。然后编写如下的MATLAB仿真程序pro4lizi2.m,对模型进行仿真和分析。,2020/6/7,88,图2-22ToWorkspace模块的参数设置,2020/6/7,89,程序2-14%pro4lizi2.mclear;T=(0:0.1:20);%仿真时间段和步进,为列向量U=(T5);%在时间为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)%冲激响应程序运行结果如图2-23所示。,2020/6/7,90,图2-23MATLAB编程调用Simulink模型的仿真结果(阶跃响应和冲激响应),2020/6/7,91,4.Simulink子系统的构造实际建模过程中,常常会遇到一些较为复杂的系统,难以在一张模型方框图中画出来。这时候,就需要以层次结构来绘制框图。也就是首先将大系统中的一些具有独立功能的部分封装起来,形成一些子系统,然后再利用这些子系统来构成整个系统。Simulink允许构造多层子系统,即在子系统中仍然允许包含若干下层子系统。这里我们简单介绍Simulink中子系统的构造方法。举例说明如下:首先将Simulink模块库中PortsA=1;B=0.001;C=1;sim(lizi3.mdl);显然,利用命令语句可以方便地对模型参数进行修改,从而得出不同系统参数下的仿真结果。仿真运行结果如图2-25所示。如果结合循环语句来自动修改参数,并将仿真结果送回MATLAB工作空间,则我们可以让计算机在不同系统参数条件下自动仿真若干次,得出响应的结果。如果不使用命令“sim”来进行仿真,那么我们只好通过Simulink可视化界面来修改系统参数,并通过使用鼠标点击仿真运行工具来启动仿真,这样效率将是十分低下的。由此可见MATLAB编程与Simulink结合进行仿真的优势。,2020/6/7,97,图2-25lizi3.mdl的仿真结果,2020/6/7,98,5.封装子系统通过上面的例子可以看到,通过系统分层和建立子系统的思想可以相当方便地构建大型的复杂系统,而且这些子系统还是可以重用的。然而,上例中子系统模型还存在一些缺点:子系统中的参数(如增益G),传递函数系数等等,是通过MATLAB工作空间传入的,这就破坏了子系统内部的隐藏性质。为此,Simulink中给出了一种解决办法,也就是所谓的模块封装技术。对子系统封装以后,它就可以像Simulink模块库所提供的模块一样来使用,子系统模块内部的参数可以通过一个设计的对话框来输入。,2020/6/7,99,对一个用户自己建立的系统模型进行封装,首先要通过上面所讲的方法将系统模型转化为子系统,然后选中该子系统图标,选择“Edit|MaskSubsystem”菜单项(快捷键为Ctrl+M),然后设置所弹出的对话框内容。下面我们对lizi3.mdl中建立的子系统进行封装。打开lizi3.mdl,另存为lizi4.mdl,然后选中子系统模块,将其改名为Mysubsystem,选择“Edit|MaskSubsystem”菜单项,弹出Maskeditor对话框,如图2-26所示。,2020/6/7,100,图2-26封装编辑器对话框(Icon标签和Parameters标签),2020/6/7,101,在Icon标签下主要是对封装模块的图标进行设置,可以设置图标的边框是否可见,图标是否透明,是否旋转,以及绘图单位等,还可使用命令来绘制图标,该标签下部给出了绘制图标的语法举例。在Parameters标签下可以设置子系统的参数,本例中需要设置的参数就是G,A,B,C四个。参数设置可以采用编辑框(Edit)、弹出列表(Popup)或复选框(Checkbox)形式,读者可参考在线帮助。我们这里只使用编辑框。设置参数如图2-26右面对话框所示。,2020/6/7,102,图2-27所示是设置封装编辑器对话框中的“Initialization(初始化)”标签和“Documentation(文档)”标签的情况。一般情况下,初始化标签可使用默认值;文档标签的三部分将分别显示在封装模块的参数设置对话框和帮助文档中,如图2-28所示。,2020/6/7,103,图2-27封装编辑器对话框(Initialization标签和Documentation标签),2020/6/7,104,图2-28封装模块的参数设置对话框以及帮助文档,2020/6/7,105,对于已经封装的模块,采用“Edit|EditMask”(快捷键为Ctrl+M)菜单项就可以重新编辑封装对话框。在编辑封装对话框的下部有一个Unmask按钮(参见图2-26),单击该按钮可以去除封装。若需要修改子系统的内部结构,可以使用菜单项“Edit|Lookundermask”(快捷键为Ctrl+U)来打开子系统结构,从而对子系统方框图进行修改。,2020/6/7,106,6.组建用户自定义模块库如果建立了许多自定义的子系统,并且已经封装好了,而这些已经封装的自定义模块又是会反复使用的,就像Simulink提供的模块库中那些模块一样,在这种情况下,就有必要对这些自定义的重用性较好的模块进行建库,以方便管理和反复使用,同时也可以作为新的专业库提供给其他用户使用。Simulink提供了建库手段,具体方法是:用“simulink”命令打开Simulink库浏览器,从其菜单中选择“New|Library”,新建一个空白的模块库窗口,然后将欲建库的模块用鼠标拖入该库文件窗口中即可。,2020/6/7,107,可用“File|Modelproperties”菜单项来修改自建库的属性,最后存盘,例如存为myku.mdl文件。以后需要使用时,在MATLAB命令窗口中键入“myku.mdl”即可开启该模型库窗口,其中的自定义模块与Simulink提供的标准库中的模块的使用方法完全相同。自定义模块库存盘之后将处于锁定状态,如果要对库中的模块进行修改,可以再次打开该模块库,然后用“Edit|Unlocklibrary”解锁,修改并存盘之后,库自动恢复为锁定状态。图2-29给出了一个用户自定义模块库的例子。,2020/6/7,108,图2-29一个用户自定义模块库的例子,2020/6/7,109,2.3.2Simulink仿真原理上一小节我们讨论了Simulink建模的基本方法,Simulink仿真与MATLAB编程的数据交互以及Simulink子系统建模和建库的方法。通过Simulink提供的这些功能,利用Simulink基本库,我们就可以构建自己的仿真模型、自己的专业模型库,并进行仿真和数值结果分析。本小节将进一步讨论Simulink是如何工作的。我们已经知道,Simulink进行仿真本质上就是利用某种求解算法对系统状态方程进行求解的过程。那么,Simulink是如何将系统的状态方程与系统方框图模型联系起来的呢?事实上,Simulink设计了固定格式的S函数接口,通过S函数可将系统的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 心理健康辅导方案
- 压力缓解养生方案
- 妇女儿童青少年活动策划方案
- 客户投诉处理方案与流程
- 新媒体运营岗位职责及工作流程解析
- 企业品牌宣传策划方案及案例分析
- 初中物理下册力学章节测试题
- 云南省2023年中考英语试题解析
- 集体婚礼 合同7篇
- 关于赞助合同模板5篇
- 化工和危险化学品企业重大事故隐患重点排查事项清单(参考模板)
- 《公共机构建筑机电系统调适技术导则》
- 测控技术与仪器技术面试
- 三年级数学简便计算300题及答案
- 生涯发展报告
- 企业活跃度分析报告
- 管理学原理说课课件
- 关于自愿放弃缴纳社保协议书
- 梦想课程《去远方》(版)分享课程
- 2023年政府采购评审专家考试真题模拟汇编(共681题)
- 年6万吨废植物油回收利用项目立项申请报告
评论
0/150
提交评论