matlab函数的线性化,[原创]非线性Simulink模型线性化方法讨论
做控制器设计的用户,一般都需要,分析在特定状态点下的系统频率、性能、品质等相关指标。然后对大型Simulink模型,如何得到对应状态点的线性模型,是进行相关分析的首要条件。Simulink中提供了多种方法进行模型线性化,现在逐一讨论。
Simulink基本库提供了四个函数
(1)linmod:连续系统线性化,先将模型中每个模块线性化,然后组装成一个大的传递函数(状态空间)
(2)linmod2:连续系统线性化,通过扰动输入和状态的方法计算线化模型,并通过一定算法保证误差。
(3)linmodv5:连续系统线性化,MATLAB R5.3之前使用的线化算法,整个模型扰动算法。
(4)dlinmod:离散系统线性化,允许包含连续模块。
由于linmod线化模型精度最高,因此通常使用linmod,相信很多人也只用过或者只会用linmod。另外这四个函数只能通过顶层inport和outport端口,指定线化的起始点和重点,对于复杂模型是相当不利的。
四个函数的基本调用形式基本一致
argout = linmod('sys');
argout = linmod('sys',x,u);
argout = linmod('sys', x, u, para);
argout = linmod('sys', x, u, 'v5');
argout = linmod('sys', x, u, para, 'v5');
argout = linmod('sys', x, u, para, xpert, upert, 'v5');
sys:simulink的名称,不包含扩展名
x:模块中所有状态变量值
u:模块中所有输入端口值
para:线化的相关参数,1*3的数组,其中para(2)表示线化对应的仿真时刻
xpert和upert:用来指定扰动上下边界,现在一般不推荐使用扰动算法
虽然看linmod函数调用很简单,但是对复杂的线性化很麻烦,特别是需要指定线化状态点的时候:
(1)u,输入端口值一般相对容易指定
(2)x,状态变量就不容易给定了,x每一位对应哪个状态,好像没有一点的概念呀
(3)para(2),线性化仿真时刻,这个有时是必要的
simulink提供三种方法获取状态点
(1)一般线化的时候,先对模型进行配平到稳定状态,然后再线化,配平可以使用trim函数
(2)x = Simulink.BlockDiagram.getInitialState('sys'),这个函数可以获取模型的状态变量
>> x = Simulink.BlockDiagram.getInitialState('scdcascade')
x =
time: 0
signals: [1x4 struct] % 总共有4个模块包含状态变量
>> x.signals(1)
ans =
values: [0 0 0] % 第一个模块包含三个状态变量,初始取值为[0 0 0]
dimensions: 3
label: 'CSTATE'
blockName: 'scdcascade/G1/Internal'
stateName: ''
inReferencedModel: 0
sampleTime: [0 0]复制代码(3)[sizes,x0,xname]=modelname(),这样也可以获取模型的状态变量,该方法只能用于获取所有状态变量具有统一类型,否则只能使用(2)中的方法。
sizes =
6 % 总共有个连续状态
0
0
0
0
0
3
x0 =
0 % 第一个状态变量取值0,对应 'scdcascade/G1/Internal'
0 % 第二个状态变量取值0,对应 'scdcascade/G1/Internal'
0
0
0
0
xname =
'scdcascade/G1/Internal'
'scdcascade/G1/Internal'
'scdcascade/G1/Internal'
'scdcascade/C1/Integrator'
'scdcascade/G2/Internal'
'scdcascade/C2/Integrator'复制代码Simulink Control Design提供了两个函数一个界面
Simulink Control Design是控制系统设计工具箱的Simulink扩展,主要完成Simulink控制系统的操作点计算、模型线性化、频率响应估计、控制器设计(PID调节等)
(1)linsys = linearize(sys,op,io,options)
(2)sllin = slLinearizer(mdl,pt,op,param,blocksub,opt)
(3)Simulink图形用户界面,通过右键菜单或者Analysis菜单
simulinklinearmeun.png (22.5 KB, 下载次数: 13)
2014-4-6 13:18 上传
simulinklineartool.png (21.52 KB, 下载次数: 13)
2014-4-6 13:18 上传
linearanalysistool.png (75.24 KB, 下载次数: 18)
2014-4-6 13:22 上传
使用GUI界面的形式进行模型线化相对简单,大家可以稍微摸索下就会熟悉工具。另外线化工具中可能涉及一些控制系统的专业术语,所以不打算详解介绍哈。
linearize和slLinearizer比较
使用过Simulink Control Design的网友,可以仔细比较linearize和slLinearizer,您会发现很多工作两个函数都可以完成。既然有了linearize,MathWorks为什么还提供第二个线化函数slLinearizer呢?
slLinearizer正如其名Batch Linearization,因此最大的优势就是一次性可以获取系统多个线性化传递函数,不需要重复编译模型。而linearize每次只能获取一个输入输出端口的想换模型。下面主要介绍slLinearizer函数使用方法哈,至于linearize基本相似。
sllin = slLinearizer(mdl)
sllin = slLinearizer(mdl,pt)
sllin = slLinearizer(mdl,param)
sllin = slLinearizer(mdl,op)
sllin = slLinearizer(mdl,blocksub)
sllin = slLinearizer(mdl,opt)
sllin = slLinearizer(mdl,pt,op,param,blocksub,opt)
slLinearizer进行线化分析
首先建立一个简单的Simulink框图,大家可以点击这里下载
2014-4-6 13:58 上传
点击文件名下载附件
下载积分: 贝壳 -1
。
simulinklineardemo.png (10.17 KB, 下载次数: 17)
2014-4-6 13:57 上传
第一步为上面的Simulink模型创建一个slLinearizer对象
>> sllin=slLinearizer('SimpleLinearizerDemo')
slLinearizer linearization interface for "SimpleLinearizerDemo":
No analysis points. Use addPoint to add new points.
No permanent openings. Use addOpening to add new permanent openings.
Properties with dot notation get/set access:
Parameters : []
OperatingPoints : [] (model initial condition will be used.)
BlockSubstitutions : []
Options : [1x1 linearize.LinearizeOptions]复制代码一旦线化对象创建完毕以后,就可以设置输入输出分析点,和linearize一个较大的区别就是,slLinearizer可以更加自由添加分析点,您并不需要指定哪个是输入、哪个是输出、开环还是闭环等。
分析点,可以是模块名称、端口编号、信号名称等,比如下面添加4个分析点
>> addPoint(sllin,{'r','e','u','y'})
>> sllin
slLinearizer linearization interface for "SimpleLinearizerDemo":
4 Analysis points:
--------------------------
Point 1:
- Block: SimpleLinearizerDemo/ref
- Port: 1
- Signal Name: r
Point 2:
- Block: SimpleLinearizerDemo/Sum
- Port: 1
- Signal Name: e
Point 3:
- Block: SimpleLinearizerDemo/controller
- Port: 1
- Signal Name: u
Point 4:
- Block: SimpleLinearizerDemo/plant
- Port: 1
- Signal Name: y
No permanent openings. Use addOpening to add new permanent openings.
Properties with dot notation get/set access:
Parameters : []
OperatingPoints : [] (model initial condition will be used.)
BlockSubstitutions : []
Options : [1x1 linearize.LinearizeOptions]复制代码此时,可以通过get*系列函数,获取不同分析点之间的传递函数:
getIOTransfer
getLoopTransfer
getSensitivity
getCompSensitivity
比如,我们想获取从输入r到输出y之间的传递函数,可以使用getIOTransfer
getiotransfer_r2y.png (3.62 KB, 下载次数: 11)
2014-4-6 14:04 上传
>> sys_uy=getIOTransfer(sllin,'r','y');
>> tf(sys_uy)
ans =
From input "r" to output "y":
1.2
-----
s + 2
% 下面使用手动计算结果进行验证下,结果是完全一致的。
>> feedback(2*tf([3],[5 4]),1)
ans =
6
--------
5 s + 10
Continuous-time transfer function.复制代码在比如,我们想分析输入信号u的敏感性
getsensitivity1.png (3.87 KB, 下载次数: 17)
2014-4-6 14:04 上传
>> tf(getSensitivity(sllin,'u'))
ans =
From input "u" to output "u":
s + 0.8
-------
s + 2
Continuous-time transfer function.
% 使用手工计算进行验证,表明结果是正确的
>> feedback(1,2*tf(3,[5 4]))
ans =
5 s + 4
--------
5 s + 10
Continuous-time transfer function.复制代码Simulink只在第一次调用get*函数的时候编译一次模型,之后直接调用sllin对象进行计算即可。
slLinearizer 批量线性化
由于slLinearizer的天身丽质,使得它能够根据不同的操作点和模块参数,批量线性化多个传递函数。比如,我们想得到增益取不同值时的线化模型,您仅仅需要如下两步。
将模块增益修改为变量K,然后在工作空间随便给K赋值,接着输入如下命令:
>> param(1).Name='K';
>> param(1).Value=[1 2 3 4 5];
>> sllin.Parameters=param;
>> sys=getIOTransfer(sllin,'r','y');
>> step(sys)复制代码
linearstep.png (10.16 KB, 下载次数: 10)
2014-4-6 13:57 上传
如果您还想进行不同端口之间的批量线性化,slLinearizer 照样可以胜任,具体步骤你可以参考Vary Operating Points and Obtain Multiple Transfer Functions Using slLinearizer。
matlab函数的线性化,[原创]非线性Simulink模型线性化方法讨论相关推荐
- 【Matlab 控制】批量修改大型 Simulink 模型中模块的属性
批量修改大型 Simulink 模型中模块的属性 一.通过Simulink自带的搜索 二.通过命令行进行搜索替换 三.使用Model Explorer编辑属性 在大型Simulink建模中,需要进行某 ...
- F-16飞行器非线性Simulink模型
最近一直在调试F16战斗机的Simulink模型,希望能简单整理出一份参考资料,分享一下. 需要模型的请点击下载链接,通过积分获取 https://download.csdn.net/download ...
- AVL Cruise和MATLAB DLL联合仿真时快速生成Simulink模型的方法
最近在做本科毕业设计,需要用到AVL Cruise软件和MATLAB Simulink软件进行DLL模式下的联合仿真,在建立模型时,要求Cruise里的信号名称和Simulink模型里的输入输出的 ...
- matlab里的仿真模型块,搭建simulink模型(如何利用MATLAB/SIMULINK搭建简单的仿真模型)...
如何利用MATLAB/SIMULINK搭建简单的仿真模型 安装完MATLAB软件后,在电脑桌面点击MATLAB快捷方式 打开MATLAB后,点击Simulink Library按钮 之后会进入Simu ...
- 【转】matlab函数编译成dll供Cpp调用的方法
转自:https://www.cnblogs.com/vincenzo/archive/2009/09/09/1563467.html 以前做过matlab7与c++的混合编程:将m函数编译成dll给 ...
- matlab将cpp编译为dll,Matlab函数编译成dll供Cpp调用的方法图解教程
曾经实现过将matlab函数编译成dll供Cpp调用,这篇文章的目的是对新增的面向对象的的扩展mwArray进行讲解,matlab很容易和C/C++联合起来使用. 以前做过matlab7与c++的混合 ...
- MATLAB R2020a导出低版本的simulink模型
在小组作业中遇到的问题,高版本matlab导出的.slx文件低版本matlab不能用,看了很多回答都是设置simulink预设但是效果不好,最后发现导出时选择以往版本,可以非常简单地从源头解决问题. ...
- 移花接木,玩转CANoe的几种扩展接口应用(六)——Matlab/Simulink模型
文章目录 前言 Matlab/Simulink模型 连接方法 配置方法 调用方法 分析和应用 总结 前言 见<移花接木,玩转CANoe的几种扩展接口应用(一)--便携式接口设备> 见< ...
- MAB建模规范-Simulink模型建模规范
规则ID:db.jm.hd.ar被用于Ver 1.0的规范.na和jc用于从版本2.0到现在创建的规范 NA-MAAB代表北美和欧洲.J-MAAB代表日本 目录 Simulink Configurat ...
- 计算地球上两点距离(震中距)的Matlab函数(兼容度数和度分秒)及另外三种方法
目录 写在前面 方法1: taup 方法2: ObsPy 方法3: Mapping Toolbox的distance函数 方法4: 自己写的Matlab函数 参数 公式 函数 写在前面 最近要计算震中 ...
最新文章
- Python使用QRCode模块生成二维码
- Stream流中的常用方法_filter
- 《四世同堂》金句摘抄(三)
- 对未标记为可安全执行的脚本_三、??XSS跨站脚本攻击
- 数据库连接,实现增删改查操作具体步骤(全)
- 中国百亿富人达315位:马云身价超3千亿,每小时净赚超上市公司高管年薪
- vue怎么自己创建组件并引用_如何在组件库项目内直接引用vue-cli生成的组件库文件...
- JSP中文件上传的关键步骤
- linux如何自定义桌面,如何自定义 GNOME 3 桌面? | Linux 中国
- 为什么四大文明古国到现在只剩中国了
- 浪客云黑-自助收录网站源码
- HTML5_CSS入门(内部样式、外部样式、内联样式、选择器)
- 【CSS】内联样式,内部样式表,外部样式表
- 网盘可以做网站服务器吗,做网站用虚拟主机好还是云服务器好
- VS2010完美卸载
- 单月抖音涨粉500万,挑战类网红玲爷的另类打法
- Sql2005安装错误:1406
- Charles 乱码问题解决
- 巧用MOS管的体二极管
- AutoCAD怎么自定义线型
热门文章
- SSH实战 第四天 代码
- 网页播放rtsp视频流最终方案
- IE8中text-align:center偏左的解决办法
- 安卓 运行 linux 桌面,安卓上运行原生Xorg和Linux桌面记录[完结]
- python 技能系统
- 复杂网络——活跃度驱动模型(activity-driven model)原理及算法实现
- ExtJs4(3)——带搜索和操作按钮的表
- matlab取商,MATLAB-MTSP 遗传算法解决5种多旅行商问题(mtsp)的matlab程序 联合开发网 - pudn.com...
- Tensorrt7踩坑记录
- 该如何彻底删除电脑上的软件卸载残留文件?