概述
做控制器设计的用户,一般都需要,分析在特定状态点下的系统频率、性能、品质等相关指标。然后对大型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模型线性化方法讨论所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复