版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第5章MATLAB程序設(shè)計——程序流程控制01for…end循環(huán)結(jié)構(gòu)
for…end循環(huán)結(jié)構(gòu)
MATLAB的循環(huán)結(jié)構(gòu)有2種:for…end結(jié)構(gòu)和while…end結(jié)構(gòu)。這兩種
語句結(jié)構(gòu)不完全相同,各有各的特點。語法:for循環(huán)變量=array
循環(huán)體end說明:循環(huán)體被循環(huán)執(zhí)行,執(zhí)行的次數(shù)就是array的列數(shù),array可以是向量也可以是矩陣,循環(huán)變量依次取array的各列,每取1次循環(huán)體執(zhí)行1次?!纠?.1】使用for…end循環(huán)編程求出1+3+5…+99的值。sum=0;forn=1:2:100sum=sum+nend計算的結(jié)果為:sum=2500。for…end循環(huán)結(jié)構(gòu)
【例5.2】使用for…end循環(huán)將單位陣轉(zhuǎn)換為列向量。sum=zeros(6,1);forn=eye(6,6)
sum=sum+nend計算結(jié)果如下:sum=111111程序分析:循環(huán)變量n對應(yīng)為矩陣eye(6,6)的每一列,即第1次n為[1;0;0;0;0;0],第2次n為[0;1;0;0;0;0];循環(huán)次數(shù)為矩陣的列數(shù)6。02while…end循環(huán)結(jié)構(gòu)
while…end循環(huán)結(jié)構(gòu)
for…end循環(huán)的循環(huán)次數(shù)確定,而while…end循環(huán)的循環(huán)次數(shù)不確定。語法:while表達式
循環(huán)體end說明:只要表達式為邏輯真,就執(zhí)行循環(huán)體;一旦表達式為邏輯假,就結(jié)束循環(huán)。表達式可以是向量也可以是矩陣。如果表達式為矩陣,則當所有的元素都為真時才執(zhí)行循環(huán)體;如果表達式為nan,MATLAB認為是假,就不執(zhí)行循環(huán)體。while…end循環(huán)結(jié)構(gòu)
【例5.3】根據(jù)
,求y<3時的最大n值和y值。y=0;n=1;whiley<3y=y+1/(2*n-1);n=n+1;z(n)=y;endmn=n-2 %y<3之前的nmy=z(n-1) 計算結(jié)果如下。mn=56my=2.994403if…else…end條件轉(zhuǎn)移結(jié)構(gòu)
if…else…end條件轉(zhuǎn)移結(jié)構(gòu)
if…else…end結(jié)構(gòu)是最常見的條件轉(zhuǎn)移結(jié)構(gòu)。語法:if條件式1
語句段1elseif條件式2
語句段2
…else
語句段(n+1)end說明:當有多個條件時,條件式1為假再判斷elseif的條件式2,如果所有的條件式都不滿足,則執(zhí)行else的語句段(n+1);當某個條件式為真時則執(zhí)行相應(yīng)的語句段。
if…else…end條件轉(zhuǎn)移結(jié)構(gòu)
【例5.4】根據(jù)不同的分段表達式
,繪制分段函數(shù)曲線,曲線如圖。
if…else…end條件轉(zhuǎn)移結(jié)構(gòu)
x=0:0.5:10;y=zeros(1,length(x)); %產(chǎn)生0行向量,y的初始值為0forn=1:length(x)
ifx(n)>=8
y(n)=1;elseifx(n)>=6y(n)=5-x(n)/2;elseifx(n)>=4
y(n)=2;elsey(n)=sqrt(x(n));endendplot(x,y)axis([01002.5]);04switch…case開關(guān)結(jié)構(gòu)
switch…case開關(guān)結(jié)構(gòu)
switch…case開關(guān)結(jié)構(gòu)是有多個分支結(jié)構(gòu)的條件轉(zhuǎn)移結(jié)構(gòu)。語法:switch開關(guān)表達式case表達式1
語句段1case表達式2
語句段2
…otherwise
語句段nend說明:(1)將開關(guān)表達式依次與case后面的表達式進行比較,如果表達式1不滿足,則與下一個表達式2比較,如果都不滿足則執(zhí)行otherwise后面的語句段n;一旦開關(guān)表達式與某個表達式相等,則執(zhí)行其后面的語句段。(2)開關(guān)表達式只能是標量或字符串。(3)case后面的表達式可以是標量、字符串或元胞數(shù)組,如果是元胞數(shù)組則將開關(guān)表達式與元胞數(shù)組的所有元素進行比較,只要某個元素與開關(guān)表達式相等,就執(zhí)行其后的語句段。switch…case開關(guān)結(jié)構(gòu)
【例5.5】用switch…case開關(guān)結(jié)構(gòu)得出各月份的季節(jié)。formonth=1:12; switchmonth case{3,4,5} season='spring' case{6,7,8} season='summer' case{9,10,11} season='autumn' otherwise season='winter' endend05try…catch…end試探結(jié)構(gòu)
try…catch…end試探結(jié)構(gòu)
MATLAB提供一種試探結(jié)構(gòu)try…catch…end,這種語句結(jié)構(gòu)是其他很多語言所沒有的。語法:try
語句段1catch
語句段2end說明:首先試探性地執(zhí)行語句段1,如果在此段語句執(zhí)行過程中出現(xiàn)錯誤,則將錯誤信息賦給保留的lasterr變量,并放棄該段語句,轉(zhuǎn)而執(zhí)行語句段2中的語句;當執(zhí)行語句段2又出現(xiàn)錯誤,則終止該結(jié)構(gòu)。try…catch…end試探結(jié)構(gòu)
【例5.6】用try…catch…end結(jié)構(gòu)進行矩陣相乘運算。n=4;a=magic(n);m=3;b=eye(3);try c=a*bcatch c=a(1:m,1:m)*bendlasterr計算結(jié)果如下:c= 16 2 3 5 11 10 9 7 6try…catch…end試探結(jié)構(gòu)
用lasterr函數(shù)查看出錯原因顯示如下:'錯誤使用*
用于矩陣乘法的維度不正確。請檢查并確保第一個矩陣中的列數(shù)與第二個矩陣中的行數(shù)匹配。要執(zhí)行按元素相乘,請使用'.*'。'程序分析:試探出矩陣的大小不匹配時,矩陣無法相乘,則再執(zhí)行catch后面的語句段,將a的子矩陣取出與b矩陣相乘??梢酝ㄟ^這種結(jié)構(gòu)靈活地實現(xiàn)矩陣的乘法運算。06流程控制語句
“break”命令“continue”命令“return”命令“pause”命令“keyboard”命令“input”命令流程控制語句
1.“break”命令“break”命令可以使包含break的最內(nèi)層的for或while語句強制終止,立即跳出該結(jié)構(gòu),執(zhí)行end后面的命令?!癰reak”命令一般和if結(jié)構(gòu)結(jié)合使用?!纠?.7】為【例5.3】增加條件,用if與“break”命令結(jié)合,停止while循環(huán)。計算
值,當y≥3時終止計算。y=0;n=1;whilen<=100 ify<3 y=y+1/(2*n-1); n=n+1; z(n)=y; else break endendmn=n-2 %y<3之前的nmy=z(n-1) 流程控制語句
計算結(jié)果如下:mn=56my=2.9944程序分析:while…end循環(huán)結(jié)構(gòu)嵌套if…else…end分支結(jié)構(gòu),當y>=3時跳出while循環(huán)結(jié)構(gòu),終止循環(huán)。流程控制語句
2.“continue”命令“continue”命令用于結(jié)束本次for或while循環(huán),與“break”命令不同的是,“continue”命令只結(jié)束本次循環(huán)而繼續(xù)進行下次循環(huán)。【例5.8】將if與“continue”命令結(jié)合,計算1~100中除了5的倍數(shù)之外的所有整數(shù)的和。sum=0;forn=1:100 ifmod(n,5)==0 continue; %能被整除就跳出本次外循環(huán) else sum=sum+n; endendsum計算結(jié)果如下:sum= 4000流程控制語句
3.“return”命令“return”命令用于終止當前命令的執(zhí)行,并且立即返回到上一級調(diào)用函數(shù)或等待鍵盤輸入命令,可以用來提前結(jié)束程序的運行?!皉eturn”命令也可以用來終止鍵盤方式。4.“pause”命令“pause”命令用來使程序運行暫停,等待用戶按任意鍵繼續(xù),用于程序調(diào)試或查看中間結(jié)果,也可以用來控制動畫執(zhí)行的速度。語法:pause %暫停pause(n) %暫停n秒5.“keyboard”命令“keyboard”命令用來使程序暫停運行,等待鍵盤命令,執(zhí)行完自己的工作后,輸入return語句,程序就繼續(xù)運行。“keyboard”命令可以用來在程序調(diào)試或程序執(zhí)行時修改變量。流程控制語句
6.“input”命令“input”命令用來提示用戶應(yīng)從鍵盤輸入數(shù)值、字符串和表達式,并接受該輸入?!癷nput”命令常用的幾種格式如下:>>a=input('inputanumber:') %輸入數(shù)值給ainputanumber:45a= 45>>b=input('inputanumber:','s’) %輸入字符串給binputanumber:45b= 45>>input('inputanumber:') %將輸入值進行運算inputanumber:2+3ans= 507循環(huán)結(jié)構(gòu)與動畫
以電影方式產(chǎn)生動畫以對象方式產(chǎn)生動畫使用animatedline對象產(chǎn)生動畫曲線循環(huán)結(jié)構(gòu)與動畫
1.以電影方式產(chǎn)生動畫以電影方式產(chǎn)生動畫,有以下兩個步驟:(1)使用getframe命令抓取圖形作為畫面,每個畫面都是以1個列向量的
方式,置于存放整個電影的矩陣M中。(2)使用movie(M,k)命令播放電影,并可指定矩陣M播放的重復(fù)次數(shù)k。【例5.9】使用電影方式制作動畫并顯示。t=-pi:0.1:pi;n=length(t)forii=1:n %循環(huán)次數(shù)由橫坐標長度決定
x=-pi:0.1:t(ii);y=sin(2*x);z=cos(x);plot3(x,y,z) %繪制曲線axis([-4,4,-1,1,-1,1]); %確定坐標軸范圍M(ii)=getframe; %抓取畫面endmovie(M) %播放數(shù)組M的畫面循環(huán)結(jié)構(gòu)與動畫
運行程序顯示的最后一幅畫面如圖。循環(huán)結(jié)構(gòu)與動畫
2.以對象方式產(chǎn)生動畫以對象方式產(chǎn)生動畫時,使用MATLAB句柄圖形的概念,所有的曲線或曲面均可被視為一個對象,對其中的每個對象都可以通過屬性設(shè)置進行修改。以對象方式產(chǎn)生動畫就是擦除舊對象,產(chǎn)生與舊對象相似但不同的新對象,這樣既不破壞背景又可以看到動畫的效果。產(chǎn)生移動的動畫效果需要首先計算對象的新位置,并在新位置上顯示出對象;然后擦除原位置上的舊對象,并刷新屏幕。(1)擦除屬性EraseMode以對象方式產(chǎn)生動畫需要設(shè)置EraseMode屬性。EraseMode為1個字符串,代表對象的擦除方式,即對于舊對象的處理方式。EraseMode屬性有以下幾種。①normal:計算整個畫面的數(shù)據(jù),重畫整個圖形。②xor:將舊對象的點以xor的方式還原,即只畫與屏幕色不一致的新對象點,擦除不一致的原對象點,這種方式不會擦除被擦對象下面的其他圖像。③background:將舊對象的點變成背景顏色,實現(xiàn)擦除,這種方式會擦除被擦對象下的其他圖像。④none:保留舊對象的點,不進行任何擦除。循環(huán)結(jié)構(gòu)與動畫
(2)對象的位置屬性通常在動畫過程中,會改變對象的位置、尺寸或顏色等外觀屬性。位置屬性有如下兩種。①xdata:為1個向量,代表對象的x坐標值。②ydata:為1個向量,代表對象的y坐標值。(3)屏幕刷新當新對象的屬性設(shè)置后,應(yīng)刷新屏幕,使新對象顯示出來,刷新屏幕用“drawnow”命令實現(xiàn)?!癲rawnow”命令使MATLAB暫停當前的任務(wù)序列而去刷新屏幕。如果沒有“drawnow”命令,MATLAB則會等當前的任務(wù)序列執(zhí)行完才去刷新屏幕。(4)產(chǎn)生動畫產(chǎn)生動畫的具體步驟是:首先產(chǎn)生1個對象,其EraseMode屬性為xor、background或none;然后在循環(huán)中產(chǎn)生動畫,每次循環(huán)改變此對象的xdata或ydata(或兩者);最后使用“drawnow”命令刷新屏幕。循環(huán)結(jié)構(gòu)與動畫
【例5.10】使用對象方式產(chǎn)生1個紅色的小球沿著曲線運行。>>x=0:0.1:20;>>y=1-1/sqrt(1-0.3^2)*exp(-0.3*x).*sin(sqrt(1-0.3^2)*x+acos(0.3));>>plot(x,y)>>h=line(0,0,'color','red','marker','.','markersize',40,'erasemode','xor'); %定義紅色的小球>>fori=1:length(x)
set(h,'xdata',x(i),'ydata',y(i)); %設(shè)置小球的新位置
pause(0.005) %暫停0.005s
drawnow %刷新屏幕end循環(huán)結(jié)構(gòu)與動畫
運行程序顯示最終畫面如圖。循環(huán)結(jié)構(gòu)與動畫
3.使用animatedline對象產(chǎn)生動畫曲線MATLAB還提供了專門的animatedline對象實現(xiàn)動畫曲線,使用addpoints來一點一點地繪制曲線上的點?!纠?.11】使用animatedline對象實現(xiàn)動畫繪制曲線。h=animatedline; %創(chuàng)建動畫對象x=0:0.1:3*pi;y=sin(x);z=cos(x);axisequal
forn=1:length(x)addpoints(h,y(n),z(n)); %動畫畫點drawnow %刷新屏幕end循環(huán)結(jié)構(gòu)與動畫
繪制的動畫如圖。第5章MATLAB程序設(shè)計——M文件01M文件編輯器
M文件編輯器
單擊MATLAB主頁面板工具欄“文件”區(qū)的(新建腳本)按鈕,或者單擊(新建)按鈕選擇“腳本”命令,可創(chuàng)建空白的M腳本文件;而單擊(新建)按鈕選擇“函數(shù)”命令,創(chuàng)建的則是空白的M函數(shù)文件。如圖(a)所示為M腳本文件編輯器,如圖(b)所示為M函數(shù)文件編輯器。
02M腳本文件M腳本文件腳本文件具有如下特點:(1)腳本文件中的命令格式和前后位置,與在命令行窗口中輸入時沒有任何區(qū)別。(2)MATLAB在運行腳本文件時,只是簡單地按順序從文件中讀取一條條命令,送到MATLAB命令行窗口中去執(zhí)行。(3)與在命令行窗口中直接運行命令一樣,腳本文件運行產(chǎn)生的變量都駐留在MATLAB的工作區(qū)中,可以很方便地查看變量,除非用“clear”命令清除;腳本文件的命令也可以訪問工作區(qū)的所有數(shù)據(jù),為此要注意避免變量的覆蓋而造成程序出錯。M腳本文件【例5.12】在M文件編輯/調(diào)試器窗口中編寫M腳本文件,繪制二階系統(tǒng)的多條時域曲線。欠阻尼系統(tǒng)的時域輸出y與x的關(guān)系為
。(1)單擊MATLAB主頁面板工具欄“文件”區(qū)的(新建腳本)按鈕,打開M文件編輯器。(2)將命令全部寫入M文件編輯器中,為了能夠標識該文件的名稱,在第1行寫入包含文件名的注釋。保存文件為“Ex0512.m”。x=0:0.1:20;y1=1-1/sqrt(1-0.3^2)*exp(-0.3*x).*sin(sqrt(1-0.3^2)*x+acos(0.3))plot(x,y1,'r') %畫阻尼系數(shù)為0.3的曲線holdony2=1-1/sqrt(1-0.707^2)*exp(-0.707*x).*sin(sqrt(1-0.707^2)*x+acos(0.707))plot(x,y2,'g') %畫阻尼系數(shù)為0.707的曲線y3=1-exp(-x).*(1+x)plot(x,y3,'b') %畫阻尼系數(shù)為1的曲線說明:“holdon”表示保存plot(x,y1,'r')畫圖結(jié)果再plot(x,y2,'g')和plot(x,y3,'b'),否則運行結(jié)果圖上只能看到最后plot(x,y3,'b')畫圖結(jié)果?!癶oldoff”可以關(guān)閉保持繪圖功能。M腳本文件(3)在M文件編輯器的編輯器面板工具欄“運行”區(qū)單擊(運行)按鈕,打開運行界面如圖。M腳本文件查看工作區(qū)的變量如下:>>whosNameSizeBytesClassAttributesx1x2011608doubley11x2011608doubley21x2011608doubley31x2011608double03M函數(shù)文件
M函數(shù)文件的基本格式說明M函數(shù)文件的執(zhí)行M函數(shù)文件
1.M函數(shù)文件的基本格式說明M函數(shù)文件的基本格式如下:函數(shù)聲明行%H1行%在線幫助文本%編寫和修改記錄函數(shù)體說明:(1)函數(shù)聲明行以“function”引導(dǎo),是M函數(shù)文件必須有的,而M腳本文件沒有;函數(shù)名和文件名一致,當不一致時,MATLAB以文件名為準。例如Ex0502函數(shù)保存在Ex0502.m文件中。函數(shù)聲明行的格式如下:function[輸出變量列表=]函數(shù)名(輸入變量列表)(2)H1行通常包含大寫的函數(shù)文件名,可以提供help和lookfor關(guān)鍵詞用于查詢。(3)在線幫助文本通常包含函數(shù)輸入、輸出變量的含義和格式說明。(4)編寫和修改記錄一般在空1行后,記錄作者、日期和版本記錄,用于軟件檔案管理。(5)函數(shù)體由MATLAB的命令或者通過流程控制結(jié)構(gòu)組織的命令組成,通過函數(shù)體實現(xiàn)函數(shù)的功能。M函數(shù)文件
在MATLAB主頁面板工具欄“文件”區(qū)單擊(新建)按鈕選擇“函數(shù)”命令,則會創(chuàng)建一個新的函數(shù)文件并自動生成函數(shù)語句,內(nèi)容如下:function[outputArg1,outputArg2]=untitled(inputArg1,inputArg2)%UNTITLED此處顯示有關(guān)此函數(shù)的摘要%此處顯示詳細說明outputArg1=inputArg1;outputArg2=inputArg2;endM函數(shù)文件
2.M函數(shù)文件的執(zhí)行M函數(shù)文件的函數(shù)通過調(diào)用才會被執(zhí)行,通過函數(shù)名調(diào)用函數(shù),如果函數(shù)包含輸入?yún)?shù),調(diào)用時帶變量或者常量賦值輸入?yún)?shù),如果函數(shù)包含輸出參數(shù),調(diào)用時可以賦值對應(yīng)的變量,也可以不接收輸出值。函數(shù)執(zhí)行時應(yīng)注意下列幾點:(1)函數(shù)文件在運行過程中產(chǎn)生的變量都存放在函數(shù)本身的工作區(qū)中。(2)當結(jié)束函數(shù)文件的運行,函數(shù)工作區(qū)的變量被清除。(3)函數(shù)的工作區(qū)隨具體的M函數(shù)文件調(diào)用而產(chǎn)生,隨調(diào)用結(jié)束而刪除,是獨立的、臨時的。在MATLAB運行過程中可以產(chǎn)生任意多個臨時的函數(shù)工作區(qū)。M函數(shù)文件
【例5.13】在M文件編輯/調(diào)試器窗口編寫計算二階系統(tǒng)時域響應(yīng)的M函數(shù)文件,并在MATLAB命令行窗口中調(diào)用該文件。(1)修改系統(tǒng)生成的默認函數(shù)文件內(nèi)容如下:functiony=Ex0513(zeta)%Ex0513二階系統(tǒng)階躍響應(yīng)曲線%copyright2023-05-23x=0:0.1:20;y=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta));plot(x,y)其中,第1行指定該文件是函數(shù)文件,文件名為“Ex0513”,輸入?yún)?shù)為阻尼系數(shù)zeta,輸出參數(shù)為時域響應(yīng)y。M函數(shù)文件
(2)文件幫助和搜索在命令行窗口輸入幫助命令:>>helpEx0513Ex0513二階系統(tǒng)階躍響應(yīng)曲線copyright2023-05-23“help”命令顯示M文件的第1個連續(xù)注釋塊。在命令行窗口輸入幫助命令:>>lookforEx0513Ex0513-二階系統(tǒng)階躍響應(yīng)曲線“l(fā)ookfor文件”命令查找的必須是MATLAB搜索路徑上的文件,顯示指定文件的第1行注釋,注釋中包含該文件名。M函數(shù)文件
(3)調(diào)用函數(shù)執(zhí)行接收函數(shù)返回結(jié)果在MATLAB命令行窗口輸入以下命令:>>f=Ex0513(0.3)說明:調(diào)用Ex0513函數(shù),0.3作為輸入?yún)?shù)zeta值。輸出參數(shù)y賦值給f。此后,在調(diào)用函數(shù)的程序中可以使用f變量。運行結(jié)果命令窗口顯示f值,同時創(chuàng)建繪圖窗口繪制曲線。如果“f=Ex0513(0.3);”調(diào)用函數(shù),則f雖然賦值,但不會顯示值。M函數(shù)文件
(4)不接收函數(shù)返回結(jié)果在MATLAB命令行窗口輸入以下命令:>>Ex0513(0.3)運行結(jié)果則會命令窗口顯示y值,同時創(chuàng)建繪圖窗口繪制曲線。因為y是函數(shù)中的,調(diào)用后就已經(jīng)消除。(5)函數(shù)定義時不包含輸出參數(shù)functionEx0513(zeta).......調(diào)用Ex0513函數(shù),命令窗口就不會顯示任何值。第5章MATLAB程序設(shè)計——函數(shù)調(diào)用和參數(shù)傳遞01子函數(shù)和私有函數(shù)
子函數(shù)私有函數(shù)調(diào)用函數(shù)的搜索順序子函數(shù)和私有函數(shù)
1.子函數(shù)在1個M函數(shù)文件中,可以包含1個以上的函數(shù),其中只有一個是主函數(shù),其他均為子函數(shù)。(1)在1個M文件中,主函數(shù)必須出現(xiàn)在最上方,其后是子函數(shù),子函數(shù)的次序無任何限制。(2)子函數(shù)不能被其他文件的函數(shù)調(diào)用,只能被同一文件中的函數(shù)(可以是主函數(shù)或子函數(shù))調(diào)用。(3)同一文件的主函數(shù)和子函數(shù)變量的工作區(qū)相互獨立。(4)用“help”和“l(fā)ookfor”命令不能提供子函數(shù)的幫助信息。子函數(shù)和私有函數(shù)
【例5.14】將畫二階系統(tǒng)時域曲線的函數(shù)作為子函數(shù),編寫畫多條曲線的程序。functionEx0514()%主函數(shù):調(diào)用子函數(shù)subFuncz1=0.3;subFunc(z1) %調(diào)用subFuncholdonz1=0.5;subFunc(z1) %調(diào)用subFuncz1=0.707;subFunc(z1) %調(diào)用subFunc
functionsubFunc(zeta)%子函數(shù):畫二階系統(tǒng)時域曲線x=0:0.1:20;y=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta));plot(x,y)子函數(shù)和私有函數(shù)
2.私有函數(shù)私有函數(shù)是指存放在private子目錄中的M函數(shù)文件,具有以下性質(zhì):(1)在private目錄下的私有函數(shù),只能被其父目錄的M函數(shù)文件所調(diào)用,而不能被其他目錄的函數(shù)調(diào)用。私有函數(shù)對其他目錄的文件是不可見的,私有函數(shù)可以和其他目錄下的函數(shù)重名。(2)私有函數(shù)父目錄的M腳本文件也不可調(diào)用私有函數(shù)。(3)在函數(shù)調(diào)用搜索時,私有函數(shù)優(yōu)先于其他MATLAB路徑上的函數(shù)。3.調(diào)用函數(shù)的搜索順序在MATLAB中調(diào)用1個函數(shù),搜索的順序如下:(1)查找是否為子函數(shù)。(2)查找是否為私有函數(shù)。(3)從當前路徑中搜索此函數(shù)。(4)從搜索路徑中搜索此函數(shù)。02局部變量和全局變量
局部變量全局變量局部變量和全局變量
1.局部變量局部變量(LocalVariables)是在函數(shù)體內(nèi)部使用的變量,其影響范圍只能在本函數(shù)內(nèi);每個函數(shù)在運行時,都占用獨立的函數(shù)工作區(qū),此工作區(qū)和MATLAB的工作區(qū)是相互獨立的。局部變量僅存在于函數(shù)的工作區(qū)內(nèi),只在函數(shù)執(zhí)行期間存在,當函數(shù)執(zhí)行完變量就消失。2.全局變量全局變量(GlobalVariables)是可以在不同的函數(shù)工作區(qū)和MATLAB工作區(qū)中共享使用的變量。全局變量在使用前必須用global定義,而且每個要共享全局變量的函數(shù)和工作區(qū)都必須逐個用global對變量加以定義。局部變量和全局變量
【例5.15】修改【例5.14】,在主函數(shù)和子函數(shù)中使用全局變量。functionEx0515()%EX0515 使用全局變量繪制二階系統(tǒng)時域響應(yīng)曲線globalXX=0:0.1:20;z1=0.3;subFunc(z1);holdonz1=0.5;subFunc(z1);z1=0.707;subFunc(z1);
functionsubFunc(zeta)%子函數(shù),畫二階系統(tǒng)時域曲線globalXy=1-1/sqrt(1-zeta^2)*exp(-zeta*X).*sin(sqrt(1-zeta^2)*X+acos(zeta));plot(X,y);局部變量和全局變量
程序分析:X變量為全局變量,在需要使用的主函數(shù)和子函數(shù)中都需要用global定義;同樣,如果在工作區(qū)中定義X為全局變量后也可以使用。>>globalX>>who您的變量為:X03嵌套函數(shù)
嵌套函數(shù)
在一個父函數(shù)中可以嵌套多個子函數(shù),也可以多層嵌套;但是嵌套函數(shù)不能出現(xiàn)在if結(jié)構(gòu)、switch結(jié)構(gòu)、for循環(huán)、do…while循環(huán)和try…catch結(jié)構(gòu)中;每個函數(shù)都必須以“end”結(jié)束?!纠?.16】繪制函數(shù)表達式
的曲線,輸入?yún)?shù)為n,曲線范圍t為0~2π。functions=Ex0516(n)%主函數(shù)s=1+sqrt(t)*n^2/(n^2+5)*sin(t)t=0:0.1:2*pi;n1=n^2;s=fun1(n1);functionfn1=fun1(n1)%嵌套函數(shù)fn1=1+sqrt(t)*n1/(n1+5)*sin(t)n2=n1/(n1+5);fn1=fun2(n2).*sin(t);functionfn2=fun2(n2)%嵌套函數(shù)fn2=1+sqrt(t)*n2fn2=1+sqrt(t).*n2;endendplot(t,s)end嵌套函數(shù)
程序分析:雙重嵌套的函數(shù),主函數(shù)中的變量t不需要傳遞參數(shù)給fun1和fun2嵌套函數(shù),就可以直接使用。當輸入?yún)?shù)為10時繪制的曲線如圖。>>s=Ex0516(10)04函數(shù)的參數(shù)參數(shù)傳遞規(guī)則函數(shù)參數(shù)的個數(shù)函數(shù)的參數(shù)MATLAB的函數(shù)調(diào)用過程實際上就是參數(shù)傳遞的過程。函數(shù)調(diào)用的格式如下:[輸出參數(shù)1,輸出參數(shù)2,…]=函數(shù)名(輸入?yún)?shù)1,輸入?yún)?shù)2,…)1.參數(shù)傳遞規(guī)則在MATLAB中,函數(shù)具有自己的工作區(qū),函數(shù)內(nèi)變量與外界(包括其他函數(shù)和工作區(qū))的唯一聯(lián)系就是通過函數(shù)的輸入/輸出參數(shù)。輸入?yún)?shù)在函數(shù)中的任何變化,都僅在函數(shù)內(nèi)進行,不會傳遞回去。函數(shù)的參數(shù)【例5.17】修改畫二階系統(tǒng)時域的函數(shù),使用輸入/輸出參數(shù)來實現(xiàn)參數(shù)傳遞。functionEx0517()%EX0517參數(shù)傳遞繪制二階系統(tǒng)時域響應(yīng)曲線z1=0.3;[x1,y1]=subFunc(z1);plot(x1,y1)holdonz1=0.5;[x2,y2]=subFunc(z1);plot(x2,y2)z1=0.707;[x3,y3]=subFunc(z1);plot(x3,y3);
function[x,y]=subFunc(zeta)%子函數(shù),畫二階系統(tǒng)時域曲線x=0:0.1:20;y=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta))程序分析:主函數(shù)Ex0517調(diào)用子函數(shù)subFunc,子函數(shù)中的zeta為輸入?yún)?shù),函數(shù)調(diào)用時將z1傳遞給子函數(shù)zeta,子函數(shù)計算后將輸出參數(shù)x和y傳回給主函數(shù)的x1、y1;主函數(shù)調(diào)用子函數(shù)3次,后面兩次參數(shù)的傳遞也是同樣的。函數(shù)的參數(shù)2.函數(shù)參數(shù)的個數(shù)(1)nargin變量和nargout變量在MATLAB中有兩個特殊變量:nargin和nargout,函數(shù)的輸入/輸出參數(shù)的個數(shù)可以通過它們獲得,nargin用于獲得輸入?yún)?shù)的個數(shù),nargout用于獲得輸出參數(shù)的個數(shù)。語法:nargin %在函數(shù)體內(nèi)獲取實際輸入變量的個數(shù)nargout %在函數(shù)體內(nèi)獲取實際輸出變量的個數(shù)nargin('fun') %在函數(shù)體外獲取定義的輸入?yún)?shù)個數(shù)nargout('fun') %在函數(shù)體外獲取定義的輸出參數(shù)個數(shù)函數(shù)的參數(shù)【例5.18_1】計算兩個數(shù)的和,根據(jù)輸入?yún)?shù)個數(shù)的不同使用不同的運算表達式。function[sum,n]=Ex0518(x,y)%EX0518 參數(shù)個數(shù)可變,計算x和y的和ifnargin==1 sum=x+0; %若輸入1個參數(shù)就計算與0的和 n=1elseifnargin==0 sum=0; %若無輸入?yún)?shù)就輸出0 n=0;else sum=x+y; %若輸入的是2個參數(shù)則計算其和 n=2;endend函數(shù)的參數(shù)在命令行窗口調(diào)用Ex0518函數(shù),分別使用2個、1個和無輸入?yún)?shù),結(jié)果如下所示:>>[y,n]=Ex0518(2,3)y= 5n= 2>>[y,n]=Ex0518(2)n= 1y= 2n= 1>>[y,n]=Ex0518y= 0n= 0函數(shù)的參數(shù)注意:如果輸入的參數(shù)多于輸入?yún)?shù)個數(shù),則會出錯。>>[y,n]=Ex0518(1,2,3)錯誤使用Ex0518輸入?yún)?shù)太多。
也可以在工作區(qū)查看函數(shù)體定義的輸入?yún)?shù)個數(shù)。>>nargin('Ex0518')ans= 2函數(shù)的參數(shù)【例5.18_2】添加以下程序,查看用nargout變量獲取輸出參數(shù)個數(shù)。ifnargout==0 %當輸出參數(shù)個數(shù)為0時,運算結(jié)果為0
sum=0;end在命令行窗口調(diào)用Ex0518函數(shù),當輸出參數(shù)格式不同時,結(jié)果如下。>>Ex0518(2,3) %當輸出參數(shù)個數(shù)為0時ans= 0>>y=Ex0518(2,3) %當輸出參數(shù)個數(shù)為1時y= 5>>[y,n,x]=Ex0518 %當輸出參數(shù)個數(shù)太多時錯誤使用Ex0518輸出參數(shù)太多。
函數(shù)的參數(shù)(2)varargin變量和varargout變量MATLAB還有兩個特殊變量:varargin和varargout,可以獲得輸入/輸出變量的各元素內(nèi)容,varargin和varargout都是元胞數(shù)組?!纠?.18_3】計算所有輸入變量的和。function[y,n]=Ex0518(varargin)%EX0518 使用可變參數(shù)vararginifnargin==0 %當沒有輸入變量時輸出0 disp('NoInputvariables.') y=0; n=0;elseifnargin==1 %當有一個輸入變量時,輸出該數(shù)
y=varargin{1}; n=1;else n=nargin; y=0; n=2; form=1:n y=varargin{m}+y; %當有多個輸入變量時,取輸入變量循環(huán)相加 endendn=nargin;函數(shù)的參數(shù)在MATLAB的命令行窗口中輸入不同個數(shù)的變量調(diào)用函數(shù)Ex0518,結(jié)果如下:>>[y,n]=Ex0518(1,2,3,4) %輸入4個參數(shù)y= 3n= 4>>[y,n]=Ex0518(1) %輸入1個參數(shù)y= 1n= 1>>[y,n]=Ex0518 %無輸入?yún)?shù)NoInputvariables.y= 0n= 0函數(shù)的參數(shù)(3)參數(shù)省略符號“~”對于參數(shù)個數(shù)變化另外一種便捷的方式,就是使用MATLAB提供的“~”符號,表示可以省略的輸入或輸出參數(shù)。function[sum,n]=Ex0518_1(x,y)sum=x+y; n=nargin;end調(diào)用函數(shù)Ex0518_1,輸出參數(shù)省略調(diào)用:>>[sum,~]=Ex0518_1(2,3)sum=5>>[~,n]=Ex0518_1(2,3)n=2函數(shù)的參數(shù)對于輸入?yún)?shù),可以使用“~”在函數(shù)定義中省略參數(shù):function[sum,n]=Ex0518_2(~,m)%輸入?yún)?shù)省略sum=0+m; n=nargin;end調(diào)用函數(shù)Ex0518_2:>>[sum,n]=Ex0518_2(2,3)sum=3n=205程序舉例
程序舉例
【例5.19】根據(jù)輸入的參數(shù)繪制不同的曲線,每個子函數(shù)繪制一種曲線。M文件的程序代碼。程序分析:主函數(shù)名為Ex0519,4個子函數(shù)名分別為po1、po2、po3和po4,文件保存為“Ex0519.m”。若在命令行窗口中輸入以下命令:>>y=Ex0519(1);則產(chǎn)生如圖所示的調(diào)用第一個子函數(shù)的極坐標曲線。程序舉例
【例5.20】編寫M函數(shù)文件,通過流程控制語句,建立如下的矩陣。functiony=Ex0520(m)%Ex0520 用循環(huán)流程控制語句創(chuàng)建矩陣y=0;m=m-1;forn=1:m y=[0,y]; %創(chuàng)建全0行endforn=1:m a=[1:1:n]; b=a; fork=m:-1:n b=[0,b]; end y=[b;y]; n=n+1;end程序舉例
程序分析:將矩陣的行列數(shù)用輸入?yún)?shù)m確定,輸出參數(shù)為矩陣y。使用雙重循環(huán)創(chuàng)建矩陣,將文件保存為“Ex0520.m”。在命令行窗口中調(diào)用Ex0520函數(shù):>>y=Ex0520(5)y= 0 1 2 3 4 0 0 1 2 3 0 0 0 1 2 0 0 0 0 1 0 0 0 0 0程序舉例
【例5.21】在【例4.31】中設(shè)計界面axes1控件中繪制正弦波形。單選按鈕中選擇振幅,列表框中選擇頻率。(1)設(shè)計界面界面設(shè)計如圖。程序舉例
(2)回調(diào)函數(shù)回調(diào)函數(shù)需要在單擊“繪制”按鈕(pushbutton1)時繪制正弦曲線,單擊“關(guān)閉”按鈕(pushbutton2)時關(guān)閉窗口。編寫回調(diào)函數(shù)的步驟:選擇“繪制”按鈕(pushbutton1),單擊鼠標右鍵,在彈出的快捷菜單中選擇“查看回調(diào)”→“Callback”命令,進入pushbutton1_Callback函數(shù),在函數(shù)中添加代碼如下:functionpushbutton1_Callback(hObject,eventdata,handles)%hObjecthandletopushbutton1(seeGCBO)%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)am_1=get(handles.radiobutton1,'value'); %獲取單選按鈕radiobutton1的值am_2=get(handles.radiobutton2,'value');ifam_1==1 %如果單選按鈕radiobutton1被選中am=5;elseam=10;endfre1=get(handles.listbox1,'string'); %獲取下拉列表listbox1的string屬性n=get(handles.listbox1,'value'); %獲取下拉列表listbox1被選中的列表索引fre=eval(fre1{n}); %得出下拉列表listbox1被選中項的內(nèi)容x=0:0.1:10;plot(am*sin(fre*x)); %繪制正弦曲線,振幅和頻率根據(jù)選擇得出程序舉例
handles變量非常重要,它是1個結(jié)構(gòu)數(shù)組,包括以下兩部分內(nèi)容:(1)存儲所有在圖形界面中的控件、菜單、坐標軸對象的句柄,每個對象的句柄名稱與對象的“Tag”名相同,如列表listbox1的句柄是“handles.listbox1”。(2)通過get函數(shù)可以獲得不同對象的屬性值,例如,get(handles.listbox1,'string')得出9×1的元胞數(shù)組,記錄了所有列表項的值,fre1{n}用來獲取對應(yīng)列表項的值;get(handles.listbox1,'value')得出用戶所選的列表項的索引,如果選擇第一項則為1。程序運行界面如圖。第5章MATLAB程序設(shè)計——利用函數(shù)句柄執(zhí)行函數(shù)01函數(shù)句柄的創(chuàng)建
函數(shù)句柄的創(chuàng)建使用函數(shù)句柄的優(yōu)點函數(shù)句柄的創(chuàng)建
1.函數(shù)句柄的創(chuàng)建與圖形對象的句柄不同,函數(shù)句柄不是在函數(shù)文件創(chuàng)建時自動創(chuàng)建的,而是必須通過專門的定義。創(chuàng)建函數(shù)句柄使用“@”符號或“str2func”命令實現(xiàn)。語法:h_fun=@funh_fun=str2func('fun')說明:fun是函數(shù)名,h_fun是函數(shù)句柄?!纠?.22】創(chuàng)建MATLAB內(nèi)部函數(shù)的句柄。>>h_sin=@sin;>>h_cos=str2func('cos');函數(shù)句柄的創(chuàng)建
2.使用函數(shù)句柄的優(yōu)點利用函數(shù)句柄執(zhí)行函數(shù)的優(yōu)點有以下幾點:(1)在更大范圍內(nèi)調(diào)用函數(shù)。函數(shù)句柄包含了函數(shù)文件的路徑和函數(shù)類型,即函數(shù)是否為內(nèi)部函數(shù)、M或P文件、子函數(shù)、私有函數(shù)等。無論函數(shù)所在的文件是否在搜索路徑上,是否是當前路徑,是否是子函數(shù)或私有函數(shù),只要函數(shù)句柄存在,函數(shù)就能夠執(zhí)行。(2)提高函數(shù)調(diào)用的速度。不使用函數(shù)句柄時,對函數(shù)的每次調(diào)用都要為該函數(shù)進行全面的路徑搜索,直接影響了速度。(3)使函數(shù)調(diào)用像使用變量一樣方便、簡單。(4)可迅速獲得同名重載函數(shù)的位置、類型信息。02用feval命令執(zhí)行函數(shù)
用feval命令執(zhí)行函數(shù)
函數(shù)也可以使用feval命令直接執(zhí)行,feval命令可以使用函數(shù)句柄或函數(shù)名。語法:[y1,y2,…]=feval(h_fun,arg1,arg2…)[y1,y2,…]=feval('funname',arg1,arg2…)說明:h_fun是函數(shù)句柄;'funname'是函數(shù)名;arg1、arg2…是輸入?yún)?shù);y1、y2…是輸出參數(shù)。在MATLAB的命令行窗口調(diào)用Ex0520函數(shù)來實現(xiàn)創(chuàng)建以下矩陣,使用feval命令有3種格式。用feval命令執(zhí)行函數(shù)
(1)用feval命令利用函數(shù)句柄執(zhí)行。>>h_Ex0520=str2func('Ex0520')h_Ex0520= @Ex0520>>y=feval(h_Ex0520,5)y=0123400123000120000100000(2)用feval命令利用函數(shù)名執(zhí)行。>>y=feval('Ex0520',1);(3)直接調(diào)用函數(shù)。>>y=Ex0520(1);第5章MATLAB程序設(shè)計——利用泛函命令進行數(shù)值分析01求極小值
fminbnd函數(shù)fminsearch函數(shù)求極小值
MATLAB中的函數(shù)fminbnd和fminsearch可以用來尋找最小值。最大值的求法則可以通過“f(x)的最大值=
f(x)的最小值”得出。1.fminbnd函數(shù)fminbnd函數(shù)用來計算單變量非線性函數(shù)的極小值。語法:[x,y]=fminbnd(h_fun,x1,x2,options)[x,y]=fminbnd('funname',x1,x2,options)說明:h_fun是函數(shù)句柄,'funname'是函數(shù)名,必須是單值非線性函數(shù);options是用來控制算法的參數(shù)向量,默認值為0,可省略;x是fun函數(shù)在區(qū)間x1<x<x2上的局部最小值的發(fā)生點;y是對應(yīng)的最小值。求極小值
【例5.23】
用fminbnd求解humps函數(shù)的極小值。>>[x,y]=fminbnd(@humps,0.5,0.8) %求在0.5~0.8之間的極小值x=0.6370y=11.2528程序分析:humps函數(shù)是MATLAB提供的M文件,保存為“humps.m”文件;@humps表示humps函數(shù)的句柄,humps的函數(shù)最小值曲線如圖所示,最小值為圖中的圓點(0.6370,11.2528),誤差小于10
4。求極小值2.fminsearch函數(shù)fminsearch函數(shù)用于求多變量無束縛非線性最小值,采用Nelder-Mead單純形算法求解多變量函數(shù)的最小值。語法:x=fminsearch(h_fun,x0)x=fminsearch('funname',x0)【例5.24】
求著名的Banana測試函數(shù)f(x,y)=100(y
x2)2+(1
x)2的最小值,它的理論最小值是x=1,y=1。該測試函數(shù)有一片淺谷,很多算法都難以逾越。>>fn=inline('100*(x(2)-x(1)^2)^2+(1-x(1))^2','x') %用inline產(chǎn)生內(nèi)聯(lián)函數(shù),x和y用二元數(shù)組表示fn=
內(nèi)聯(lián)函數(shù):fn(x)=100*(x(2)-x(1)^2)^2+(1-x(1))^2>>y=fminsearch(fn,[0.5,-1]) %從(0.5,-1)為初始值開始搜索求最小值y=1.00001.000002求過零點
求過零點
fzero函數(shù)可以尋找一維函數(shù)的零點,即求f(x)=0的根。語法:x=fzero(h_fun,x0,tol,trace)x=fzero('funname',x0,tol,trace)說明:h_fun是待求零點的函數(shù)句柄;x0有兩個作用,即預(yù)定待搜索零點的大致位置和搜索起始點;tol用來控制結(jié)果的相對精度,默認值為eps;trace指定迭代信息是否在運算中顯示,默認為0,表示不顯示迭代信息。tol和trace都可以省略。求過零點
【例5.25】
求解humps函數(shù)的過零點,humps函數(shù)的過零點用圓點表示,如圖。>>xzero=fzero(@humps,1) %求在1附近的零點xzero=1.2995>>xzero=fzero(@humps,[0.5,1.5]) %求在0.5~1.5范圍內(nèi)的零點xzero=1.2995>>xzero=fzero(@humps,[0.5,1]) %求在0.5~1范圍內(nèi)的零點錯誤使用fzero(第274行)Functionvaluesattheintervalendpointsmustdifferinsign.程序分析:若在0.5~1的范圍內(nèi)找不到零點,則提示出錯信息。03數(shù)值積分數(shù)值積分
函數(shù)quad基于數(shù)學上的正方形概念計算函數(shù)的面積,它在所需的區(qū)間計算被積函數(shù)應(yīng)用遞歸調(diào)用的方法,與trapz梯形比較,能夠進行更高階的近似。語法:s=quad(h_fun,x1,x2,tol,trace,p1,p2,…)s=quad('funname',x1,x2,tol,trace,p1,p2,…)說明:x1和x2分別是積分的上、下限;tol用來控制積分精度,省略時默認為0.001;trace取1用圖形展現(xiàn)積分過程,取0則無圖形,省略時默認不畫圖;p1、p2…是向函數(shù)傳遞的參數(shù),可省略。數(shù)值積分【例5.26】
計算y=humps(x)曲線下面的面積。>>x=0:0.01:1;>>y=humps(x);>>area=trapz(x,y) %用梯形計算積分area= 29.8571>>area1=quad(@humps,0,1) %用quad計算積分area1= 29.8583程序分析:用trapz函數(shù)梯形近似可能低估了實際面積,當梯形的寬度變窄時,就能夠得到更精確的結(jié)果。04微分方程的數(shù)值解
微分方程的數(shù)值解
MATLAB提供了ode23、ode45和ode113等多個函數(shù)求解微分方程的數(shù)值解。以下介紹低維方法、高維方法和變維方法解一階常微分方程組。語法:[t,y]=ode45(h_fun,tspan,y0,options,p1,p2…)[t,y]=ode45('funname',tspan,y0,options,p1,p2…)說明:h_fun是函數(shù)句柄,函數(shù)以dx為輸出,以t、y為輸入量;tspan=[起始值終止值],表示積分的起始值和終止值;y0是初始狀態(tài)列向量;options可以定義函數(shù)運行時的參數(shù),可省略;p1、p2…是函數(shù)的輸入?yún)?shù),可省略。微分方程的數(shù)值解
【例5.27】
解經(jīng)典的范德波爾(VanderPol)微分方程:(1)必須把高階微分方程式變換成一階微分方程組。令y1=x,y2=dx/dt,則將二階微分方程變?yōu)橐浑A微分方程組:(2)編寫1個函數(shù)文件“vdpol.m”,設(shè)定
=2,該函數(shù)返回上述導(dǎo)數(shù)值。輸出結(jié)果由1個列向量yprime給出。y1和y2合并寫成列向量y。M函數(shù)文件“vdpol.m”:%范德波爾方程functionyprime=vdpol(t,y)yprime=[y(2);2*(1-y(1)^2)*y(2)-y(1)]微分方程的數(shù)值解
(3)給定當前時間及y1和y2的初始值,解微分方程。>>tspan=[0,30]; %起始值0和終止值30>>y0=[1;0]; %初始值>>[t,y]=ode45(@vdpol,tspan,y0); %解微分方程>>y1=y(:,1);>>y2=y(:,2);>>figure(1)>>plot(t,y1,':b',t,y2,'-r') %畫微分方程解>>figure(2)>>plot(y1,y2) %畫相平面圖微分方程的數(shù)值解
設(shè)y1為橫坐標,y2為縱坐標,則畫出微分方程波形如圖。微分方程的數(shù)值解
畫出y1和y2的相平面圖如圖。第5章MATLAB程序設(shè)計——內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)1.內(nèi)聯(lián)函數(shù)的創(chuàng)建創(chuàng)建內(nèi)聯(lián)函數(shù)可以使用inline函數(shù)實現(xiàn)。語法:inline('string',arg1,arg2,…) %創(chuàng)建內(nèi)聯(lián)函數(shù)說明:'string'必須是不帶賦值號(“=”)的字符串;arg1和arg2是函數(shù)的輸入變量?!纠?.28_1】創(chuàng)建內(nèi)聯(lián)函數(shù),實現(xiàn)
。>>f=inline('sin(x)*exp(-z*x)','x','z')
%創(chuàng)建內(nèi)聯(lián)函數(shù)f=
內(nèi)聯(lián)函數(shù):f(x,z)=sin(x)*exp(-z*x)>>y=f(5,0.3) %調(diào)用函數(shù)fy=-0.2140內(nèi)聯(lián)函數(shù)2.查看內(nèi)聯(lián)函數(shù)MATLAB可以用char、class和argnames函數(shù)方便地查看內(nèi)聯(lián)函數(shù)的信息。語法:char(inline_fun) %查看內(nèi)聯(lián)函數(shù)的內(nèi)容class(inline_fun) %查看內(nèi)聯(lián)函數(shù)的類型argnames(inline_fun) %查看內(nèi)聯(lián)函數(shù)的變量【例5.28_2】查看內(nèi)聯(lián)函數(shù)的信息。>>char(f)ans='sin(x)*exp(-z*x)'>>class(f)ans='inline'>>argnames(f)ans=2×1cell
數(shù)組{'x'}{'z'}內(nèi)聯(lián)函數(shù)3.使內(nèi)聯(lián)函數(shù)適用于數(shù)組運算內(nèi)聯(lián)函數(shù)的輸入變量不能是數(shù)組,但可以使用vectorize函數(shù)將內(nèi)聯(lián)函數(shù)適用于數(shù)組運算。語法:vectorize(inline_fun) %使內(nèi)聯(lián)函數(shù)適用于數(shù)組運算【例5.28_3】使內(nèi)聯(lián)函數(shù)適用于數(shù)組運算。>>ff=vectorize(f) %使內(nèi)聯(lián)函數(shù)f轉(zhuǎn)換為適合于數(shù)組運算ff=
內(nèi)聯(lián)函數(shù):ff(x,z)=sin(x).*exp(-z.*x)>>x=0:0.1:20;>>y=ff(x,0.3);內(nèi)聯(lián)函數(shù)4.執(zhí)行內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)還可以直接使用feval函數(shù)執(zhí)行。語法:[y1,y2,…]=feval(inline_fun,arg1,arg2…)【例5.28_4】執(zhí)行內(nèi)聯(lián)函數(shù)。>>x=0:0.1:20;>>z=0:0.05:10;>>y=feval(ff,x,z)第5章MATLAB程序設(shè)計——M文件性能的優(yōu)化和加速01M文件性能優(yōu)化使用循環(huán)時提高速度的措施大型矩陣的預(yù)先定維優(yōu)先考慮內(nèi)在函數(shù)采用高效的算法盡量使用M函數(shù)文件代替M腳本文件M文件性能優(yōu)化1.使用循環(huán)時提高速度的措施循環(huán)語句及循環(huán)體是MATLAB編程的瓶頸問題。MATLAB與其他編程語言不同,它的基本數(shù)據(jù)是向量和矩陣,編程時應(yīng)盡量對向量和矩陣編程,而不要對矩陣的元素編程。2.大型矩陣的預(yù)先定維由于MATLAB變量在使用之前不需要定義和指定維數(shù),當變量新賦值的元素下標超出數(shù)組的維數(shù)時,MATLAB就為該數(shù)組擴維1次,大大地降低了運行的效率。【例5.29】將【例5.20】中的雙重循環(huán)改為單循環(huán),并用zeros函數(shù)定維來提高運行速度,創(chuàng)建矩陣:functiony=Ex0520(m)%EX0520先定維再創(chuàng)建矩陣m=m-1;y=zeros(m);forn=1:m-1 a=1:m-n; y(n,n+1:m)=a;endM文件性能優(yōu)化3.優(yōu)先考慮內(nèi)在函數(shù)矩陣運算應(yīng)該盡量采用MATLAB的內(nèi)在函數(shù)。內(nèi)在函數(shù)是由更底層的C語言構(gòu)造的,其執(zhí)行速度顯然很快。4.采用高效的算法在實際應(yīng)用中,解決同樣的數(shù)學問題經(jīng)常有各種各樣的算法,應(yīng)尋求更高效的算法。5.盡量使用M函數(shù)文件代替M腳本文件由于M腳本文件每次運行時,都必須把程序裝入內(nèi)存,然后逐句解釋執(zhí)行,十分費時。因此,要盡量使用M函數(shù)文件代替M腳本文件。02P碼文件
P碼文件的生成P碼文件的特點P碼文件
1.P碼文件的生成P碼文件使用pcode命令生成,生成的P碼文件與原M文件名相同,其擴展名為“.p”。語法:pcodeFilename.m %在當前目錄生成Filename.ppcodeFilename.m-inplace %在Filename.m所在目錄生成Filename.p例如,將【例5.29】生成P碼文件,在命令行窗口中輸入命令,將Ex0529.m文件轉(zhuǎn)換為P碼文件。>>pcodeEx0529.m則在當前目錄就生成了P碼文件Ex0529.p。P碼文件
2.P碼文件的特點(1)P碼文件的運行速度比原M文件速度快1個M文件第1次被調(diào)用時,MATLAB將其進行語法分析,并生成P碼文件存放在內(nèi)存中。以后再次調(diào)用該M文件時,MATLAB就直接調(diào)用內(nèi)存中的P碼文件,而不需要再對原M文件重新進行語法分析,當再次調(diào)用M文件時,運行的速度便會高于第1次運行。(2)若存在同名的M文件和P碼文件時則P碼文件被調(diào)用。當在MATLAB的同一目錄或搜索路徑中,同時存在同名的M文件和P碼文件,則該文件名被調(diào)用時執(zhí)行的是P碼文件。為了測試,可以將Ex0529.m文件和Ex0529.p文件放在同一目錄,然后在命令行窗口運行該文件,結(jié)果仍然與原來一樣。>>y=Ex0529(5)(3)P碼文件保密性好。用字處理軟件打開Ex0529.p文件,看到的是亂碼。第6章
線性控制系統(tǒng)分析與設(shè)計——線性系統(tǒng)的描述01狀態(tài)空間描述法
狀態(tài)空間描述法
狀態(tài)空間描述法是使用狀態(tài)方程模型描述控制系統(tǒng)的。狀態(tài)方程為一階微分方程,用數(shù)學形式描述為:其中,例如,二階系統(tǒng)可以用狀態(tài)方程描述為:則狀態(tài)空間描述法
寫出矩陣形式:另外,系統(tǒng)的狀態(tài)方程也可以表示為:MATLAB中狀態(tài)方程模型的建立使用ss和dss函數(shù)。語法:G=ss(a,b,c,d) %由a、b、c、d參數(shù)獲得狀態(tài)方程模型G=dss(a,b,c,d,e) %由a、b、c、d、e參數(shù)獲得狀態(tài)方程模型狀態(tài)空間描述法
【例6.1_1】寫出二階系統(tǒng)
,當=0.707,=1時的狀態(tài)方程。>>zeta=0.707;wn=1;>>A=[01;-wn^2-2*zeta*wn];>>B=[0;wn^2];>>C=[10];>>D=0;>>G=ss(A,B,C,D) %建立狀態(tài)方程模型G=A=x1x2x101x2-1-1.414
B=u1x10x21
C=x1x2y110
D=u1y10Continuous-timestate-spacemodel.02傳遞函數(shù)描述法
傳遞函數(shù)描述法
傳遞函數(shù)是由線性微分方程經(jīng)過拉普拉斯變換得出的,拉普拉斯變換得出控制系統(tǒng)的數(shù)學描述為:傳遞函數(shù)表示為有理函數(shù)形式:
。MATLAB中使用tf函數(shù)建立傳遞函數(shù)。語法:G=tf(num,den) %由傳遞函數(shù)分子、分母得出說明:num為分子向量,num=[b1,b2,…,bm,bm+1];den為分母向量,den=[a1,a2,…,an
1,an]?!纠?.1_2】將二階系統(tǒng)描述為傳遞函數(shù)的形式。>>num=1;>>den=[11.4141];>>G=tf(num,den) %得出傳遞函數(shù)G=1-----------------s^2+1.414s+1Continuous-timetransferfunction.03零極點描述法
零極點描述法
傳遞函數(shù)的零極點形式為:其中:k是系統(tǒng)增益,zi(i=1,2,…)是系統(tǒng)零點,pj(j=1,2,…)是系統(tǒng)極點。MATLAB中使用zpk函數(shù)可以由零極點得到傳遞函數(shù)模型。語法:G=zpk(z,p,k) %由零點、極點和增益獲得零極點描述法
【例6.1_3】得出二階系統(tǒng)的零極點,并得出傳遞函數(shù)。>>z=roots(num)z=
空的0×1double
列向量>>p=roots(den)p=-0.7070+0.7072i-0.7070-0.7072i>>zpk(z,p,1)ans=1------------------(s^2+1.414s+1)Continuous-timezero/pole/gainmodel.零極點描述法
控制系統(tǒng)的傳遞函數(shù)也可以用部分分式法表示,部分分式法可以歸類于零極點增益描述法。部分分式法是將傳遞函數(shù)表示成部分分式或留數(shù)形式:【例6.1_4】將傳遞函數(shù)轉(zhuǎn)換成部分分式法,得出各系數(shù)。>>[r,p,k]=residue(num,den)r=0.0000-0.7070i0.0000+0.7070ip=-0.7070+0.7072i-0.7070-0.7072ik=[]04離散系統(tǒng)的數(shù)學描述狀態(tài)空間描述法脈沖傳遞函數(shù)描述法零極點增益描述法離散系統(tǒng)的數(shù)學描述1.狀態(tài)空間描述法線性時不變離散系統(tǒng)可以用一組差分方程表示:說明:u為輸入向量,x為狀態(tài)向量,y為輸出向量,n為采樣時刻。狀態(tài)空間描述離散系統(tǒng)也可使用ss和dss函數(shù)。語法:G=ss(a,b,c,d,Ts) %由a、b、c、d參數(shù)獲得狀態(tài)方程模型G=dss(a,b,c,d,e,Ts) %由a、b、c、d、e參數(shù)獲得狀態(tài)方程模型離散系統(tǒng)的數(shù)學描述【例6.2_1】用狀態(tài)空間法建立離散系統(tǒng)。>>a=[-1.5-0.5;10];>>b=[1;0];>>c=[00.5];>>d=0;>>G=ss(a,b,c,d,0.1) %采樣周期為0.1sG=A=x1x2x1-1.5-0.5x210
B=u1x11x20
C=x1x2y100.5
D=u1y10Sampletime:0.1secondsDiscrete-timestate-spacemodel.離散系統(tǒng)的數(shù)學描述2.脈沖傳遞函數(shù)描述法將離散系統(tǒng)的狀態(tài)方程描述變換為脈沖傳遞函數(shù),脈沖傳遞函數(shù)的等效表達式為:其脈沖傳遞函數(shù)形式為:脈沖傳遞函數(shù)也可以用tf函數(shù)實現(xiàn)。語法:G=tf(num,den,Ts) %由分子、分母得出脈沖傳遞函數(shù)說明:Ts為采樣周期,為標量,當采樣周期未指明時可以用
1表示,自變量用z表示。離散系統(tǒng)的數(shù)學描述【例6.2_2】創(chuàng)建離散系統(tǒng)脈沖傳遞函數(shù)
。>>num1=[0.50];>>den
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- ?;纷鳂I(yè)人員安全責任書
- 城市道路無障礙設(shè)施建設(shè)合同模板
- 汽車保險公司顧客停車
- 辦公室節(jié)能減排行動框架
- 電力工程數(shù)據(jù)分析合同范本
- 社會責任首席評估師管理辦法
- 養(yǎng)殖場兼職員工合同樣本
- 廣告公司協(xié)議休假管理辦法
- 咨詢策劃商標使用策略
- 虛擬現(xiàn)實訴訟手冊
- 消防工程分部分項檢驗批劃分表
- 品牌授權(quán)書范本中英文版
- 中國地圖(WORD版標準地圖-可編輯)(共3頁)
- 《神奇的海洋動物》PPT課件.ppt
- 組織認同研究新進展-基本概念及其形成、整合機制
- 股票分析入門整理-入眠
- 山東預(yù)拌砂漿生產(chǎn)企業(yè)備案登記
- 小學四年級班家長會班主任PPT課件
- 雙師同堂課題中期報告
- 怎樣提出好的改善提案5篇
- 《服裝市場營銷》課程標準.
評論
0/150
提交評論