基於Simulink的簡單時滯微分方程組仿真



  今天學習了一些基於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 王飛


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM