基于Simulink的简单时滞微分方程组仿真 您所在的位置:网站首页 simulink延迟环节模块 基于Simulink的简单时滞微分方程组仿真

基于Simulink的简单时滞微分方程组仿真

2024-06-12 21:30| 来源: 网络整理| 查看: 265

  今天学习了一些基于Simulink的简单时滞微分方程组仿真,主要用到的模块是“Variable Time Delay”,从效果上来看,目前可以实现一般的时变时滞和中立时滞系统的仿真,但是分布式时滞还不能实现。相对于之前的无时滞的情形,考虑时滞在模块搭建上只需要添加一个时滞的影响,我们还是以例子说话,考虑如下的带有时滞的神经网络系统: $$\dot{x}(t)=-Ax(t)+Bf(x(t))+Cf(x(t-\tau(t))),$$其中,$x(t)=[x_{1}(t),x_{2}(t)]^{T}$,$A=I_{2}$,$f(\cdot)=tanh(\cdot)$,$\tau(t)=1+0.1\sin(t)$,$B=\left[ \begin{matrix} 2 & -0.1\ -5 & 3 \end{matrix} \right]$, $C=\left[ \begin{matrix} -1.5 & -0.1\ -0.2 & -2.5 \end{matrix} \right]$.   如果不考虑最后一项,很容易用下面的框图得到结果:

  这里“Matlab Function”模块代码为:

function y = fcn(u) y=u; A=-eye(2); B=[2 -0.1;-5 3]; y=[A*u+B*tanh(u)];

  相比于之前的代码,这里多了个“Scope”模块,这个模块可以比较方便看到状态图,但是不能直接做出相图,设置好积分器的初值为“[0.1;0.1]”之后,保存此框图,命名为“test2”,双击“Scope”模块,得到下图:

  点击菜单栏的绿色运行按钮,得到下图即为系统状态随时间的变化:   下面我们考虑最后一项的时滞影响,直接上图再解释吧:   将菜单栏的运行时间长度设置成100,保存,再双击“Scope”模块,点击菜单栏的绿色运行按钮,得到下图即为系统状态随时间的变化:   对于上面的模块,我们做一些说明。对比没有时滞的框图,这里看上去要复杂很多,但是,我们还可以看到一条主要的反馈,即积分器前后。由于有了时滞,我们必须把时滞那一项单独处理,所以在积分器前面有个模块“Add”,顾名思义,这个模块是加法模块,将输入的两个信号相加,再看一下咱们的模型,可拆分为有时滞的和无时滞的两个部分,所以,大家可以想到,上面的那根线是无时滞的,下面的那根线是有时滞的,在这里,上面的模块“Matlab Function”里的代码是:

function y = fcn(u) y=u; A=-eye(2); B=[2 -0.1;-5 3]; y=[A*u+B*tanh(u)];

  这一部分就解决了前面两项没有时滞的部分,下面仔细看看时滞怎么处理的。积分器输出的信号是系统的状态,我们可以看到,这个状态传送到了“Variable Time Delay”模块,这个模块有两个输入一个输出,我们假设上面的输入是"u(t)",下面的输入是"To(t)",那么它的输出就是“u(t-To(t))”,这里需要输入的“u(t)”直接就是系统的状态,所以留给我们的任务是“To(t)”该怎么设计。我们可以看到,下面的输入来自一个“Matlab Function2”模块,而“Matlab Function2”模块的输入是一个“Clock”模块,这里“Clock”模块的没有输入,只有输出,它输出当前的仿真时刻,即“t”的值,这里的“Matlab Function2”模块则是时变延迟的表达式,代码如下:

function y = fcn(u) y=1+0.1*sin(u);

  这样逐个解释之后,大家应该能明白,咱们的“Variable Time Delay”模块输出的结果就是“$x(t-\tau(t))$”,我们将这个数据输入到“Matlab Function1”模块,能猜到“Matlab Function1”模块的代码吗?这个模块的输出和上面无时滞的汇合就是咱们整个系统的表达式,所以“Matlab Function1”模块的代码如下:

function y = fcn(u) y=u; C=[-1.5 -0.1;-0.2 -2.5]; y=C*tanh(u);

  以上就是本框图的所有解释,为了得到相图,咱们还是像之前一样,写个m文件,读取输出数据,看看混沌行为,m文件和相图如下:

clear all; clc; [t,x]=sim('test2',[0,150]); plot(x(:,1),x(:,2),'b'); xlabel('x_{1}(t)'); ylabel('x_{2}(t)');

  本文一开始提及,利用这些模块,我们可以处理中立时滞的微分方程组,事实上,中立时滞即时滞出现在导数项里面,也就是系统包含“$\dot{x}(t-\tau(t))$”这样的项,只要大家真的能将前面的框图和微分方程组对应起来,那就应该不难发现,积分器的输入数据就是系统状态导数的信息,积分器的输出数据就是系统的状态信息,因此,为了处理中立时滞,咱们只要在积分器前加一个反馈再处理时滞即可,以后找到合适的例子再补充。   咱们这里考虑的例子都是可以直接写成矩阵、向量形式的例子,事实上,如果无法写成这种形式(比如时滞只出现第一个分量,其余分量无时滞)的情况,咱们只需要借助“Bus Creator”模块即可,这个模块可以将整个系统拆分成一个个分量去输入,最后输出细节的处理大家可以自己探索一下。   这两天学了点simulink的皮毛,感觉这个对于没有基础的学生来说比敲代码要简单,脉冲控制和采样控制好像也是可以做的,后面我再摸索摸索,但是处理一些复杂情况比如分布式时滞、事件触发等我就不知道靠搭建这些方块行不行了,是不是必须得敲代码,以后再慢慢探索。我写这些博文只是为了实现自己想要实现的部分功能,怎么好理解怎么实现,并不一定是最简单的,但一定是对我来说最好理解的。总的来说,还是比较有意思的。

2019.10.20 王飞



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有