MATLAB编程与应用系列-第15章 Simulink建模与仿真(1)

本系列教程来源于出版书籍《基于MATLAB编程基础与典型应用书籍》,如涉及版权问题,请联系:156204968@qq.com。 出版社:人民邮电出版社, 页数:525。

本系列教程目前基于MATLABR2006a,可能对于更高级版本的功能和函数有差异,教程中如有问题,请联系:156204968@qq.com

Simulink工具箱包含大量的动态仿真库,能够对实际系统进行动态仿真,而且可以非常方便地实现Simulink与Matlab之间的交互操作,使用Matlab命令行进行Simulink模型的仿真,数据交换等。同时可以编写M函数或者S函数进行复杂系统的Simulink仿真。本章主要介绍Simulink建模与仿真的基本知识以及应用实例分析。

15.1 Simulink简介

Simulink是一个用来进行动态系统建模、仿真和分析的软件包。Simulink提供了大量的仿真元件库,非常方便搭建、分析和仿真各种动态系统,包括连续系统、离散系统和混合系统。Simulink交互式的开发界面方便用户直接拖放,连接元件,设置模块属性和仿真参数,实现动态系统的建模仿真。同时,Simulink强大的扩展功能,包括M文件编程技术,S-函数编程级数,子系统创建封装技术等方便用户开发自己的仿真工具箱;Simulink中集成了大量的专业模块库,包括信号处理DSP模块库,电力系统仿真模块库,通信系统模块库等,广泛地应用与社会各领域中。综合起来,Simulink工具箱具备以下强大的功能。

(1)优越的交互式界面,操作简单

Simulink模块库浏览窗口提供了大量的仿真元件库以及其他专业模块库,用户只需要启动Simulink仿真环境,在Simulink Library Browser的窗口选择需要的模块,用鼠标拖放元件,然后连接,就可以建立仿真模型,同时子系统概念可以帮助用户对独立的仿真功能模块进行封装,使系统模型更加简洁清晰。这种简单的元件拖放,连接,仿真的过程,使Simulink建模变得非常容易直观。

(2)丰富的模块库,应用领域广泛

Simulink仿真环境下提供了大量的模块库,包括连续模块库、离散模块库、非线性模块库、信号与系统模块库、数学模块库、子系统模块库、输入输出模块库和函数查表模块库。通过使用这些模块库,能够非常轻松地描述实际物理模型。除了Simulink工具箱外,Simulink仿真开发环境集成了大量专业模块库,包括数字信号处理模块库、通信系统模块库、控制系统模块库、神经网络系统模块库、电力系统仿真模块库等,使Simulink的应用领域几乎扩展到工业生产的各行各业,包括通讯卫星系统、航空航天系统、汽车系统、金融系统、电机系统和控制系统等。

(3)模块库易于扩展,移植性好

Simulink仿真平台中集成了大量的模块库,能够满足一般用户的仿真需求。同时Simulink子系统的概念可以方便地实现模块库扩展。在一些大型系统仿真中,仿真模型元件众多,此时需要建立各种独立功能模块子系统,并进行封装,使之成为一个独立的功能子模块,用户可以将自己建立的子系统组成模块库,并添加到Simulink仿真平台的库浏览窗口中,方便使用。对于一些复杂系统,Simulink仿真环境下可以使用S-函数来实现,它可以使用Matlab,C,C++,Fortran和Ada等语言来编写,实现连续系统、离散系统和混合系统等,这些不同语言下的相关数值算法,不用修改就可以直接移植到Simulink开发环境下,因此模块库的移植性非常好。

(4)仿真手段灵活,接口丰富

在Simulink仿真环境下,仿真手段灵活,一方面可以通过交互式界面菜单按钮的使用进行系统模型仿真,同时也可以通过命令行形式进行模型仿真。交互式界面的仿真方法简单快捷,但是当需要对仿真模型进行重复仿真,或者仿真模型中模块参数动态变化等情况下,这种交互式操作的仿真手段带来极大不便,于是命令行仿真手段凸现优势,通过命令行仿真,可以实现动态改变模型参数,进行多次模型的重复仿真和数据分析等。在Simulink仿真环境下,与Matlab数据交换方式灵活,非常方便用户对仿真结果进行数据整理分析。

15.2 Simulink启动和文件建立

在了解了Simulink基本组成和功能介绍后,可以利用Simulink仿真平台建立仿真模型对实际物理模型进行仿真。本节将主要介绍Simulink仿真平台的启动,仿真模型的建立以及Simulink库文件的建立。

15.2.1 Simulink的启动

在启动Simulink仿真环境前,应该首先启动Matlab。在Matlab工作环境中,启动Simulink主要有以下三种方法。
(1)用命令行Simulink启动Simulink开发环境,在Matlab的命令行窗口(Command Window)中直接键入命令:
>> simulink
回车(Enter)后就会新开启一个Simulink Library Browser的窗口,如图15.2所示。

Simulink启动按钮

(2) 第二种方法是使用Matlab工具栏按钮

启动Simulink仿真平台。如图15.2所示.
Simulink启动窗口

(3)用命令行Simulink3启动Simulink开发环境,在Matlab的命令窗口(Command Window)中直接键入命令:
>> Simulink3
回车(Enter)后就会启动一个标题为Library: Simulink3的新窗口,如图15.3所示。从图中可以看到Simulink库中的一些主要模块库,双击模块库,即可看到对应模块库中的元件列表。例如鼠标左键双击连续模块库(Continuous),或者用鼠标右键的菜单中单击【Open Block】选项,,就可以在新窗口中看到连续模块库中所包含的模块元件,如图15.4所示。
图15-3.Simulink库启动窗口

图15-4.连续模块库中的元件列表png

15.2.2 Mdl文件的建立

如图15.2所示,启动了Matlab/Simulink仿真平台后,需要建立一个空白的仿真模型,即.mdl文件。新建一个空白的系统仿真模型可以有以下几个方法:

(1)如图15.2所示,单击主窗口【File】菜单下的【New】,选择【Model】选项,或者在Simulink主窗口下按CTRL+N的快捷键同样可以创立空白的仿真模型。

(2)在Simulink主窗口中工具栏中的建立一个空白的仿真文档,用打开一个当前路径下保存过的仿真模型。

(3)在Matlab主窗口的菜单栏【File】下的【New】,选择【Model】选项。

图15-5.新建的仿真模型png

图15.5为新建的仿真模型,按CTRL+S快捷键或者选择菜单栏【File】菜单下的【Save】选项,,输入仿真模型的文件名,然后设置模块参数与系统的仿真参数,就可以完成一个简单系统的仿真了。在这个仿真模型中,使用了输入源模块库(Sources)中的正弦波发生器模块(Sine Wave),数学模块库(Math operations)中的绝对值模块(Abs),以及输出模块库(Sink)中的示波器模块(Scope)。三个模块的功能叙述以及参数设置如下:
(1)正弦波发生器模块(Sine Wave):用来产生一定幅值和一定频率的正弦波信号
x(t) = (A+DA)sin(\omega t+j_0)
。同时可以设置频率采样或者时间采样,正弦波信号的初始相位和偏移量。单击模块的右键,即可对模块进行参数的设置。在Sine Type的下拉菜单下可以选择基于时间或者基于频率的正弦波信号类型。Amplitude, Bias可以分别设置幅值和偏移量,对应于A和DA,Frequency和Pahse下分别设置正弦波信号的频率和初始相位,注意单位是rad/sec和rad。最后设置采样时间Sample Time。如图15.6所示。
图15-6.正弦波发生器模块属性设置png

(2)取绝对值模块(Abs):实现绝对值功能,属性设置使用默认设置。

(3)示波器模块(Scope):示波器默认情况下只有一个输入端,但很多情况下为了观测多路不同的输出信号,需要增加示波器的输入端口,这时需要设置示波器的属性。双击Scope模块,单击工具栏按钮,弹出如图15.7所示的示波器参数设置窗口。


图15-7-1.png
图15-7-2.示波器器模块属性设置png

在【General】属性页,根据需要输入端口数量设置Number of axes。Time Range编辑框中输入示波器时间轴的显示范围。在【Data history】属性页中,去掉Limit data points to last选项,使信号能够完全显示与示波器中。如果需要对示波器的数据进行处理,可以选择Save data to workspace选项,定义保存变量的名称,以及数据类型。在保存示波器数据时,提供三种不同的数据格式:第一种是Structure with time;第二种是Struct;第三种是Array。下面章节中将详细介绍这三种不同数据类型保存的数据形式以及它们之间的差异。

(4)当完成了仿真模型所有模块的参数设置后,并且正确设置系统仿真参数,就可以进行模型的仿真。在模型窗口(图15.5所示)中,单击菜单栏【Simulation】下的【Configuration parameters】选项,或者按CTRL+E快捷键,即可弹出仿真参数设置对话框,如图15.8所示。首先在仿真时间组件中设置仿真的起始时间和终止时间。在求解组合框中,首先选择仿真算法,采用变步长算法或者定步长算法,变步长算法包括离散算法(discrete)、ode45、 ode23,、ode113,、ode15s、 ode23s,、ode23t和ode23tb算法;在定步长仿真中,包括离散算法、ode1、ode2、ode3、ode4、ode5算法。然后设置仿真算法步长,包括初始步长,最小步长和最大步长设置,以及误差容忍度的设置,包括绝对误差和相对误差设置。


图15-8.仿真参数设置对话框png

当仿真模型所有模块参数和仿真参数设置完成后,就可以进行仿真系统的仿真。单击模型窗口(图15.5所示)中菜单栏【Simulation】下的【Start】选项,或者按快捷键CTRL+T,或者单击工具栏按钮进行模型仿真,结果如图15.9所示。

示波器在不同保存数据格式下,数据结构不尽相同。当数据格式设置为Structure with time时,仿真结束后,在命令窗口中输入:

>> compare_sine
compare_sine =
 time: [200001x1 double]
 signals: [1x2 struct]
blockName: 'sim_book_1/Scope'

可以看出,示波器保存的是包含时间和信号数据的结构体,同时还有示波器模块的名称。而信号数据也是一个结构体。在命令窗口中输入:

>> signals_struct=compare_sine.signals
signals_struct =
1x2 struct array with fields:
 values
 dimensions
 label
 title
plotStyle

如果要获取时间和信号的数据可以分别用以下的命令:

>> time=compare_sine.time;%获取仿真时间数据
>> pre_signal=compare_sine.signals(1).values;%获取第一个信号的数据
>> aft_signal=compare_sine.signals(2).values; %获取第二个信号的数据
图15-9.仿真结果波形png

当数据格式设置为Struct时,仿真结束后,在命令窗口中输入:

>> compare_sine
compare_sine = 
         time: []
      signals: [1x2 struct]
    blockName: 'sim_book_1/Scope'

发现此时示波器数据中时间数据为空集,并没有保存时间的数据。信号数据同第一种数据格式一种为1x2 struct结构体数据。

第三种数据结构Array必须是示波器为单输入时才能保存为数组。在多输入情况下,必须以结构体形式保存数据。

1.示波器图形编辑和数据处理方法
从图15.9可以看出,示波器仿真结果无法直接进行编辑,而且以黑色为图形背景,不利于工程论文图形美观需求。因此需要对示波器图形或者数据进行重新处理。以下提供5种基本的处理方式。

(1)按下键盘的屏幕打印按钮【PrintScreen】,然后粘贴到Windows位图编辑器,即Windows下自带的画图板软件,选择图像单击右键,选择【反色】即可;

(2)在Scope属性页中的Data history属性页,选中 Save Data to Workplace单选框,然后在Variable Name编辑框中指定变量名,Format下拉按钮下选择示波器保存数据类型,将仿真数据保存在工作窗口下,使用plot命令绘制仿真结果如图15.10示;


图15-10.示波器数据处理图形png

(3)直接在模型的输出信号线上添加To Workplace模块,在工作窗口中将仿真数据使用plot命令绘制出来;

(4)直接在模型的输出信号线上添加Outport模块,用plot命令绘制tout和yout;

(5)仿真模型仿真结束后,等示波器Scope显示出来图像以后,在Matlab的命令行窗口中输入:

>> set(0,'ShowHiddenHandles','On')
>> set(gcf,'menubar','figure')

单击菜单栏的【Insert】选项,鼠标会变成十字形状,然后再图像的任意一处双击左键出现一个对话框PropertyEditor,选中style在窗口的右边会出现color选项,就可以任意修改波形背景颜色,同时也可以对曲线颜色以及坐标轴进行设置,结果如图15.11所示。


图15-11.示波器上新增加一栏菜单png

在命令行窗口中输入以下绘图命令,结果如图15.10所示。

>> subplot(2,1,1)
>> time=compare_sine.time;
>> pre_signal=compare_sine.signals(1).values;
>> aft_signal=compare_sine.signals(2).values;
>> plot(time,pre_signal)
>> grid on
>> xlabel('Time(sec)');ylabel('original signal')
>> subplot(2,1,2)
>> plot(time,aft_signal)
>> grid on
>> xlabel('Time(sec)');ylabel('absolute signal')

以上通过一个简单的系统模型演示了Simulink建模与仿真的基本步骤。相信读者通过这一部分的学习能够大致了解一个Simulink仿真模型建立的步骤,示波器数据图像化显示的基本方法,以及仿真数据的交互式处理。在后续章节中,会更加详细地介绍Simulink模块库各模块的功能,使用方法和应用场所,通过更加深入的学习,相信读者能够轻松地建立相对简单的Simulink仿真模型。对于复杂系统,离散-连续混合系统的仿真,在介绍完命令行仿真技术,S-function建模仿真后,相信读者能够针对一些综合的复杂系统,进行建模和仿真。

作者:德特数据
联系方式:156204968@qq.com

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335