MATLAB仿真學習課件_第1頁
MATLAB仿真學習課件_第2頁
MATLAB仿真學習課件_第3頁
MATLAB仿真學習課件_第4頁
MATLAB仿真學習課件_第5頁
已閱讀5頁,還剩112頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第二講MATLAB仿真教學目標:學會用MATLAB進行仿真,包括編程仿真和SIMULINK仿真。

MATLAB程序設計

MATLAB編程仿真

Simulink仿真

第二章主要內容matlab的演示功能

demo

在線演示兩種方法進入demo演示

第一部分MATLAB程序設計MATLAB的兩種工作方式:M文件的兩種形式:一、M文件簡介(1)命令窗口的指令方式(2)M文件形式(1)腳本文件;(2)函數文件(1)for…end語句調用形式:

forv=表達式語句1;

…語句n;

end二、程序控制流語句例:

k=1:10;x=k.^2;x=149162536496481100fork=1:10

x(k)=k.^2;end(2)while…end語句調用形式:

whilev=表達式語句1;

…語句n;

end“if”調用形式:

if表達式語句段1;else語句段2;

end(3)條件分支結構“if”、“break”、“switch”“break”語句一般出現(xiàn)在循環(huán)體中,它表示跳出循環(huán)。Switch開關表達式:

case表達式1語句,…,語句case{表達式1,表達式2,…}語句,…,語句

…otherwise語句,…,語句end“switch”語句用來實現(xiàn)多重分支結構。用法:四、MATLAB函數編程

1、關鍵字”function“開頭2、函數內部所定義的變量僅在函數內部有效—局部變量3、函數文件的文件名必須和函數名相同例:function[mean,stdev]=stat(x)n=length(x);mean=sum(x)/n;stdev=sqrt(sum((x-mean).^2/n));(1)盡量避免采用循環(huán)語句,可用向量化語句替代(2)對大型數組或矩陣先進行初始化,即用“zeros”或”ones”對矩陣定維,可減少內存分配耗時(3)盡量使用MATLAB內在函數(4)更先進有效的算法五、提高程序執(zhí)行速度的原則

第二部分MATLAB編程仿真時間連續(xù)信號也稱為模擬信號.時間連續(xù)的確定信號在物理上是一個隨時間變化的(電壓或電流)波形。數學上表示為一個時間連續(xù)的函數f(t).時間離散的確定信號數學上表示為確定序列{f(n)}。可使f(t)與{f(n)}一一對應。一、時間連續(xù)信號與系統(tǒng)的計算機仿真滿足取樣定理(1)建立數學模型(2)選擇適合的計算機求解方法解仿真模型(3)編寫MATLAB仿真程序或建立Simulink

模塊方框圖,調試并運行程序(4)得出數值解,分析并確定結果的可靠性連續(xù)信號與系統(tǒng)的計算機仿真步驟:MATLAB編程仿真求解:(1)零狀態(tài)響應:系統(tǒng)在t=-1秒時刻初狀態(tài)為零,輸入信號為階躍信號f(t)=u(t),輸出為電容電壓,試對時間t=[-1,10]秒的輸出信號波形進行仿真求解。

+-f(t)RL+-改寫為標準式并令狀態(tài)變量列出KVL方程:微分方程的MATLAB函數格式是固定的,必須按照MATLAB所規(guī)定格式來編寫.本例中需要將方程參數”R,L,C”傳入.傳入參數前的標志變量

“flag”是必須的,以符合求解函數”ode45”的要求。微分方程的MATLAB函數引導語句格式:

functionxdot=方程函數名(t,x,flag,附加參數)

編寫微分方程組的MATLAB函數functionxdot=funcforex123(t,x,flag,R,L,C)

xdot=zeros(2,1);

xdot(1)=-R/L*x(1)-1/L*x(2)+1/L*f(t);

xdot(2)=1/C*x(1);

functionin=f(t)%輸入信號

in=(t>0)*1;%階躍信號

編寫微分方程組的MATLAB函數%filenameex123.m

L=1;%電感值

C=0.1;%電容值

forR=[1.535]%仿真電阻值分別為1.5,3,5

[t,x]=ode45(‘funcforex123’,[-1,10],[0;0],[],R,L,C);

figure(1);plot(t,x(:,1));holdon;xlabel(‘timesec’);

text(0.9,0.17,’\leftarrow

i_L(t)’);grid;

figure(2);plot(t,x(:,2));holdon;xlabel(‘timesec’);

text(0.5,0.3,‘\leftarrow

u_C(t)’);grid;

end微分方程組求解:

a電感電流單位階躍響應(零狀態(tài)響應)波形仿真結果b電容電壓單位階躍響應(零狀態(tài)響應)波形仿真結果[t,x]=ode45(方程函數名,仿真時間范圍,狀態(tài)變量初始值,算法選項,附加參數)

MATLAB中微分方程的求解方法有多種。較常用的ode23,ode45和ode15s等。調用方式完全相同,但針對的方程類型不同MATLAB編程仿真求解:(2)零輸入響應:系統(tǒng)在t=-1秒時刻電容電壓為Uc=1V,當t=-1秒時刻信號輸入兩端閉合,試對時間t=[-1,10]秒的輸出信號波形進行仿真求解。

+-f(t)RL+-functionxdot=funcforex123(t,x,flag,R,L,C)

xdot=zeros(2,1);

xdot(1)=-R/L*x(1)-1/L*x(2)+1/L*f(t);

xdot(2)=1/C*x(1);

functionin=f(t)%輸入信號

in=0;

%輸入信號始終為0

編寫微分方程組的MATLAB函數%filenameex123.m

L=1;%電感值

C=0.1;%電容值

forR=[1.535]%仿真電阻值分別為1.5,3,5

[t,x]=ode45(‘funcforex123’,[-1,10],[0;1],[],R,L,C);

figure(1);plot(t,x(:,1));holdon;xlabel(‘timesec’);

text(0.9,0.07,’\leftarrow

i_L(t)’);grid;

figure(2);plot(t,x(:,2));holdon;xlabel(‘timesec’);

text(0.5,0.3,‘\leftarrow

u_C(t)’);grid;

end微分方程組求解:a電感電流零輸入響應波形仿真結果b電容電壓零輸入響應波形仿真結果

MATLAB編程仿真求解:(3)全響應:系統(tǒng)在t=-1秒時刻電容電壓為Uc=1V,輸入信號為階躍信號f(t)=u(t),對時間t=[-1,10]秒的輸出信號波形進行仿真求解+-f(t)RL+-functionxdot=funcforex123(t,x,flag,R,L,C)

xdot=zeros(2,1);

xdot(1)=-R/L*x(1)-1/L*x(2)+1/L*f(t);

xdot(2)=1/C*x(1);

functionin=f(t)%輸入信號

in=(t>0)*1;

%輸入信號為階躍信號

編寫微分方程組的MATLAB函數%filenameex123.m

L=1;%電感值

C=0.1;%電容值

forR=[1.535]%仿真電阻值分別為1.5,3,5

[t,x]=ode45(‘funcforex123’,[-1,10],[0;1],[],R,L,C);

figure(1);plot(t,x(:,1));holdon;xlabel(‘timesec’);

text(0.9,0.07,’\leftarrow

i_L(t)’);grid;

figure(2);plot(t,x(:,2));holdon;xlabel(‘timesec’);

text(0.5,0.3,‘\leftarrow

u_C(t)’);grid;

end微分方程組求解:a電感電流全響應波形仿真結果b電容電壓全響應波形仿真結果

本例演示了對于一個動態(tài)電路瞬態(tài)響應的仿真過程.

對于任何電子電路:

(1)電路理論知識得出數學模型

(2)以MATLAB規(guī)定格式編寫狀態(tài)方程描述函數

(3)選擇合適的求解方式并編寫M文件求解

這也就完成了對電路的仿真.小結:分析:由于輸入沖激信號是超越函數,不適于作數值計算,因此首先求系統(tǒng)的階躍響應,然后對其進行微分得到沖激響應。為了應用差分函數”diff”進行近似微分,首先需要通過插值將被微分的數據在時間上均勻化,然后再利用”diff”進行近似微分,得出系統(tǒng)的沖激響應波形。例:對于上例系統(tǒng),輸出信號從電容電壓取出,仿真計算系統(tǒng)的沖激響應,并與理論值對比?仿真計算步驟:(1)建立數學模型(2)編寫函數文件描述要求解的微分方程(3)求解函數文件所描述的微分方程,得到電容電壓(4)插值得出電容電壓均勻取樣點的輸出波形值——階躍響應(5)“diff”近似微分得出沖激響應波形(6)計算理論值,并對比(1)計算電路中電容電壓的沖激響應的解析解沖激響應解析解:(2)求上例電路中電容電壓的均勻取樣點的輸出波形值(階躍響應),再對該波形微分得到沖激響應,最后與理論值比較。

1、狀態(tài)方程函數程序funcforex123.m如下functionxdot=funcforex123(t,x,flag,R,L,C)

xdot=zeros(2,1);

xdot(1)=-R/L*x(1)-1/L*x(2)+1/L*f(t);

xdot(2)=1/C*x(1);

functionin=f(t)%輸入信號

in=(t>0)*1;

%輸入信號為階躍信號

%filenameex123.m

[t,x]=ode45(‘funcforex123’,[-1,10],[0;0],[],3,1,0.1);

%求解上例電路的階躍響應

ts=0.001;

t1=-1:ts:10;

x1=interp1(t,x(:,2),t1,’spline’);插值得均勻時間采樣點電容電壓波形

plot(t1,x1,’k-.’);%階躍響應波形繪制

holdon;x1dot=[diff([x1])/ts,0];%近似微分得出沖激響應波形

plot(t1,[diff([x1])/ts,0],’k’);xlabel(‘timesec’);

ht=10/sqrt(7.75).*exp(-1.5*t1).*sin(sqrt(7.75)*t1).*(t1>0);

plot(t1(1:50:length(t1)),ht(1:50:length(t1)),’ko’);

legend(‘step

response’,’impluse

response’,’theoretic

impl

useresponse’);

2、主程序ex123b.m如下:

第三部分SIMULINK仿真什么是SIMULINK?SIMULINK是MATLAB中的一個建立系統(tǒng)方框圖和基于方框圖級的系統(tǒng)仿真環(huán)境,是一個對動態(tài)系統(tǒng)進行建模、仿真并對仿真結果進行分析的軟件包。SIMULINK的特點可視化建模仿真結果可近乎“實時”地通過可視化模塊,如示波器模塊、頻譜儀模塊及數據輸入、輸出模塊等顯示出來。附帶大量的專業(yè)仿真模塊庫在通信與電子工程領域,Simulink提供的常用專業(yè)模塊庫有:

(1)CDMA參考庫(2)通信系統(tǒng)模塊庫

(3)DSP模塊庫等SIMULINK仿真步驟:啟動MATLAB,進入simulink模塊庫窗口在simulink窗口單擊菜單項file\new\model,新建一個simulink模型文件在simulink庫中選取所需模塊,拖到新建模型窗口,連接成目標系統(tǒng)各模塊參數設置仿真

第三部分SIMULINK仿真MATLAB命令窗口與simulink的交互將該模型文件存盤為lizil.mdlopenlizil.mdl;sim('lizil.mdl');t=ScopeData.time;signal=ScopeData.signals;wave1=signal(1,1).values;wave2=signal(1,2).values;subplot(2,1,1);plot(t,wave1);subplot(2,1,2);plot(t,wave2);axis([0,20,-2,2]);MATLAB命令窗口與simulink的交互從工作空間中讀入將Simulink中數據送回工作空間測試與MATLAB工作空間進行交互的Simulink模型%pro4lizi2.mclear;T=(0:0.1:20)′;%仿真時間段和步進,為列向量U=(T>5);%在時間為5秒躍變的階躍信號sim(′lizi2.mdl′);%運行仿真lizi2.mdlfigure(1);plot(simout1.time,simout1.signals.values)xlabel(′timesec′)%階躍響應figure(2);plot(simout2.time,simout2.signals.values)xlabel(′timesec′)%沖激響應

Simulink子系統(tǒng)的構造實際建模會遇到一些復雜的系統(tǒng),難以在一張模型方框圖中畫出。這時就需要以層次結構來繪制框圖。也就是首先將大系統(tǒng)中的一些具有獨立功能的部分封裝起來,形成一些子系統(tǒng),然后再利用這些子系統(tǒng)來構成整個系統(tǒng)。Simulink允許構造多層子系統(tǒng),即在子系統(tǒng)中仍然允許包含若干下層子系統(tǒng)。參數設置封裝子系統(tǒng)建立子系統(tǒng)可以方便地構建大型的復雜系統(tǒng),且這些子系統(tǒng)還是可以重用的。然而,上例子系統(tǒng)模型還存在一些缺點:子系統(tǒng)中的參數(如增益G),傳遞函數系數等,是通過MATLAB工作空間傳入的,這就破壞了子系統(tǒng)內部的隱藏性質。為此,Simulink中給出了一種解決辦法,也就是所謂的模塊封裝技術。對子系統(tǒng)封裝以后,它就可以像Simulink模塊庫所提供的模塊一樣來使用,子系統(tǒng)模塊內部的參數可以通過一個設計的對話框來輸入。組建用戶自定義模塊庫如果建立了許多自定義的子系統(tǒng),并且已經封裝好了,而這些已經封裝的自定義模塊又是會反復使用的,就像Simulink提供的模塊庫中那些模塊一樣,在這種情況下,就有必要對這些自定義的重用性較好的模塊進行建庫,以方便管理和反復使用,同時也可以作為新的專業(yè)庫提供給其他用戶使用。S函數與系統(tǒng)方框圖

Simulink進行仿真本質上是用某種求解算法對系統(tǒng)狀態(tài)方程求解的過程。那么,Simulink如何將系統(tǒng)狀態(tài)方程與系統(tǒng)方框圖模型聯(lián)系起來?事實上,Simulink設計了固定格式的S函數接口,通過S函數可將系統(tǒng)的數學方程表達形式與方框圖表達形式聯(lián)系起來。通過編寫和使用S函數可以構建出Simulink普通模塊難以搭建系統(tǒng)模型,Simulink內建的標準模塊庫就是用S函數編寫并進行編譯后形成的。S函數建模和仿真

Simulink仿真的過程:仿真開始時,調用各個模塊的初始化函數進行系統(tǒng)初始化,接著進入仿真階段,反復調用模型中的每一個模塊,即調用這些模塊對應的S函數,對每個模塊執(zhí)行諸如計算輸出、計算連續(xù)函數導數以及計算離散函數的更新值等任務。在仿真結束時,調用終止仿真函數以結束仿真任務。具體某時刻Simulink執(zhí)行什么任務,取決于當時調用S函數時傳入的標志flag的值。MATLAB語言的S函數模板MATLAB語言的S函數編寫方法是固定的,MATLAB提供了標準S函數的模板sfuntmpl.m,文件在\Toolbox\simulink\blocks\目錄下。function[sys,x0,str,ts]=sfuntmpl(t,x,u,flag)switchflag,case0,%初始化部分[sys,x0,str,ts]=mdlInitializeSizes;case1,%計算導數sys=mdlDerivatives(t,x,u);case2,%差分方程遞推更新sys=mdlUpdate(t,x,u);case3,%計算輸出sys=mdlOutputs(t,x,u);case4,%取得下一步仿真的時間sys=mdlGetTimeOfNextVarHit(t,x,u);例:S函數仿真實現(xiàn)連續(xù)濾波器。要仿真的濾波器的傳遞函數為一個單輸入、單輸出的三階線性時不變系統(tǒng),將其狀態(tài)變量設為x1,x2,x3,輸入為u(t),輸出為y(t),根據系統(tǒng)信號流圖有狀態(tài)空間方程:以及輸出方程:

y=4x2矩陣表示為:簡寫為通式:Function[sys,x0,str,ts]=myHsapp(t,x,u,flag)%連續(xù)系統(tǒng)狀態(tài)方程%x′=Ax+Bu,y=Cx+Du%定義A,B,C,D矩陣A=[010;001;-4-6-3];B=[0;0;1];C=[040];D=0;switchflag,case0%flag=0初始化[sys,x0,str,ts]=mdlInitializeSizes(A,B,C,D);%注意要將ABCD送入初始化case1%flag=1計算連續(xù)系統(tǒng)狀態(tài)方程(導數)sys=mdlDerivatives(t,x,u,A,B,C,D);case3%flag=3計算輸出sys=mdlOutputs(t,x,u,A,B,C,D);case{2,4,9}%其它作不處理的flagsys=[];otherwise%異常處理

error([‘Unhandledflag=‘,num2str(flag)]);end%主函數結束%---------------------------------------Function[sys,x0,str,ts]=mdlInitializeSizes(A,B,C,D)%模型初始化函數sizes=simsizes;%取系統(tǒng)默認設置sizes.NumContStates=3;%連續(xù)系統(tǒng)的狀數為3sizes.NumDiscStates=0;%離散系統(tǒng)的狀態(tài)數sizes.NumOutputs=1;%輸入信號數目是1sizes.NumInputs=1;%輸出信號數目是1sizes.DirFeedthrough=0;%該系統(tǒng)不是直通的sizes.NumSampleTimes=1;%采樣周期個數sys=simsizes(sizes);%設置系統(tǒng)參數str=[];%系統(tǒng)階字串通常為空矩陣x0=[0;0;0];%初始狀態(tài)矩陣x(零狀態(tài))ts=[00];%連續(xù)取樣時間%初始化函數結束%-----------------------------------------functionsys=mdlDerivatives(t,x,u,A,B,C,D)%系統(tǒng)狀態(tài)方程函數sys=A*x+B*u;%系統(tǒng)狀態(tài)函數結束%------------------------------------------%系統(tǒng)輸出函數functionsys=mdlOutputs(t,x,u,A,B,C,D)sys=C*x;

例:設計一個理想放大器,其增益可由用戶設定,并將設計好的S函數模塊封裝分析:

對理想放大器,其輸入輸出是直通的,且是一個無記憶系統(tǒng),因此狀態(tài)數為0,狀態(tài)矩陣x=[]是空矩陣,而輸出方程為:y(t)=G×u(t),其中G為增益參數。Function[sys,x0,str,ts]=Ampvar(t,x,u,flag,G)%G是輔助參數,增益%實現(xiàn)輸入輸出關系:y=G*

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論