一, 实验目的
1. 了解离散相似法的基本原理
2. 掌握离散相似法仿真的基本过程
3. 应用离散相似法仿真非线性系统
4. MATLAB 实现离散相似法的非线性系统仿真
5. 掌握 SIMULINK 仿真方法, 应用于非线性系统的仿真, 并对实验结果进行分析比较
二, 实验原理
在 ASR 的输出增加限幅装置 (饱和非线性, 饱和界为 c=8 ). Ce=0.031, 其它参数不变. 输入为单位阶跃, 用离散相似法求系统各环节的输出.
要求: 采用零阶保持器和一阶保持器离散化系统, 分别完成本实验.
1, 各环节的参数:
由 5 个典型环节组成:
- A=[0 0 1 1 0];
- B=[tn ti Ts Tl Tm*Ce];
- C=[Kn Ki Ks 1/R R];
- D=[Kn*tn Ki*ti 0 0 0];
还有一饱和非线性环节: c=8;
2, 各环节的离散化系数矩阵
3, 各环节的输入作用
(1),u(n) 可通过联接矩阵直接求得:
u(n)=[u1(n), u2(n),...,un(n)] 为各环节的输入量, n 为环节数. Y(n)=[Y1(n), Y2(n),...,Yn(n)] 为各环节的输出量, r 为外中参考输入量.
(2)
,
U(n) 由近似表达式求得:
(3),u(n+1) 用折线法近似求得:
4, 状态和输出计算
(1), 一阶保持器
- X=FI'.*X+FIM'.*Uk+FIJ'.*Udot;
- Y=FIC'.*X+FID'.*Uf;
(2), 零阶保持器
- X=FI'.*X+FIM'.*Uk;
- Y=FIC'.*X+FID'.*Uf;
5, 饱和非线性环节
看作环节 1(ASR) 的一部分. 建立 satur.m 文件:
- function [uo]=satur(ui,c)
- if (abs(ui)<=c)
- uo=ui;
- elseif ( ui> c )
- uo = c;
- else
- uo=-c;
- end
- end
三, 实验过程
1, 新建脚本文件, 命名为 satur.m
- function [uo]=satur(ui,c)
- if (abs(ui)<=c)
- uo=ui;
- elseif ( ui> c )
- uo = c;
- else
- uo=-c;
- end
- end
2, 新建脚本文件, 命名为 test3.m
完整代码:
clc;
clear;
% ****** 各环节参数 ****** %
- Kn=26.7;
- tn=0.03;
- Ki=0.269;
- ti=0.067;
- Ks=76;
- Ts=0.00167;
- R=6.58;
- T1=0.018;
- Tm=0.25;
- Ce=0.031;
- Alpha=0.00337;
- Beta=0.4;
- A=[0 0 1 1 0];
- B=[tn ti Ts T1 Tm*Ce];
- C=[Kn Ki Ks 1/R R];
- D=[Kn*tn Ki*ti 0 0 0];
- c=8;
- r=1;
- W=[0 0 0 0 -Alpha;
- 1 0 0 -Beta 0;
- 0 1 0 0 0;
- 0 0 1 0 -Ce;
- 0 0 0 1 0];
- W0=[1 0 0 0 0]';
- h=0.001;
- t_end=0.5;
- t=0:h:t_end;
- n=length(t);
% ****** 各环节离散化系数 ****** %
- block_num=5;
- for k=1:block_num
- if(A(k)==0)
- FI(k)=1;
- FIM(k)=h*C(k)/B(k);
- FIJ(k)=h*h*C(k)/B(k)/2;
- FIC(k)=1;
- FID(k)=0;
- if(D(k)~=0)
- FID(k)=D(k)/B(k);
- end
- else
- FI(k)=exp(-h*A(k)/B(k));
- FIM(k)=(1-FI(k))*C(k)/A(k);
- FIJ(k)=h*C(k)/A(k)-FIM(k)*B(k)/A(k);
- FIC(k)=1;
- FID(k)=0;
- if(D(k)~=0)
- FIC(k)=C(k)/D(k)-A(k)/B(k);
- FID(k)=D(k)/B(k);
- end
- end
- end
- Y0=[0 0 0 0 0]';
- Y=Y0;
- X=zeros(block_num,1);
- result1=Y;
- Uk=zeros(block_num,1);
- Ub=Uk;
- for m=1:(n-1)
- Ub=Uk;
- Uk=W*Y+W0*r;
- Uf=2*Uk-Ub;
- Udot=(Uk-Ub)/h;
%****** 零阶保持器 ******%
- X=FI'.*X+FIM'.*Uk;
- Y=FIC'.*X+FID'.*Uf;
- Y(1)=satur(Y(1),c);
- result1=[result1,Y];
- end
- Y0=[0 0 0 0 0]';
- Y=Y0;
- X=zeros(block_num,1);
- result2=Y;
- Uk=zeros(block_num,1);
- Ub=Uk;
- for m=1:(n-1)
- Ub=Uk;
- Uk=W*Y+W0*r;
- Uf=2*Uk-Ub;
- Udot=(Uk-Ub)/h;
%****** 一阶保持器 ******%
- X=FI'.*X+FIM'.*Uk + FIJ'.*Udot;
- Y=FIC'.*X + FID'.*Uf;
- Y(1)=satur(Y(1),c);
- result2=[result2,Y];
- end
- plot(t,result1(5,:),'-.',t,result2(5,:),'--',t,ScopeData.signals.values,'k');
- legend('零阶保持器','一阶保持器','Simulink');
3, 在 Simulink 中绘制仿真图
注意: Simulink 中的变量名和工作区变量关联方法请点击: https://www.cnblogs.com/KaifengGuan/p/11942615.html
四, 实验结果
来源: https://www.cnblogs.com/KaifengGuan/p/11942180.html