资源描述
*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第4章 时域离散相似法仿真Matlab编程,4.1 连续模型的离散化,线性连续状态空间模型为,(4.1-1),其采用零阶保持器的离散相似模型为,(4.1-2),其中,(4.1-3),1,第4章 时域离散相似法仿真Matlab编程4.1 连续模型的,用于离散相似的Matlab函数,连续模型转换为离散模型:G,H=c2d(A,B,T)T为采样周期,可选参数离散相似:,G,H,C,D=c2dm(A,B,C,D,T,选项),numd,dend=c2dm(num,den,T,选项),2,用于离散相似的Matlab函数连续模型转换为离散模型:G,【例4.1.1】对下面的连续系统,在采样周期T=0.1时进行离散化,A=0,1;-2,-3;,B=0;1;,G,H=c2d(A,B,0.1);,G=,0.9909 0.0861,-0.1722 0.7326,H=,0.0045,0.0861,经计算,可得,当T=0.1时,计算结果与c2d函数得到的结果一致。,3,【例4.1.1】对下面的连续系统,在采样周期T=0.1时进行,4.2 针对离散状态空间模型的仿真程序,离散状态空间模型为,对此模型编写仿真程序,只需要按模型方程迭代即可。,function t,y=,w_DiscreteSimu,(tstart,tstop,h,x0,u0,G,H,C,D),%函数功能:对线性离散系统x(k+1)=G*X(k)+H*u(k),y(k)=C*x(k)+D*u(k)进行仿真,%输入参数:tstart,tstop,h 分别是起始时间、结束时间和仿真步,%长,是标量,%x0,u0是状态、输入的初值,都是列向量,%G,H,C,D是线性离散状态空间模型的系数矩阵,%输出参数:t是仿真结果的时间序列,%y是仿真结果系统的输出序列,4,4.2 针对离散状态空间模型的仿真程序离散状态空间模型为对此,function t,y=,w_DiscreteSimu,(tstart,tstop,h,x0,u0,G,H,C,D),t=tstart:h:tstop;%t数一个行序列,cntt=size(t,2);%返回列数,cnty=size(C,1);%返回y的维数,y=zeros(cnty,cntt);%构造一个空矩阵,用来存储结果,y0=C*x0+D*u0;,y(:,1)=y0 ;%将y0作为输出的第1列,curx=x0;%当前一步的x,curu=u0;%当前一步的u,cury=y0;%当前一步的y,for i=1:1:cntt-1,curx=G*curx+H*curu;%计算下一步的状态,cury=C*curx+D*curu;%计算输出,y(:,i+1)=cury;%将输出加入到输出序列里,end,离散状态空间模型仿真程序,5,function t,y=w_DiscreteSimu(,【例4.2.1】对下面的连续系统,采用数值积分法和离散相似法仿真。,解:该系统连续状态空间模型矩阵为,其离散状态空间模型矩阵为,也可以采用c2d函数直接计算离散模型矩阵,6,【例4.2.1】对下面的连续系统,采用数值积分法和离散相似法,仿真程序:用c2d进行模型变换,将数值积分与离散相似2种方法的结果对比。数值积分仿真的结果用plot函数绘图,表现连续的效果;离散模型仿真结果用stairs绘图,各数据点之间是零阶保持。,function simu4_2,tstart=0;tstop=6;A=0,1;-2,-3;B=0;1;C=2,0;D=0;,x0=0;0;u0=1;,h=0.5;G,H=c2d(A,B,h);%得到离散模型矩阵,%数值积分仿真,t,y1=w_LinearSimu(tstart,tstop,h,x0,u0,A,B,C,D,RK4);,%离散相似法仿真,t,y2=w_DiscreteSimu(tstart,tstop,h,x0,u0,G,H,C,D);,plot(t,y1,-r*);,hold on;stairs(t,y2,:b+,);hold off;axis(0,6,0,1.2);,xlabel(x);ylabel(y);legend(数值积分,离散相似);,title(数值积分与离散相似仿真对比),7,仿真程序:用c2d进行模型变换,将数值积分与离散相似2种方法,在步长h=0.5时,两种方法的仿真结果及其接近。离散模型的每个计算点都在连续模型上,当步长h=1时,两种方法的结果出现偏差。离散模型的点不一定在连续模型上。,8,在步长h=0.5时,两种方法的仿真结果及其接近。离散模型的每,4.3 面向环节离散化仿真(无非线性环节),【例4.3.1】将下面的系统按环节离散化仿真,解:将系统分为2个典型环节,如图所示,开环部分传函为,1】环节之间的连接方程,9,4.3 面向环节离散化仿真(无非线性环节)【例4.3.1】将,2】环节内部离散模型,(1)积分环节,(2)惯性环节,环节内部动态方程,环节输出方程,10,2】环节内部离散模型(1)积分环节(2)惯性环节环节内部动态,3】系统输出方程,面向环节离散化仿真时应该注意的问题,应该依次计算各环节的输出,即计算出第1个环节,再利用第1个环节的输出计算第2个环节,依次下去。而不要一次计算出各环节的输入,再算出各环节的输出,这样相当于在每个环节之间存在一个步长的延迟环节,模型的准确性会大大降低。,下面,我们将对这两种方式做仿真对比,进而说明此问题。,11,3】系统输出方程面向环节离散化仿真时应该注意的问题11,function t,p=,w_DisNodesSimu2,(tstart,tstop,h,x0,y0,r0,W,W0,G,H,C,D,Q),%函数功能:面向环节离散化仿真,,%环节输入方程:u(k)=W*x(k)+W0*r(k),%环节迭代方程:x(k+1)=G*x(k)+H*u(k),%环节输出方程 y(k)=C*x(k)+D*u(k);,%整个系统的输出方程 p(k)=Q*y(k);,%输入参数:tstart,tstop,h 分别是起始时间、结束时间和仿真步长,%x0,y0是每个环节状态和输出的初值,,%r0为系统外部输入,%输出参数:t是仿真结果的时间序列,%p是仿真结果系统的输出序列,1、整体刷新计算的按环节仿真函数,整体刷新即根据环节连接方程计算每个环节的输入,再用计算出来的输入向量根据各环节的离散模型计算各环节的输出。各环节之间相当于并行运算。,12,function t,p=w_DisNodesSimu2,function t,p=,w_DisNodesSimu2,(tstart,tstop,h,x0,y0,r0,W,W0,G,H,C,D,Q),t=tstart:h:tstop;%t数一个行序列,cntt=size(t,2);%返回列数,cnty=size(Q,1);%返回y的维数,p=zeros(cnty,cntt);%构造一个空矩阵,用来存储结果,p(:,1)=Q*y0;%,for i=1:1:cntt-1,u=W*y0+W0*r0;,x0=G*x0+H*u;,y0=C*x0+D*u;,p(:,i+1)=Q*y0 ;%将y0作为输出的第1列,end,13,function t,p=w_DisNodesSimu2,2、逐个环节刷新的仿真程序,该函数所有参数与w_DisNodesSimu2的一样。,逐个环节刷新是逐个根据环节的编号顺序,计算环节的输入,再计算输出,再计算下一个环节的输入和输出,依次进行,相当于环节之间串连运算。,function t,p=w_DisNodesSimu(tstart,tstop,h,x0,y0,r0,W,W0,G,H,C,D,Q),t=tstart:h:tstop;%t数一个行序列,cntnodes=size(W,1);%得到环节的个数,cntt=size(t,2);%返回列数,cnty=size(Q,1);%返回y的维数,p=zeros(cnty,cntt);%构造一个空矩阵,用来存储结果,p(:,1)=Q*y0;%,for i=1:1:cntt-1,for j=1:1:cntnodes,u(j)=W(j,:)*y0+W0(j,:)*r0;,x0(j)=G(j,j)*x0(j)+H(j,j)*u(j);,y0(j)=C(j,j)*x0(j)+D(j,j)*u(j);,end;,p(:,i+1)=Q*y0 ;%将y0作为输出的第1列,end,14,2、逐个环节刷新的仿真程序function t,p=w_,function simu4_3,tstart=0;tstop=10;A=0,1;-2,-3;B=0;1;C=2,0;D=0;x0=0;0;u0=1;h=0.5;,G,H=c2d(A,B,h);%得到离散模型矩阵,t,y1=w_LinearSimu(tstart,tstop,h,x0,u0,A,B,C,D,RK4);,t,y2=w_DiscreteSimu(tstart,tstop,h,x0,u0,G,H,C,D);%离散相似法仿真,%面向环节离散化仿真,W=0,-1;1,0;W0=1,0;Q=0,1;C=diag(1,1);D=zeros(2);,G=diag(1,exp(-3*h);H=diag(2*h,(1-exp(-3*h)/3);y0=x0;,t,y3=w_DisNodesSimu2(tstart,tstop,h,x0,y0,u0,W,W0,G,H,C,D,Q);,plot(t,y1,-r);,hold on;stairs(t,y2,:k+);stairs(t,y3,-b*);hold off;,axis(0,10,0,1.2);xlabel(x);ylabel(y);,legend(数值积分,整体离散,按环节离散);,title(各环节整体刷新(h=0.5));,仿真调用函数,数值积分的结果用plot绘图,离散模型仿真结果用stairs绘图。,15,function simu4_3仿真调用函数数值积分的结果用,整体刷新时相当于前后环节之间存在一个步长的延迟,导致模型不精确。,环节逐个刷新符合系统实际运算意义,模型比较精确,16,整体刷新时相当于前后环节之间存在一个步长的延迟,导致模型不精,4.4 面向环节离散化仿真(有非线性环节),环节划分原则,1】线性环节都处理为1阶;,2】非线性环节附加在线性环节的前面或后面,环节个数等于线性环节的个数。,一个环节的计算顺序,1】根据环节之间的连接方程计算该环节的输入;,2】根据前置非线性环节计算非线性环节的输出;,3】前置非线性环节的输出作为线性环节的输入,计算线性环节的输出;,4】线性环节的输出作为后置非线性环节的输入,计算整个环节的输出。,17,4.4 面向环节离散化仿真(有非线性环节)环节划分原则一个环,模型描述,1】环节之间连接方程,写出各环节的输入与其他环节的输出和系统输入之间的连续方程。,2】线性环节离散模型,3】其中,18,模型描述1】环节之间连接方程,写出各环节的输入与其他环节的输,4】非线性环节模型描述,根据非线性环节类型不同,分别用不同的参数描述,包括非线性环节类型和必要的参数。,非线性环节作为线性环节的前置或后置环节。,5】整个系统的输出方程,仿真计算顺序,根据环节编号顺序,计算一个环节,再计算下一个环节。不能整体计算每个环节的输入,再计算每个环节的输出,这样每个环节之间将产生滞后。,19,4】非线性环节模型描述5】整个系统的输出方程 仿真计算顺序1,【例4.4.1】面向环节的非线性系统仿真,右图所示系统有一个饱和非线性环节和一个线性环节。,饱和非线性不能用微分方程表示,因而不能对整个系统采用数值积分法仿真。,采用按环节离散化仿真,首先将线性环节分解为两个基本环节,将非线性环节作为第1个线性环节的前置环节。,仿真中,取c=20,K1,r=25,20,【例4.4.1】面向环节的非线性系统仿真右图所示系统有一个,1】各线性环节内部离散方程,(1)积分环节,(3)惯性环节,用矩阵表示为,21,1】各线性环节内部离散方程(1)积分环节(3)惯性环节用矩阵,2】各环节之间连接方程,3】系统输出为,4】饱和非线性环节作为第1个环节的前置环节,22,2】各环节之间连接方程3】系统输出为4】饱和非线性环节作为第,function t,p=,w_DisNodesSimuNonL,(tstart,tstop,h,x0,y0,r0,W,W0,G,H,C,D,Q,NLBefore,NLBeforeParams,NLAfter,NLAfterParams),%函数功能:带有非线性环节的面向环节离散化仿真,,%环节输入方程:u(k)=W*x(k)+W0*r(k),%环节迭代方程:x(k+1)=G*x(k)+H*u(k),%环节输出方程 y(k)=C*x(k)+D*u(k);,%整个系统的输出方程 p(k)=Q*y(k);,%输入参数:tstart,tstop,h 分别是起始时间、结束时间和仿真步长,是标量,%x0,y0是每个环节状态和输出的初值,,%r0为系统外部输入,%NLBefore是前置非线性环节的名称,如果没有就写None,NLBeforeParams是前置非线性环节的参数,每个环节,%的参数占一行。,%NLAfter是后置非线性环节的名称,如果没有就写None,NLAfterParams是后置非线性环节的参数,每个环节,%的参数占一行。,%输出参数:t是仿真结果的时间序列,%p是仿真结果系统的输出序列,1、带非线性环节的按环节离散化仿真程序原型,23,function t,p=w_DisNodesSimuN,function t,p=,w_DisNodesSimuNonL,(tstart,tstop,h,x0,y0,r0,W,W0,G,H,C,D,Q,NLBefore,NLBeforeParams,NLAfter,NLAfterParams),t=tstart:h:tstop;%t数一个行序列,cntnodes=size(W,1);%得到环节的个数,cntt=size(t,2);%返回列数,cnty=size(Q,1);%返回y的维数,p=zeros(cnty,cntt);%构造一个空矩阵,用来存储结果,p(:,1)=Q*y0;,for i=1:1:cntt-1,for j=1:1:cntnodes,u(j)=W(j,:)*y0+W0(j,:)*r0;%根据环节之间的连接计算,,u(j)=NonlinearNode(NLBefore(j),u(j),NLBeforeParams(j,:);%计算第j个环节的前置非线性环节的输出,x0(j)=G(j,j)*x0(j)+H(j,j)*u(j);,y0(j)=C(j,j)*x0(j)+D(j,j)*u(j);%根据线性部分计算线性部分的输出,y0(j)=NonlinearNode(NLAfter(j),y0(j),NLAfterParams(j,:);%计算第j个环节的后置非线性环节的输出,end;,p(:,i+1)=Q*y0 ;%将y0作为输出的第1列,end,24,function t,p=w_DisNodesSimuN,2、典型非线性环节函数,function u_out=,NonlinearNode,(NodeType,u_in,params),%函数功能:典型非线性环节的计算,%输入参数:NodeType 节点类型,可以取Saturation,Deadzone,Relay,RelayDeadzone,%None表示没有非线性环节,%u_in,环节的输入;,%params,环节的参数行向量,%输出结果:u_out,环节的输出,25,2、典型非线性环节函数function u_out=Nonl,switch NodeType,case Saturation,c=params(1);,k=params(2);,if(k*u_in)c,u_out=c;,else,u_out=k*u_in;,end;,case Deadzone,c=params(1);,k=params(2);,if(u_inc),u_out=k*u_in;,else,u_out=0;,end;,case Relay,c=params(1);,if u_in0,u_out=c;,else,u_out=0;,end;,case RelayDeadzone,c=params(1);,h=params(2);,if u_inc,u_out=c;,else,u_out=0;,end;,otherwise,u_out=u_in;,end;,函数NonlinearNode的主体,26,switch NodeType case Relay 函,function,simu_NonNodes,tstart=0;tstop=20;h=0.5;K=1;c=10;,W=0,-1;1,0;W0=1,0;Q=0,1;,C=diag(1,1);D=zeros(2);,G=diag(1,exp(-h);H=diag(K*h,1-exp(-h);,x0=0;0;u0=25;y0=x0;,NLBefore=Saturation,None;,NLBeforeParams=c,1;0,0;,NLAfter=None,None;,NLAfterParams=0,0;0,0;,t,y=w_DisNodesSimuNonL(tstart,tstop,h,x0,y0,u0,W,W0,G,H,C,D,Q,NLBefore,NLBeforeParams,NLAfter,NLAfterParams);,stairs(t,y,-r*);,xlabel(Time);ylabel(y);,title(含非线性环节的面向环节仿真);,3、仿真调用函数,27,function simu_NonNodes3、仿真调用函,仿真结果:同样的结果,用plot与stairs绘图的对比。,仿真中,取c=20,K1,r=25,28,仿真结果:同样的结果,用plot与stairs绘图的对比。仿,4.5 利用Simulink进行面向环节仿真,【例4.5.1】下图所示线性与非线性混合系统,当回环非线性特性c=1时,系统有自持振荡,振幅约为10.89.4,振荡周期约为6s.,对该系统采用Simulink建模,进行仿真,29,4.5 利用Simulink进行面向环节仿真【例4.5.1】,Simulink将此系统看做有6个连续环节。将仿真输出用Scope绘图,同时将结果数据输出到Workspace里,以便用plot绘图。,从曲线,可以很明显地看到输出震荡。,30,Simulink将此系统看做有6个连续环节。将仿真输出用Sc,【例4.5.2】用Simulik对下图所示的系统进行仿真,仿真中,取c=10,K1,r=25,并且在t=1时才开始阶跃输入。,31,【例4.5.2】用Simulik对下图所示的系统进行仿真仿真,仿真结果曲线:很明显,饱和环节的输出受限制。,32,仿真结果曲线:很明显,饱和环节的输出受限制。32,【例4.5.3】对【例4.3.1】所示的系统采用Simulink仿真,(1)积分环节,(2)惯性环节,当T=0.5时,33,【例4.5.3】对【例4.3.1】所示的系统采用Simul,本例采用离散化环节进行建模,34,本例采用离散化环节进行建模34,
展开阅读全文