(MATLAB)第二十一章 Simulink仿真设计初步

        Simulink是MATLAB的重要组成部分,可以非常容易地实现可视化建模,并把理论研究和工程实践有机地结合在一起,不需要书写大量程序,只需要使用鼠标和键盘对已有模块进行简单的操作和设置。

21.1 Simulink简介

        Simulink是MATLAB软件的扩展,它提供了集动态系统建模、仿真和综合分析于一体的图形用户环境,是实现动态系统建模和仿真的一个软件包。它与MATLAB的主要区别在于,其与用户的交互接口是基于Windows的模型化图形输入,其结果是用户可以把更多的精力投入到系统模型的构建,而非语言的编程上。

        Simulink 提供了大量的系统模块,包括信号、运算、显示系统等多方面的功能,可以创建各种类型的仿真系统,实现丰富的仿真功能。用户也可以定义自己的模块,进一步扩展模型的范围和功能,以满足不同的需求。为了创建大型系统,Simulink 提供了系统分层排列的功能的设计,在Simulink中可以将系统分为从高级到低级的几个层次,每层又可以细分几个部分,每层系统构建完成后,将各层连接起来构成一个完整的系统。模型创建完成之后,可以启动系统的仿真功能分析系统的动态特性,Simulink内置的分析工具包括各种仿真算法、系统线性化、寻求平衡点等,仿真结果可以以图形的方式显示在示波器窗口,以便于用户观察系统的输出结果;Simulink也可以将输出结果以变量的形式保存起来,并输入到MATLAB工作空间中以完成进一步的分析。

        Simulink 可以支持多采样频率系统,即不同的系统能够以不同的采样频率进行组合,可以仿真较大、较复杂的系统

1.图形化模型与数学模型间的关系

现实中每个系统都有输入、输出和状态3个基本要素,它们之间随时间变化的数学函数关系即数学模型。图形化模型也体现了输入、输出和状态随时间变化的某种关系。只要这两种关系在数学上是等价的,就可以用图形化模型代替数学模型

2.图形化模型的仿真过程

Simulink的仿真过程包括以下几个阶段。

(1)模型编译阶段

        Simulink 引擎调用模型编译器,将模型翻译成可执行文件。其中编译器主要完成以下任务。

→计算模块参数的表达式,以确定它们的值。

→ 确定信号属性(如名称、数据类型等)。

→传递信号属性,以确定未定义信号的属性。

→优化模块。

→展开模型的继承关系(如子系统)。

→确定模块运行的优先级。

→确定模块的采样时间。

(2)连接阶段

        Simulink 引擎按执行次序创建运行列表,初始化每个模块的运行信息。

(3)仿真阶段

        Simulink 引擎从仿真的开始到结束,在每一个采样点按运行列表计算各模块的状态和输出。该阶段又分成以下两个子阶段。

→初始化阶段:该阶段只运行一次,用于初始化系统的状态和输出。

→迭代阶段:该阶段在定义的时间段内按采样点间的步长重复运行,并将每次的运算结果用于更新模型。在仿真结束时获得最终的输入、输出和状态值。

 21.1.1 Simulink模型的特点

         (1)仿真结果的可视化

         (2)模型的层次性

         (3)可封装子系统

21.1.2 Simulink模型的数据类型

        Simulink在仿真开始之前和运行过程中会自动确认模型的类型安全性,以确保该模型产生的代码不会上溢或者下溢。

1. Simulink支持的数据类型

        Simulink支持所有的MATLAB内置的数据类型,除此之外,Simulink还支持布尔类型,绝大多数模块都默认double类型的数据,但有些模块需要布尔类型和复数类型。

2. 数据类型的统一

        若模块的输入输出支持的数据类型不相同,则在仿真时会弹出错误提示对话框,告知冲突的信号和端口,此时可以尝试在冲突的模块间插入DataTypeConversion(数据类型转换)模块来解决。示例如下:

3. 复数类型

        Simulink默认的信号值都是复数,但在实际问题中需要处理复数信号。在Simulink中通常用Real-Image to Complex模块和Magnitude-Angle to Complex模块来建立处理复数信号的模型。如下图示例所示:

21.2 Simulink模块库

21.2.1 常用模块库

1.Commonly Used Blocks库(常用模块库)

模块名

功能

Bus Creator

将输入信号合并成向量信号

Bus Selector

将输入向量分解成多个信号,输入只接收从MuxBusCreator输出的信号

Constant

输出常量信号

Data Type Conversion

数据类型的转换

DemuX

将输入向量转换成标量或更小的标量

Discrete-Time lntegrator

离散积分器模块

Gain

增益模块

In1

输入模块

Integrator

连续积分模块

Logical Operator

逻辑运算模块

Mux

将输入的向量、标量或矩阵信号合成

Out1

输出模块

Product

乘法器,执行标量、向量或矩阵的乘法

Relational Operator

关系运算,输出布尔类型数据

Saturation

定义输入信号的最大值和最小值

Scope

在示波器中输出

Subsystem

创建子系统

Sum

加法器

Switch

选择器,根据第二个输入信号来选择输出第一个信号还是第三个信号

Terrainator

终止输出,用于防止模型最后的输出端没有接任何模块时报错

Unit Delay

单位时间延迟

2. Continuous库(连续系统库)

模块名

功能

Derivative

数值微分

Integrator

积分器与 Commonly Used Blocks 子库中的同名模块一样

State-Space

创建状态空间模型

dx/dt= Ax + Bu

y= Cx+ Du

Transport Delay

定义传输延迟,如果将延迟设置得比仿真步长大,就可以得到更精确的结果

Transfer Fen

用矩阵形式描述的传输函数形

Variable Transport Delay

定义传输延迟,第一个输入接收输入,第二个输入接收延迟时间用

Zero-Pole

矩阵描述系统零点,用向量描述系统极点和增益

21.2.2 子系统及其封装

        若模型的结构过于复杂,则需要将功能相关的模块组合在一起形成几个小系统,即子系统,后在这些子系统之间建立连接关系,从而完成整个模块的设计。这种设计方法实现了模型图表的次化,使整个模型变得非常简洁,使用起来非常方便。

用户可以把一个完整的系统按照功能划分为若干个子系统,而每个子系统又可以进一步划分为更小的子系统,由此可以将系统分为多层。

 1. 子系统的创建方法
(1)通过子系统模块来创建子系统;
(2)组合已经存在的模块集
 2. 封装子系统

21.3 模块的创建

        模块是Simulink建模的基本元素,了解各模块的作用是熟练掌握Simulink的基础。下面介绍利用Simulink进行系统建模和仿真的基本步骤。

(1)绘制系统流程图。首先将所要建模的系统根据功能划分为若干子系统,然后用模块来搭建每个子系统;
(2)启动Simulink模块库浏览器,建立一个空白模型窗口;
(3)将所需模块放入空白模型窗口中,将系统流程图的布局连接各模块,并封装子系统;
(4)设置各模块的参数以及仿真有关的各种参数;
(5)保存模型,模型文件的后缀名为.mdl
(6)运行并调试模型

21.3.1 创建模块文件

21.3.2 模块的基本操作

       1. 模块的选择

         2. 模块的放置

         3. 模块的位置调整

         4. 模块的属性编辑

21.3.3 模块参数设置

         1. 参数设置

         2. 属性设置

                  示例1:滤波信号输出

   

                示例2:正弦信号输出

 

21.3.4 模块的连接

         1. 直线的连接

         2. 直线的编辑

                  示例1:正弦信号的最大值、最小值输出

 

                  示例2:信号输出

21.4 仿真分析

21.4.1 仿真参数设置

       (1)Solver(求解器)面板

        主要用于设置仿真开始和结束的时间,选择解法器并设置相应的参数。

         (2)Data Import/Export(输入/输出数据)面板

21.4.2 仿真的运行和分析

         1. 仿真结果输出分析

         (1)在模型中将信号输入Scope(示波器)模块或XY Graph模型;
         (2)将输出写入To Workspace模块,然后使用MATLAB绘图功能;
         (3)将输出写入To File模块,然后使用MATLAB文件读取和绘图功能。

         2. 线性化分析

         3. 平衡点分析

21.4.3 仿真错误分析

21.5 回调函数

 21.6 S函数

        S函数(System 函数)是一种描述动态系统的计算机语言,可以用MATLAB、C、C++、Ada和 FORTRAN 语言编写。用mex 命令可将C、C++等语言编写的S函数编译成 MEX文件,从而可以像 MATLAB 中的其他 MEX文件一样,动态地连接到MATLAB。S函数采用一种特殊的调用语法和 Simulink 解法器进行交互,这种交互与解法器和 Simulink 自带模块间的交互十分类似。S函数可以用来描述连续、离散和混杂系统。

        S函数是扩展Simulink 功能的强有力的工具,可以实现以下操作:

        (1)用多种语言来创建新的通用性的 Simulink 模块;

        (2)可以在 User-Defined Functions 模块库的 S-function 模块中通过名称来调用并封装;        

        (3)将一个系统描述成一个数学方程;

        (4)便于图形化仿真;

        (5)可以创建代表硬件驱动的模块。

21.7 综合实例——轴系扭转振动仿真

         某柴油机4级系统振动方程:$ I\ddot{\varphi}+C\dot{\varphi}+K\varphi =T $其中,$ \varphi $轴系各质量点扭振转角位移;轴系节点向量$ T=1200N·m $;轴系转动惯量$ I=\left( 0.002~6.7 \right) kg·m^2 $,阻尼$ C=13000\left( N·m \right) s/rad $,刚度矩阵$ K=2000N/m $。当$ T=0 $时,计算系统自由振动;当$ T\ne 0 $,计算系统受迫振动。

        系统受迫振动微分方程表述为$ 5\ddot{\varphi}+13000\dot{\varphi}+2000\varphi =1200 $,将原微分方程修改为$ \ddot{\varphi}=240-2600\dot{\varphi}-400\varphi $

 

        转化方程组:对于系统受迫振动微分方程 $ 5\ddot{\varphi}+13000\dot{\varphi}+2000\varphi =t $$ t=2000 $,转化为高阶微分方程,这里需要将其转换为一阶微分方程组即状态方程,然后使用函数ode45()进行求解。令$ x_1=\varphi ,\ x_2=\dot{\varphi} $ ,则状态方程为

        创建函数文件verderpol.m:

function [xn]=verderpol(t,x)
global mu
xn=[x(2);0.2*mu-400*x(1)-2600*x(2)];
end

        在命令行窗口中输入下面的程序:

>> global mu;
>> mu=1200;
>> y0=[1200;0];
>> [t,x]=ode45(@verderpol,[0,1200],y0);
>> subplot(1,2,1);plot(t,x);
>> title('时间响应曲线')
>> xlim([-200,1500])
>> subplot(1,2,2);plot(x(:,1),x(:,2))
>> title('平面曲线')
>> xlim([0,1500])

        结果:

 

参考资料:

[1] 天工在线. MATLAB2020从入门到精通·实战案例版[M]. 北京: 中国水利水电出版社, 2020.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/488634.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一、Java开发环境搭建-----系统类的简单使用

JavadocAPI文档练习: 1、Date类的使用——代码实战 Date类为日期类,是Java中和日期相关的一个类,如下将日期做一个简单的介绍。 package com.kangning.web.controller.common;import java.util.Date;public class DateDemo1 {public static…

SAP/ERP系统PP模块常用增强之二:报表COOIS增加字段

SAP/PP模块中的COOIS报表(订单信息系统)是最常用的标准报表之一,它可以查询有关生产订单的完整信息,但实际项目实施中也会经常遇到这个报表增强需求,一般要求增加一些产品相关的一些额外信息。 SAP系统为此类需求预留第三代BADI增强出口,可以非常方便的实现在COOIS报表中…

水泊梁山108小酒坛之小李广花荣

小李广花荣,是中国著名小说《水浒传》中的108将之一,有“百步穿杨”的功夫。在梁山泊英雄中排行第九,为马军八虎骑兼先锋使之首。原是清风寨副知寨,使一杆银枪,一张弓射遍天下无敌手,生得一双俊目&#xff…

谈谈消息队列

这篇文章我们来聊聊消息队列。我一直在想,能不能用一篇文章就把消息队列的所有内容给串联起来。然后,之后每次看到这篇文章的时候,我就能够立马回忆起来这个大知识的所有知识点。所以我想尝试一下用这种长文的方式,将我自己对于消…

财富池指标公式--通达信资金进场买入提示指标公式

1、“准备现金”信号出现,可开始关注该个股,等待合适价位介入,较为激进的投资者也可在此时介入,更稳健的做法是,等到“买入股票”信号出现后再介入。 2、“见顶清仓”信号出现,预示着即将见顶,是…

Matlab从入门到精通课程

教程介绍 MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。 学习地址 链接:https://pan.baidu.com/s/1PxGarBwQusMzwPVqcE…

【JavaScript】JavaScript 程序流程控制 ⑥ ( while 循环概念 | while 循环语法结构 )

文章目录 一、while 循环1、while 循环概念2、while 循环语法结构 二、while 循环 - 代码示例1、打印数字2、计算 1 - 10 之和 一、while 循环 1、while 循环概念 在 JavaScript 中 , while 循环 是一种 " 循环控制语句 " , 使用该语句就可以 重复执行一段代码块 , …

如何使用 ArcGIS Pro 制作三维建筑

三维地图已经逐渐成为未来地图的趋势,对于大范围应用,只需要普通的建筑体块就行,如果有高程数据,还可以结合地形进行显示,这里为大家介绍一下 ArcGIS Pro 制作三维建筑的方法,希望能对你有所帮助。 数据来…

Kimi是什么?免费Kimi chat介绍

1. Kimi是什么? Kimi是由月之暗面科技有限公司(Moonshot AI)开发的人工智能助手,专注于提供高质量的对话和信息处理服务。 月之暗面公司创立于2023年3月,创始团队核心成员参与了Google Gemini、Google Bard、盘古NLP、…

Java面试篇:Redis使用场景问题(缓存穿透,缓存击穿,缓存雪崩,双写一致性,Redis持久化,数据过期策略,数据淘汰策略)

目录 1.缓存穿透解决方案一:缓存空数据解决方案二:布隆过滤器 2.缓存击穿解决方案一:互斥锁解决方案二:设置当前key逻辑过期 3.缓存雪崩1.给不同的Key的TTL添加随机值2.利用Redis集群提高服务的可用性3.给缓存业务添加降级限流策略4.给业务添加多级缓存 4.双写一致性…

✮✮✮宁波CE认证,CE认证,CE产品检测✮✮✮

✮✮✮🌈宁波CE认证,🌈CE认证,🌈CE产品检测🌈✮✮✮ ❀热点:😘CE认证什么意思 ❀优势:😜CE认证的目的 ✎🍒CE认证定义和目的 ✎🍐CE认…

李宏毅深度强化学习导论——演员-评论员

引言 本文主要介绍演员-评论员(Actor-Critic)算法。 Critic 给定Actor θ \theta θ,Critic评估当观测到 s s s(或进一步地采取行动 a a a)的好坏。 价值函数(Value function),记为 V θ ( s ) V^\theta(s) Vθ(s),就是一种Critic。 它的…

蓝桥杯刷题(十四)

1.小平方 代码 n int(input()) count0 def f(x)->bool: # 判断条件return True if x**2%n<n/2 else False for i in range(1,n): # 遍历[1,n-1]&#xff0c;符合题意计数加一if f(i):count1 print(count)2.3的倍数 代码 a int(input()) b int(input()) c int(input…

【python】flask各种版本的项目,终端命令运行方式的实现

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Java:ArrayList与顺序表

一、线性表 线性表是n个具有相同特征的数据元素的有限序列&#xff0c;它是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表有&#xff1a;顺序表、链表、栈、队列...... 如图&#xff1a;顺序表与链表的区别看了标题的伙伴就应该知道&#xff0c;我们这次要讲解的主…

【浏览器渲染-输入Url到页面渲染全流程】

概述 在面试题中有一道经典面试题就是浏览器输入url之后发送了什么&#xff0c;看了下网上的大多数文章都感觉不太全&#xff0c;所以这里梳理了比较全的流程&#xff0c;如果有误&#xff0c;欢迎评论指正。本文大致是从以下内容概览入手&#xff0c;有需要的可以跳转到感兴趣…

初识C++(三)构造函数和析构函数

目录 一、构造函数&#xff1a; 1.构造函数的概念&#xff1a; 2.构造函数的特性&#xff1a; 3.构造函数的形式&#xff1a; 4.为什么要引出构造函数这一概念 5.默认构造函数包括&#xff1a; 6.对默认生成的构造函数不处理内置类型的成员这事的解决办法&#xff1a; …

docker可视化界面 - portainer安装

目录 一、官方安装说明 二、安装portainer 2.1拉取镜像 2.2运行portainer容器 2.3登录和使用portainer 一、官方安装说明&#xff1a; Install PortainerChoose to install Portainer Business Edition or Portainer Community Edition.https://www.portainer.io/install…

stm32待机模式被意外唤醒之原因分析

1. 故障现象 客户在项目中使用 STM32G0B1, 由产品内置电池供电. 客户在程序中有使用到 standby 模式, 通过 WKUP2(PC13), WKUP6 引脚唤醒. 除此之外并没有其它唤醒源. 代码中有使用到 RTC,但只是用来记录日期和时间, 并没有参与 standby 的唤醒. 有两种故障现象 : 第一种 : …

Typora结合PicGo + Github搭建个人图床

目录 一 、GitHub仓库设置 1、新建仓库 2、创建Token 并复制保存 二、PicGo客户端配置 1、下载 & 安装 2、配置图床 三、Typora配置 一 、GitHub仓库设置 1、新建仓库 点击主页右上角的 号创建 New repository 填写仓库信息 2、创建Token 并复制保存 点击右上角…