第3章 仿真软件与机电液系统仿真基础
3.1 MATLAB/Simulink仿真软件基础
系统仿真主要是使用仿真软件实施的,仿真软件是一类面向仿真用途的专用软件,它可能是面向通用的仿真,也可能是面向某个领域的仿真。本节主要介绍一下仿真软件的功能,并重点介绍MATLAB/Simulink这种仿真软件的特点及其使用方法。
仿真软件的功能可以概括为以下几个方面:
(1)为仿真提供算法支持;
(2)模型描述,用来建立计算机仿真模型;
(3)仿真实验的执行和控制;
(4)仿真数据的显示、记录和分析;
(5)对模型、实验数据、文档资料和其他仿真信息的存储、检索和管理(即用于仿真数据信息管理的数据库系统)等。
3.1.1 MATLAB简介
MATLAB是“矩阵实验室”(Matrix Lab Oratory)的缩写,由美国MathWorks公司推出的一种以矩阵运算为基础的交互式程序设计语言和科学计算软件,适用于工程应用和教学研究等领域的分析设计与复杂计算。与其他计算机语言相比,它语句简洁,编程效率高,具有强大而简易的绘图功能,有效方便的矩阵和数组运算,直观便捷的动态仿真,尤其是扩充能力强。正因为这些特点,MATLAB已成为教学研究与工程应用的不可缺少的助手。
在设计研究单位和工业部门,MATLAB也被认为是进行高效研究、开发的首选软件工具。例如,美国National Instruments公司信号测量、分析软件LabVIEW,Cadence公司信号和通信分析设计软件SPW等,或者直接建筑在MATLAB之上,或者以MATLAB为主要支撑。再如,HP公司的VXI硬件,TM公司的DSP,Gage公司的各种硬卡、仪器等都能得到MATLAB的支持。
总而言之,MATLAB具有以下几个特点。
1.功能强的数值运算
在MATLAB环境中,有超过500种数学、统计、科学及工程方面的函数可供使用,函数的标示自然,使得问题和解答像数学公式一般简单明了,让使用者可全力发挥在解题思路方面,而非浪费在计算机操作上。
2.先进的资料视觉化功能
MATLAB的物件导向图形架构让使用者可以执行视觉数据分析,并制作高品质的图形,完成科学性或工程性的图文并茂的报告。
3.高阶但简单的程序环境
作为一种直译式的程序语言,MATLAB允许使用者在短时间内写完程序,所花的时间约为使用Fortran语言或C语言的几分之一,而且不需要编译(Compile)及链接(Link)即可执行,同时包含了更多及更容易使用的内建功能。
4.开放及可延伸的架构
MATLAB允许使用者接触大多数的数学原始码,检视运算法,更改现存函数,甚至加入自己的函数使MATLAB成为使用者所需要的环境。
5.丰富的程序工具箱
MATLAB的程序工具箱融合了套装软件的优点,提供了一个灵活、开放且容易操作的环境,这些工具箱为使用者提供了许多在特别应用领域所需要的函数。常用工具箱有符号运算、影像处理、统计分析、信号处理、神经网络、模拟分析、控制系统、实时控制、系统辨识、鲁棒控制、小波分析、最优化、模糊逻辑、MU分析及合成、化学计量分析等。
3.1.2 Simulink的特点与模块库
Simulink是一个用来对动态系统进行建模、仿真和分析的软件包。使用Simulink来建模、分析和仿真各种动态系统,包括连续系统、离散系统和混合系统,将是一件非常轻松的事情。它提供了一种图形化的交互环境,只需用鼠标拖动的方法便能迅速地建立起系统框图模型,甚至不需要编写一行代码。它和MATLAB的无缝结合使得用户可以利用MATLAB丰富的资源,建立仿真模型,监控仿真过程,分析仿真结果。另外,Simulink在系统仿真领域中已经得到广泛的认可和应用,许多专用的仿真系统都支持Simulink模型,这非常有利于代码的重用和移植。使用Simulink可以方便地进行控制系统、DSP系统、通信系统,以及其他系统的仿真分析和原型设计。
1.Simulink的特点
利用Simulink进行系统的建模仿真最大的优点是其易学、易用性,以及依托MATLAB所提供的丰富的仿真资源。这里对Simulink的强大功能做一下简单介绍。
(1)交互式、图形化的建模环境。
Simulink提供了丰富的模块库帮助用户快速地建立起动态系统模型。建模时只需使用鼠标拖动不同模块库中的系统模块并将它们连接起来。另外,还可以把若干功能块组合成子系统,建立起分层的多级模型,提供的模型浏览器(Model Browser)可以使用户方便地浏览整个模型的结构和细节。Simulink这种图形化、交互式的建模过程非常直观,很容易掌握。
(2)交互式的仿真环境。
Simulink框图提供了交互性很强的仿真环境。既可以通过下拉菜单执行仿真,也可以通过命令行进行仿真。菜单方式对于交互工作非常方便,而命令行方式对于运行一大类仿真,如蒙特卡罗仿真非常有用。有了Simulink,用户可以在仿真的同时,采用交互或批处理的方式,方便地更换参数来进行“What-if”式的分析仿真。仿真过程中各种状态参数可以在仿真运行的同时通过示波器或利用ActiveX技术的图形窗口显示。
(3)专用模块库(Blocksets)。
作为Simulink建模系统的补充,MathWorks公司开发了专用功能块程序包,如DSP Blockset和Communication Blockset等。通过使用这些程序包,用户可以迅速地对系统进行建模、仿真与分析。更重要的是用户还可以对系统模型进行代码生成,并将生成的代码下载到不同的目标机上。可以说,MathWorks为用户从算法设计、建模仿真,一直到系统实现提供了完整的解决方案。而且,为了方便用户系统的实施,MathWorks公司还开发了实施软件包,如TI和Motorola开发工具包,以方便用户进行目标系统的开发。表3.1列出了现有的一些软件工具包。
表3.1 Simulink的部分软件工具包
(4)与MATLAB工具箱的集成。
由于Simulink可以直接利用MATLAB的诸多资源与功能,所以用户可以直接在Simulink下完成诸如数据分析、过程自动化、优化参数等工作。工具箱提供的高级的设计和分析能力可以融入仿真过程。
简而言之,Simulink具有以下特点:
• 基于矩阵的数值计算;
• 高级编程语言;
• 图形与可视化;
• 工具箱提供面向具体应用领域的功能;
• 丰富的数据I/O工具;
• 提供与其他高级语言的接口;
• 支持多平台(PC/Macintosh/UNIX);
• 开放与可扩展的体系结构。
2.Simulink模块库
Simulink公共模块库是Simulink中最为基础,但也是最为通用的模块库,它可以被应用到不同的专业领域中。Simulink公共模块库共包含9个模块库,如图3.1所示。
下面分别介绍本文中主要用到的几种Simulink模块库。
(1)Continuous连续系统模块库。
连续系统模块库,以及其中各模块的功能如图3.2所示。
图3.1 Simulink的公共模块库
图3.2 连续系统模块库及其功能
(2)Discrete离散系统模块库。
离散系统模块库,以及其中各模块的功能如图3.3所示。
图3.3 离散系统模块库及其功能
(3)Functions & Tables函数与表库。
函数与表库,以及其中各模块的功能如图3.4所示。
(4)Math数学运算库。
数学运算库,以及其中各模块的功能如图3.5所示。
图3.4 函数与表库及其功能
图3.5 数学运算库及其功能
(5)Sources系统输入信号模块库。
系统输入信号模块库,以及其中各模块的功能如图3.6所示。
图3.6 系统输入信号模块库及其功能
(6)Sinks系统输出模块库。
系统输出模块库,以及其中各模块的功能如图3.7所示。
图3.7 系统输出模块库及其功能
(7)Nonlinear非线性系统模块库。
非线性系统模块库,以及其中各模块的功能如图3.8所示。
图3.8 非线性系统模块库及其功能
(8)Signals & Systems信号与系统模块库。
信号与系统模块库,以及其中各模块的功能如图3.9所示。
图3.9 信号与系统模块库及其功能
图3.9 信号与系统模块库及其功能(续)
3.1.3 MATLAB在仿真中的应用
3.1.3.1 数学模型的描述与转换
在MATLAB中可以方便地描述常用的几种数学模型,同时提供几种数学模型之间进行相互转换的函数。
1.微分方程及传递函数的多项式模型
描述连续系统的微分方程和传递函数,其多项式模型分别为式(3.1)和(3.2),两式之间可以互相转换。
在MATLAB语言中,可以利用分别定义的传递函数分子、分母多项式系数向量方便地加以描述。
例如,对于式(3.2),系统可以分别定义传递函数的分子、分母多项式系数向量为
num=[b1 b2 … bn-1bn]
den=[1a1 a2 … an-1 an]
就可以得到模型,即
sys=tf(num,den)
[例3-1] 已知系统传递函数为
利用MATLAB将上述模型表示出来。
解:其MATLAB命令为
>> num=7*[2,3]; >> den=conv(conv(conv([1,0,0],[3,1]),conv([1,2],[1,2]),[5,0,3,8]); >> sys=tf(num,den)
运行结果:
Transfer function:
14 s+21
15 s^8+65 s^7+89 s^6+83 s^5+152 s^4+140 s^3+32 s^2
运行结果示意图如图3.10所示。
图3.10 运行结果示意图
2.传递函数的零极点增益模型
在MATLAB里,用函数命令zpk( )来建立控制系统的零极点增益模型,或者将传递函数模型或者状态空间模型转换为零极点增益模型。zpk( )函数的调用格式为
sys=zpk([z],[p],[k]) z=[z1 z2 … zm],p=[p1p2 … pn]
函数返回的变量sys为连续系统的零极点增益模型。
[例3-2] 已知系统传递函数为
利用MATLAB将上述模型表示出来。
解:MATLAB命令为
>> k=5; >> z=-20; >> p=[0,-4.6,-1]; >> sys=zpk([z],[p],[k])
运行结果:
Zero/pole/gain: 5 (s+20) --------------- s (s+4.6) (s+1)
运行结果示意图如图3.11所示。
图3.11 运行结果示意图
3.状态空间模型
在MATLAB中,用函数ss( )来建立控制系统的状态空间模型,或者将传递函数模型与零极点增益模型转换为系统状态空间模型。ss( )函数的调用格式为
sys=ss(a,b,c,d)
函数的返回变量sys为连续系统的状态空间模型。函数输入参数a,b,c,d分别对应于系统的A,B,C,D参数矩阵。
[例3-3] 已知系统的状态空间描述为
解:MATLAB命令为
>> a=[2.25,-5,-1.25,-0.5; 2.25,-4.25,-1.25,-0.25; 0.25,-0.5,-1.25,-1; 1.25,-1.75,-0.25,-0.75]; >> b=[4;2;2;0]; >> c=[0,2,0,2]; >> d=0; >> sys=ss(a,b,c,d)
运行结果示意图如图3.12所示。
4.三种数学模型之间的转换
表3.2给出了数学模型转换函数及其功能。
图3.12 运行结果示意图
表3.2 数学模型转换函数及其功能
下面主要介绍两种常用的转换。
(1)系统状态空间模型向传递函数或零极点增益模型的转换。
• 系统状态方程向传递函数模型的转换。
由式可得
iu指输入量序号,对于单输入系统iu=1;返回结果num为传递函数分子多项式系数,按s的降幂排列;相应的传递函数分母系数则包含在矩阵den中。
为了获得传递函数模型,还可以采用以下方式进行,即
G1=ss(A,B,C,D); G2=tf(G1)
[例3-4] 已知连续系统的状态空间描述如下,求相应的传递函数模型。
解:MATLAB命令为
>> a=[2.25,-5,-1.25,-0.5; 2.25,-4.25,-1.25,-0.25; 0.25,-0.5,-1.25,-1; 1.25,-1.75,-0.25,-0.75]; >> b=[4;2;2;0]; >> c=[0,2,0,2]; >> d=0; >> T=1; >> [num,den]=ss2tf(a,b,c,d,T); >> sys=tf(num,den)
运行结果示意图如图3.13所示。
图3.13 运行结果示意图
• 各种模型向零极点增益模型的转换。
MATLAB基本调用格式为
① 状态方程模型转换为零极点模型:
[z,p,k]=ss2zp(A,B,C,D,iu)
② 传递函数模型转换为零极点模型:
[z,p,k]=tf2zp(num,den)
③ 非零极点模型转换为零极点模型:
G1=zpk(sys)
[例3-5] 已知连续系统的状态空间描述如下,将其转换成零极点增益模型。
解:MATLAB运行结果示意图如图3.14所示。
图3.14 运行结果示意图
(2)系统模型向状态空间模型的转换。
MATLAB基本格式为
[a,b,c,d]=tf2ss(num,den) [a,b,c,d]=zp2ss(z,p,k) G1=ss(sys)
[例3-6] 已知系统传递函数为
利用MATLAB将上述模型转换成状态空间模型。
解:MATLAB运行结果示意图如图3.15所示。
图3.15 运行结果示意图
3.1.3.2 MATLAB的仿真算法函数
由第2章的相关论述可以看出,在连续系统仿真中,主要的数值计算工作是对考虑初值问题的微分方程进行求解,即
下面介绍如何用MATLAB软件求常微分方程的数值解及基于MATLAB的离散相似法仿真。
1.使用MATLAB软件求常微分方程的数值解
函数的调用格式为
[T, X]=Solver(’f’,ts,x0,options)
式中 T——自变量值;
X——函数值;
Solver—— ode45,ode23,ode113,ode15s,ode23s;其中,ode23为组合的2/3阶龙格-库塔-芬尔格算法,ode45为运用组合的4/5阶龙格-库塔-芬尔格算法;
'f '——由待解方程写成的m-文件名;
ts——ts=[t0,tf],其中,t0、tf为自变量的初值和终值;
x0——函数的初值;
options——用于设定误差限(默认时设定相对误差10-3,绝对误差10-6),命令为
options=odeset('reltol',rt,'abstol',at)
其中,rt,at分别为设定的相对误差和绝对误差。
注意:
• 在解n个未知函数的方程组时,x0和x均为n维向量,m-文件中的待解方程组应以x的分量形式写成。
• 使用MATLAB软件求数值解时,高阶微分方程必须等价地变换成一阶微分方程组。
[例3-7] 求微分方程组的数值解。
解:令y1=x,y2=y1'
则微分方程变为一阶微分方程组
(1)建立m-文件vdp1000.m如下:
function dy=vdp1000(t,y) dy=zeros(2,1); dy(1)=y(2); dy(2)=1000*(1-y(1)^2)*y(2)-y(1);
(2)取t0=0,tf=3000,输入命令:
[T,Y]=ode15s('vdp1000',[0 3000],[2 0]); plot(T,Y(:,1),'-')
(3)运行结果示意图如图3.16所示。
图3.16 运行结果示意图
[例3-8] 求解微分方程组的数值解。
解:(1)建立m-文件rigid.m如下:
function dy=rigid(t,y) dy=zeros(3,1); dy(1)=y(2)*y(3); dy(2)=-y(1)*y(3); dy(3)=-0.51*y(1)*y(2);
(2)取t0=0,tf=12,输入命令:
[T,Y]=ode45('rigid',[0 12],[0 1 1]); plot(T,Y(:,1),'-',T,Y(:,2),'*',T,Y(:,3),'+')
(3)运行结果示意图如图3.17所示。
图中,y1的图形为实线,y2的图形为“*”线,y3的图形为“+”线。
图3.17 运行结果示意图
2.基于MATLAB的离散相似法仿真
MATLAB控制工具箱中提供了连续系统离散化函数c2d,其主要功能就是将连续系统模型转换为离散时间系统模型。函数的调用格式为
sysd=c2d(sysc, T, method)
式中 sysc——连续系统的MATLAB模型;
T——采样时间;
sysd——等价的离散化模型;
method——模型转换方法。
该函数提供的模型转换方法包括:
(1)method='zoh'——采用零阶保持器;
(2)method='foh'——采用改进的一阶保持器(三角形保持器);
(3)method='tustin'——采用双线性置换法;
(4)method='prewarp'——采用改进的双线性法;
(5)method='matched'——采用零极点匹配法;
(6)默认时,采用零阶保持器。
[例3-9] 说明c2d函数的应用。将连续系统模型
转换为离散时间系统模型。
解:MATLAB命令为
H=tf([1-1],[1 4 5],'inputdelay',0.35) Transfer function: s-1 exp(-0.35*s) *------------------------ s^2+4 s+5 Hd=c2d(H,0.1,'foh') Transfer function: 0.011 5 z^3+0.045 6 z^2-0.056 2 z-0.009 104 z^(-3) *---------------------------------------------------------- z^3-1.629 z^2+0.670 3 z Sampling time: 0.1 The next command compares the continuous and discredited step responses. step(H,'-',Hd,'--')
运行结果示意图如图3.18所示。
图3.18 运行结果示意图