06-07 静态非线性环节
下面给大家介绍
静态非线性环节的建模方法
对非线性系统来说
我们可以直接采用
非线性的模块来进行建模
但是以前也给大家指出了
现有的非线性模块局限性还是很大的
所以这里我们考虑一下
静态的非线性模块
怎么来进行一般的建模
比如说
单值非线性应该怎么来处理
另外
多值非线性应该怎么来处理
下面我们通过例子来演示
在演示之前我们先看一下
在Simulink里
提供了哪些非线性模块
比如说
在非线性里有一个Discontinuity
这样一个组
这个组里提供了
这里列出的一些模块
包括饱和非线性
包括死区非线性
包括一些继电环节等等
回环的非线性
当然这些对控制系统建模来说
是远远不够的
其实我们还可以通过
其他的一些模块
比如说查表模块等等
构建出来一些其他形式的非线性
我们这里将介绍一种通用的方法
来搭建任意的静态非线性
这样一个具体的实现方法
我们先看一下
单值非线性环节
在数学上可以写成这样
也就是
有一个输入信号u的值
就可以计算出来y的值
通常我们需要描述一些
分段线性的非线性函数
这样一个一般的
分段线性的非线性函数
怎么来用Simulink
把它表示出来呢？
其实刚才我提到的
饱和非线性死区非线性等等
都是这类非线性的特例
现在我们看一下
一般的单值非线性应该如何来描述
怎么来描述呢？
我们需要把现有的
这些转折点读出来
有了这些转折点
我就可以构造出来
一个x向量一个y向量
除了这些转折点之外
我们还应该把最外头
这两条线再延展一下
再测出来其中两个点
比如说在这个延长线上
测出来这个点的值
我们把它称为x0和y0
另外在这个延长线上
也测出了一个点
把它命名为x_(n+1)和y_(n+1)
这样我就可以构造一个
完整的向量
延长线上这个点
可以任意的选择位置
有了这样一个x向量和y向量
我就可以调用
一维查表模块
把这样的一些信息
输入给查表模块
就可以构造出来
任意的分段线性的非线性模块
下面我们看一个例子
假设我想用模块
实现一个这样的非线性环节
这个怎么做呢？
我需要在已知的折线上
读出来关键点的信息
比如说
这个点横坐标是-2
纵坐标是-1.5
这个点横坐标是-2
纵坐标是1.2
所以我需要把这样一些点
相应的信息都赋给计算机
除了这个以外
我们还应该在延长线上
再选择两个点
比如说
这个点的值和这个点的值
通过这种方式
我们可以生成一个x向量和y向量
但是对于具体问题而言
我们发现这个段落
是一个完全垂直向上的一个折线
怎么来描述这样一个线
这个本身不是一个单值函数
而是一个多值函数
也就是当x等于-2的时候
y有多个值和它对应
所以在实现中
我们不能把x向量写成
-3 -2 -2这样的形式
我们应该在这个点处
加一个偏移量
所以写成-3 -2 -2
加上一个很小的值
这个点描述出来
再描述这个点的X值
然后再描述这个点的函数值
这个点的函数值
通过这样的方式
就把xx这个向量描述出来了
同样的我们把相应的y值描述出来
Y在垂直向上的线上
没有必要做特殊的处理
只需把相应的两个值写上来就可以了
所以现在我就可以
在MATLAB环境里输入这两个变量
一个是xx一个是yy
把这两个向量先输入给计算机
然后我就可以考虑
来做这样一个建模处理
怎么做呢？
还是打开Simulink
一个空白的窗口
然后打开模块库
在模块库里选择Lookup Tables
这个选项
然后把一维表格
这样一个模块
移到模块窗口里
现在我双击一下这个模块
然后我就可以把刚才输入的
转折点信息xx放到这来
yy放到这个地方
再按下确认
这样就建立起来
我们期望的非线性模块了
大家可以看一下
这个模块和我们图中描述的
是完全一致的
所以通过这样的方法
可以看出来
任意的单值非线性模块
都可以用这里给出的
查表模块建立起来
只需你把转折点的信息填进去
就可以把这个模块建立起来
在处理的时候要注意
如果有直上直下的这样的线
你需要对横坐标
做一个偏移的处理
这样就可以把原来的
任意单值非线性
直接描述出来
除了单值非线性之外
在实际应用中
还可能有很多其他的形式
比如说多值非线性
也就是
假如有这样一个非线性环节
如何来理解一个
这样的非线性环节呢？
如果这个模块
受输入信号的激励
它的输出应该怎么计算呢？
如果输入信号要增加的时候
输出信号需要按这样一个线
来计算输出
如果输入信号要是减小的话
需要按这样的线去计算
所以这样我们可以考虑
把原始的双值非线性
分解成两个单值的非线性
比如说
把这样一个双值的非线性
分解成这样
两个单值非线性
一个是输入信号上升的时候
我通过这个函数
来计算输出信号
当输入信号下降的时候
通过这样一个非线性
来计算输出信号
所以现在比较关键的一步
你可能会要问
怎么来判定输入信号
在上升还是在下降
怎么判定呢？
我们可以调用一个Memory模块
这个模块
是在离散模块这个组里提供的
这个模块的作用是
假设是有一个信号
接了Memory模块
它的输出结果
这是输入信号上一个时刻的值
我现在就可以比较了
信号的当前值和它的上一个值
进行比较
看看大于等于这个条件
是不是成立
如果这个条件成立
就说明这个信号
比这个信号要大
也就是说
当前信号大于前一个信号
换句话说
就是输入信号在上升
所以用这个信号去控制开关
去选择这样两个单值非线性
就可以很容易的
把多值非线性
这样一个环节建立起来
这个是我事先建立好的
这样一个模块
假设有一个输入信号
我把两个单值非线性
先描述出来
一个是上升段的
一个是下降段的
然后把这两个信号
都赋给这个开关
怎么来控制开关
到底选择上面一路
还是下面一路
我这里加了一个开关量
也就是判定一下
输入信号是不是大于
前一个时刻的信号
如果这个条件要是成立的话
会控制上一路信号导通
下一路信号关闭
所以按照这个分支
去计算输出的值
如果这个条件不满足
也就是输入信号在减小
那么我们使得下一路导通
通过这样一个表达式
最后把输出信号计算出来
所以通过这样的形式
我们就可以很容易地
把双值非线性环节实现出来
好
现在我们看一个例子
假设这有一个二阶的系统
我把它分别表示成这样的形式
一个积分器后边
有一个一阶的惯性环节
把它两个串联起来
在前面我放了一个
刚才定义的回环非线性
是用Simulink来描述
就是这样一个形式
后边是这两个线性环节
通过这样的方式
我就可以构造出来一个
闭环系统的仿真框图
由这个框图我就可以
把x1和x2这两个信号
提取出来赋给输出端
这也是一个仿真的最终的框图
有了这样一个框图
我就可以由下面的命令
去启动仿真过程
然后把输出曲线绘制出来
这个输出曲线
就是原来状态方程的两个状态
所以我可以给出来
下面的命令来进行仿真
这样得出来的就是
最终的仿真结果
其中蓝色线是x1
红色线是x2
从这个曲线
我们看不出来太多的结果
所以对这类问题来说
我们还是需要画一下
相应的相平面图
也就是把x1作为一个轴
把x2作为另一个轴
来画二维曲线
这样的工作
可以由下面语句直接实现
这样得到的
就是这里给出的仿真结果
整个系统从初值开始出发
一直减小减小减小到一个封闭的回路上
仿真就结束了
这个封闭的回路
就是微分方程中
常用的极限环
所以我们可以用这里的仿真方法
来研究非线性系统的极限环
这一部分给大家介绍了
非线性模块的搭建方法
为什么要介绍这样的方法
是因为Simulink
现有的非线性模块比较有限
所以我们考虑
搭建单值或者多值的
分段线性的静态非线性模块
对单值模型
我们只需把转折点找出来
构成向量
然后我们把它赋给查表模块
最后就可以把非线性构造出来
这里还通过例子给大家介绍了
如果某一个线段要是直上直下的
应该怎么来处理
对多值非线性
我们应该把它拆分成
多个单值的非线性
然后再判断一下
信号是在上升还是在下降
通过开关模块选择合适的分支
最后构造出来
多值非线性的模块
从这里给出的例子可以看出来
通过这样的方法
我们可以处理任意复杂的
静态非线性模型
我们还利用这样一个模型
研究了一个非线性系统的极限环
这一部分就给大家介绍到这