做控制器设计的用户,一般都需要,分析在特定状态点下的系统频率、性能、品质等相关指标。然后对大型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模型线性化方法讨论相关推荐

  1. 【Matlab 控制】批量修改大型 Simulink 模型中模块的属性

    批量修改大型 Simulink 模型中模块的属性 一.通过Simulink自带的搜索 二.通过命令行进行搜索替换 三.使用Model Explorer编辑属性 在大型Simulink建模中,需要进行某 ...

  2. F-16飞行器非线性Simulink模型

    最近一直在调试F16战斗机的Simulink模型,希望能简单整理出一份参考资料,分享一下. 需要模型的请点击下载链接,通过积分获取 https://download.csdn.net/download ...

  3. AVL Cruise和MATLAB DLL联合仿真时快速生成Simulink模型的方法

      最近在做本科毕业设计,需要用到AVL Cruise软件和MATLAB Simulink软件进行DLL模式下的联合仿真,在建立模型时,要求Cruise里的信号名称和Simulink模型里的输入输出的 ...

  4. matlab里的仿真模型块,搭建simulink模型(如何利用MATLAB/SIMULINK搭建简单的仿真模型)...

    如何利用MATLAB/SIMULINK搭建简单的仿真模型 安装完MATLAB软件后,在电脑桌面点击MATLAB快捷方式 打开MATLAB后,点击Simulink Library按钮 之后会进入Simu ...

  5. 【转】matlab函数编译成dll供Cpp调用的方法

    转自:https://www.cnblogs.com/vincenzo/archive/2009/09/09/1563467.html 以前做过matlab7与c++的混合编程:将m函数编译成dll给 ...

  6. matlab将cpp编译为dll,Matlab函数编译成dll供Cpp调用的方法图解教程

    曾经实现过将matlab函数编译成dll供Cpp调用,这篇文章的目的是对新增的面向对象的的扩展mwArray进行讲解,matlab很容易和C/C++联合起来使用. 以前做过matlab7与c++的混合 ...

  7. MATLAB R2020a导出低版本的simulink模型

    在小组作业中遇到的问题,高版本matlab导出的.slx文件低版本matlab不能用,看了很多回答都是设置simulink预设但是效果不好,最后发现导出时选择以往版本,可以非常简单地从源头解决问题. ...

  8. 移花接木,玩转CANoe的几种扩展接口应用(六)——Matlab/Simulink模型

    文章目录 前言 Matlab/Simulink模型 连接方法 配置方法 调用方法 分析和应用 总结 前言 见<移花接木,玩转CANoe的几种扩展接口应用(一)--便携式接口设备> 见< ...

  9. MAB建模规范-Simulink模型建模规范

    规则ID:db.jm.hd.ar被用于Ver 1.0的规范.na和jc用于从版本2.0到现在创建的规范 NA-MAAB代表北美和欧洲.J-MAAB代表日本 目录 Simulink Configurat ...

  10. 计算地球上两点距离(震中距)的Matlab函数(兼容度数和度分秒)及另外三种方法

    目录 写在前面 方法1: taup 方法2: ObsPy 方法3: Mapping Toolbox的distance函数 方法4: 自己写的Matlab函数 参数 公式 函数 写在前面 最近要计算震中 ...

最新文章

  1. Python使用QRCode模块生成二维码
  2. Stream流中的常用方法_filter
  3. 《四世同堂》金句摘抄(三)
  4. 对未标记为可安全执行的脚本_三、??XSS跨站脚本攻击
  5. 数据库连接,实现增删改查操作具体步骤(全)
  6. 中国百亿富人达315位:马云身价超3千亿,每小时净赚超上市公司高管年薪
  7. vue怎么自己创建组件并引用_如何在组件库项目内直接引用vue-cli生成的组件库文件...
  8. JSP中文件上传的关键步骤
  9. linux如何自定义桌面,如何自定义 GNOME 3 桌面? | Linux 中国
  10. 为什么四大文明古国到现在只剩中国了
  11. 浪客云黑-自助收录网站源码
  12. HTML5_CSS入门(内部样式、外部样式、内联样式、选择器)
  13. 【CSS】内联样式,内部样式表,外部样式表
  14. 网盘可以做网站服务器吗,做网站用虚拟主机好还是云服务器好
  15. VS2010完美卸载
  16. 单月抖音涨粉500万,挑战类网红玲爷的另类打法
  17. Sql2005安装错误:1406
  18. Charles 乱码问题解决
  19. 巧用MOS管的体二极管
  20. AutoCAD怎么自定义线型

热门文章

  1. SSH实战 第四天 代码
  2. 网页播放rtsp视频流最终方案
  3. IE8中text-align:center偏左的解决办法
  4. 安卓 运行 linux 桌面,安卓上运行原生Xorg和Linux桌面记录[完结]
  5. python 技能系统
  6. 复杂网络——活跃度驱动模型(activity-driven model)原理及算法实现
  7. ExtJs4(3)——带搜索和操作按钮的表
  8. matlab取商,MATLAB-MTSP 遗传算法解决5种多旅行商问题(mtsp)的matlab程序 联合开发网 - pudn.com...
  9. Tensorrt7踩坑记录
  10. 该如何彻底删除电脑上的软件卸载残留文件?