我是靠谱客的博主 可爱河马,最近开发中收集的这篇文章主要介绍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菜单

324619ae995a043bc12bde7d078becb8.gif

simulinklinearmeun.png (22.5 KB, 下载次数: 13)

2014-4-6 13:18 上传

324619ae995a043bc12bde7d078becb8.gif

simulinklineartool.png (21.52 KB, 下载次数: 13)

2014-4-6 13:18 上传

324619ae995a043bc12bde7d078becb8.gif

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框图,大家可以点击这里下载

499e06954e472d6fa8bfc041fe26e10e.gif

2014-4-6 13:58 上传

点击文件名下载附件

下载积分: 贝壳 -1

324619ae995a043bc12bde7d078becb8.gif

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

324619ae995a043bc12bde7d078becb8.gif

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的敏感性

324619ae995a043bc12bde7d078becb8.gif

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)复制代码

324619ae995a043bc12bde7d078becb8.gif

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模型线性化方法讨论所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部