版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章MATLAB程序設(shè)計(jì)——程序流程控制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)。這兩種
語(yǔ)句結(jié)構(gòu)不完全相同,各有各的特點(diǎn)。語(yǔ)法:for循環(huán)變量=array
循環(huán)體end說(shuō)明:循環(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計(jì)算的結(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計(jì)算結(jié)果如下:sum=111111程序分析:循環(huán)變量n對(duì)應(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ù)不確定。語(yǔ)法:while表達(dá)式
循環(huán)體end說(shuō)明:只要表達(dá)式為邏輯真,就執(zhí)行循環(huán)體;一旦表達(dá)式為邏輯假,就結(jié)束循環(huán)。表達(dá)式可以是向量也可以是矩陣。如果表達(dá)式為矩陣,則當(dāng)所有的元素都為真時(shí)才執(zhí)行循環(huán)體;如果表達(dá)式為nan,MATLAB認(rèn)為是假,就不執(zhí)行循環(huán)體。while…end循環(huán)結(jié)構(gòu)
【例5.3】根據(jù)
,求y<3時(shí)的最大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) 計(jì)算結(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)是最常見(jiàn)的條件轉(zhuǎn)移結(jié)構(gòu)。語(yǔ)法:if條件式1
語(yǔ)句段1elseif條件式2
語(yǔ)句段2
…else
語(yǔ)句段(n+1)end說(shuō)明:當(dāng)有多個(gè)條件時(shí),條件式1為假再判斷elseif的條件式2,如果所有的條件式都不滿(mǎn)足,則執(zhí)行else的語(yǔ)句段(n+1);當(dāng)某個(gè)條件式為真時(shí)則執(zhí)行相應(yīng)的語(yǔ)句段。
if…else…end條件轉(zhuǎn)移結(jié)構(gòu)
【例5.4】根據(jù)不同的分段表達(dá)式
,繪制分段函數(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開(kāi)關(guān)結(jié)構(gòu)
switch…case開(kāi)關(guān)結(jié)構(gòu)
switch…case開(kāi)關(guān)結(jié)構(gòu)是有多個(gè)分支結(jié)構(gòu)的條件轉(zhuǎn)移結(jié)構(gòu)。語(yǔ)法:switch開(kāi)關(guān)表達(dá)式case表達(dá)式1
語(yǔ)句段1case表達(dá)式2
語(yǔ)句段2
…otherwise
語(yǔ)句段nend說(shuō)明:(1)將開(kāi)關(guān)表達(dá)式依次與case后面的表達(dá)式進(jìn)行比較,如果表達(dá)式1不滿(mǎn)足,則與下一個(gè)表達(dá)式2比較,如果都不滿(mǎn)足則執(zhí)行otherwise后面的語(yǔ)句段n;一旦開(kāi)關(guān)表達(dá)式與某個(gè)表達(dá)式相等,則執(zhí)行其后面的語(yǔ)句段。(2)開(kāi)關(guān)表達(dá)式只能是標(biāo)量或字符串。(3)case后面的表達(dá)式可以是標(biāo)量、字符串或元胞數(shù)組,如果是元胞數(shù)組則將開(kāi)關(guān)表達(dá)式與元胞數(shù)組的所有元素進(jìn)行比較,只要某個(gè)元素與開(kāi)關(guān)表達(dá)式相等,就執(zhí)行其后的語(yǔ)句段。switch…case開(kāi)關(guān)結(jié)構(gòu)
【例5.5】用switch…case開(kāi)關(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,這種語(yǔ)句結(jié)構(gòu)是其他很多語(yǔ)言所沒(méi)有的。語(yǔ)法:try
語(yǔ)句段1catch
語(yǔ)句段2end說(shuō)明:首先試探性地執(zhí)行語(yǔ)句段1,如果在此段語(yǔ)句執(zhí)行過(guò)程中出現(xiàn)錯(cuò)誤,則將錯(cuò)誤信息賦給保留的lasterr變量,并放棄該段語(yǔ)句,轉(zhuǎn)而執(zhí)行語(yǔ)句段2中的語(yǔ)句;當(dāng)執(zhí)行語(yǔ)句段2又出現(xiàn)錯(cuò)誤,則終止該結(jié)構(gòu)。try…catch…end試探結(jié)構(gòu)
【例5.6】用try…catch…end結(jié)構(gòu)進(jìn)行矩陣相乘運(yùn)算。n=4;a=magic(n);m=3;b=eye(3);try c=a*bcatch c=a(1:m,1:m)*bendlasterr計(jì)算結(jié)果如下:c= 16 2 3 5 11 10 9 7 6try…catch…end試探結(jié)構(gòu)
用lasterr函數(shù)查看出錯(cuò)原因顯示如下:'錯(cuò)誤使用*
用于矩陣乘法的維度不正確。請(qǐng)檢查并確保第一個(gè)矩陣中的列數(shù)與第二個(gè)矩陣中的行數(shù)匹配。要執(zhí)行按元素相乘,請(qǐng)使用'.*'。'程序分析:試探出矩陣的大小不匹配時(shí),矩陣無(wú)法相乘,則再執(zhí)行catch后面的語(yǔ)句段,將a的子矩陣取出與b矩陣相乘??梢酝ㄟ^(guò)這種結(jié)構(gòu)靈活地實(shí)現(xiàn)矩陣的乘法運(yùn)算。06流程控制語(yǔ)句
“break”命令“continue”命令“return”命令“pause”命令“keyboard”命令“input”命令流程控制語(yǔ)句
1.“break”命令“break”命令可以使包含break的最內(nèi)層的for或while語(yǔ)句強(qiáng)制終止,立即跳出該結(jié)構(gòu),執(zhí)行end后面的命令?!癰reak”命令一般和if結(jié)構(gòu)結(jié)合使用?!纠?.7】為【例5.3】增加條件,用if與“break”命令結(jié)合,停止while循環(huán)。計(jì)算
值,當(dāng)y≥3時(shí)終止計(jì)算。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) 流程控制語(yǔ)句
計(jì)算結(jié)果如下:mn=56my=2.9944程序分析:while…end循環(huán)結(jié)構(gòu)嵌套if…else…end分支結(jié)構(gòu),當(dāng)y>=3時(shí)跳出while循環(huán)結(jié)構(gòu),終止循環(huán)。流程控制語(yǔ)句
2.“continue”命令“continue”命令用于結(jié)束本次for或while循環(huán),與“break”命令不同的是,“continue”命令只結(jié)束本次循環(huán)而繼續(xù)進(jìn)行下次循環(huán)?!纠?.8】將if與“continue”命令結(jié)合,計(jì)算1~100中除了5的倍數(shù)之外的所有整數(shù)的和。sum=0;forn=1:100 ifmod(n,5)==0 continue; %能被整除就跳出本次外循環(huán) else sum=sum+n; endendsum計(jì)算結(jié)果如下:sum= 4000流程控制語(yǔ)句
3.“return”命令“return”命令用于終止當(dāng)前命令的執(zhí)行,并且立即返回到上一級(jí)調(diào)用函數(shù)或等待鍵盤(pán)輸入命令,可以用來(lái)提前結(jié)束程序的運(yùn)行?!皉eturn”命令也可以用來(lái)終止鍵盤(pán)方式。4.“pause”命令“pause”命令用來(lái)使程序運(yùn)行暫停,等待用戶(hù)按任意鍵繼續(xù),用于程序調(diào)試或查看中間結(jié)果,也可以用來(lái)控制動(dòng)畫(huà)執(zhí)行的速度。語(yǔ)法:pause %暫停pause(n) %暫停n秒5.“keyboard”命令“keyboard”命令用來(lái)使程序暫停運(yùn)行,等待鍵盤(pán)命令,執(zhí)行完自己的工作后,輸入return語(yǔ)句,程序就繼續(xù)運(yùn)行?!発eyboard”命令可以用來(lái)在程序調(diào)試或程序執(zhí)行時(shí)修改變量。流程控制語(yǔ)句
6.“input”命令“input”命令用來(lái)提示用戶(hù)應(yīng)從鍵盤(pán)輸入數(shù)值、字符串和表達(dá)式,并接受該輸入?!癷nput”命令常用的幾種格式如下:>>a=input('inputanumber:') %輸入數(shù)值給ainputanumber:45a= 45>>b=input('inputanumber:','s’) %輸入字符串給binputanumber:45b= 45>>input('inputanumber:') %將輸入值進(jìn)行運(yùn)算inputanumber:2+3ans= 507循環(huán)結(jié)構(gòu)與動(dòng)畫(huà)
以電影方式產(chǎn)生動(dòng)畫(huà)以對(duì)象方式產(chǎn)生動(dòng)畫(huà)使用animatedline對(duì)象產(chǎn)生動(dòng)畫(huà)曲線循環(huán)結(jié)構(gòu)與動(dòng)畫(huà)
1.以電影方式產(chǎn)生動(dòng)畫(huà)以電影方式產(chǎn)生動(dòng)畫(huà),有以下兩個(gè)步驟:(1)使用getframe命令抓取圖形作為畫(huà)面,每個(gè)畫(huà)面都是以1個(gè)列向量的
方式,置于存放整個(gè)電影的矩陣M中。(2)使用movie(M,k)命令播放電影,并可指定矩陣M播放的重復(fù)次數(shù)k?!纠?.9】使用電影方式制作動(dòng)畫(huà)并顯示。t=-pi:0.1:pi;n=length(t)forii=1:n %循環(huán)次數(shù)由橫坐標(biāo)長(zhǎng)度決定
x=-pi:0.1:t(ii);y=sin(2*x);z=cos(x);plot3(x,y,z) %繪制曲線axis([-4,4,-1,1,-1,1]); %確定坐標(biāo)軸范圍M(ii)=getframe; %抓取畫(huà)面endmovie(M) %播放數(shù)組M的畫(huà)面循環(huán)結(jié)構(gòu)與動(dòng)畫(huà)
運(yùn)行程序顯示的最后一幅畫(huà)面如圖。循環(huán)結(jié)構(gòu)與動(dòng)畫(huà)
2.以對(duì)象方式產(chǎn)生動(dòng)畫(huà)以對(duì)象方式產(chǎn)生動(dòng)畫(huà)時(shí),使用MATLAB句柄圖形的概念,所有的曲線或曲面均可被視為一個(gè)對(duì)象,對(duì)其中的每個(gè)對(duì)象都可以通過(guò)屬性設(shè)置進(jìn)行修改。以對(duì)象方式產(chǎn)生動(dòng)畫(huà)就是擦除舊對(duì)象,產(chǎn)生與舊對(duì)象相似但不同的新對(duì)象,這樣既不破壞背景又可以看到動(dòng)畫(huà)的效果。產(chǎn)生移動(dòng)的動(dòng)畫(huà)效果需要首先計(jì)算對(duì)象的新位置,并在新位置上顯示出對(duì)象;然后擦除原位置上的舊對(duì)象,并刷新屏幕。(1)擦除屬性EraseMode以對(duì)象方式產(chǎn)生動(dòng)畫(huà)需要設(shè)置EraseMode屬性。EraseMode為1個(gè)字符串,代表對(duì)象的擦除方式,即對(duì)于舊對(duì)象的處理方式。EraseMode屬性有以下幾種。①normal:計(jì)算整個(gè)畫(huà)面的數(shù)據(jù),重畫(huà)整個(gè)圖形。②xor:將舊對(duì)象的點(diǎn)以xor的方式還原,即只畫(huà)與屏幕色不一致的新對(duì)象點(diǎn),擦除不一致的原對(duì)象點(diǎn),這種方式不會(huì)擦除被擦對(duì)象下面的其他圖像。③background:將舊對(duì)象的點(diǎn)變成背景顏色,實(shí)現(xiàn)擦除,這種方式會(huì)擦除被擦對(duì)象下的其他圖像。④none:保留舊對(duì)象的點(diǎn),不進(jìn)行任何擦除。循環(huán)結(jié)構(gòu)與動(dòng)畫(huà)
(2)對(duì)象的位置屬性通常在動(dòng)畫(huà)過(guò)程中,會(huì)改變對(duì)象的位置、尺寸或顏色等外觀屬性。位置屬性有如下兩種。①xdata:為1個(gè)向量,代表對(duì)象的x坐標(biāo)值。②ydata:為1個(gè)向量,代表對(duì)象的y坐標(biāo)值。(3)屏幕刷新當(dāng)新對(duì)象的屬性設(shè)置后,應(yīng)刷新屏幕,使新對(duì)象顯示出來(lái),刷新屏幕用“drawnow”命令實(shí)現(xiàn)?!癲rawnow”命令使MATLAB暫停當(dāng)前的任務(wù)序列而去刷新屏幕。如果沒(méi)有“drawnow”命令,MATLAB則會(huì)等當(dāng)前的任務(wù)序列執(zhí)行完才去刷新屏幕。(4)產(chǎn)生動(dòng)畫(huà)產(chǎn)生動(dòng)畫(huà)的具體步驟是:首先產(chǎn)生1個(gè)對(duì)象,其EraseMode屬性為xor、background或none;然后在循環(huán)中產(chǎn)生動(dòng)畫(huà),每次循環(huán)改變此對(duì)象的xdata或ydata(或兩者);最后使用“drawnow”命令刷新屏幕。循環(huán)結(jié)構(gòu)與動(dòng)畫(huà)
【例5.10】使用對(duì)象方式產(chǎn)生1個(gè)紅色的小球沿著曲線運(yùn)行。>>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)與動(dòng)畫(huà)
運(yùn)行程序顯示最終畫(huà)面如圖。循環(huán)結(jié)構(gòu)與動(dòng)畫(huà)
3.使用animatedline對(duì)象產(chǎn)生動(dòng)畫(huà)曲線MATLAB還提供了專(zhuān)門(mén)的animatedline對(duì)象實(shí)現(xiàn)動(dòng)畫(huà)曲線,使用addpoints來(lái)一點(diǎn)一點(diǎn)地繪制曲線上的點(diǎn)?!纠?.11】使用animatedline對(duì)象實(shí)現(xiàn)動(dòng)畫(huà)繪制曲線。h=animatedline; %創(chuàng)建動(dòng)畫(huà)對(duì)象x=0:0.1:3*pi;y=sin(x);z=cos(x);axisequal
forn=1:length(x)addpoints(h,y(n),z(n)); %動(dòng)畫(huà)畫(huà)點(diǎn)drawnow %刷新屏幕end循環(huán)結(jié)構(gòu)與動(dòng)畫(huà)
繪制的動(dòng)畫(huà)如圖。第5章MATLAB程序設(shè)計(jì)——M文件01M文件編輯器
M文件編輯器
單擊MATLAB主頁(yè)面板工具欄“文件”區(qū)的(新建腳本)按鈕,或者單擊(新建)按鈕選擇“腳本”命令,可創(chuàng)建空白的M腳本文件;而單擊(新建)按鈕選擇“函數(shù)”命令,創(chuàng)建的則是空白的M函數(shù)文件。如圖(a)所示為M腳本文件編輯器,如圖(b)所示為M函數(shù)文件編輯器。
02M腳本文件M腳本文件腳本文件具有如下特點(diǎn):(1)腳本文件中的命令格式和前后位置,與在命令行窗口中輸入時(shí)沒(méi)有任何區(qū)別。(2)MATLAB在運(yùn)行腳本文件時(shí),只是簡(jiǎn)單地按順序從文件中讀取一條條命令,送到MATLAB命令行窗口中去執(zhí)行。(3)與在命令行窗口中直接運(yùn)行命令一樣,腳本文件運(yùn)行產(chǎn)生的變量都駐留在MATLAB的工作區(qū)中,可以很方便地查看變量,除非用“clear”命令清除;腳本文件的命令也可以訪問(wèn)工作區(qū)的所有數(shù)據(jù),為此要注意避免變量的覆蓋而造成程序出錯(cuò)。M腳本文件【例5.12】在M文件編輯/調(diào)試器窗口中編寫(xiě)M腳本文件,繪制二階系統(tǒng)的多條時(shí)域曲線。欠阻尼系統(tǒng)的時(shí)域輸出y與x的關(guān)系為
。(1)單擊MATLAB主頁(yè)面板工具欄“文件”區(qū)的(新建腳本)按鈕,打開(kāi)M文件編輯器。(2)將命令全部寫(xiě)入M文件編輯器中,為了能夠標(biāo)識(shí)該文件的名稱(chēng),在第1行寫(xiě)入包含文件名的注釋。保存文件為“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') %畫(huà)阻尼系數(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') %畫(huà)阻尼系數(shù)為0.707的曲線y3=1-exp(-x).*(1+x)plot(x,y3,'b') %畫(huà)阻尼系數(shù)為1的曲線說(shuō)明:“holdon”表示保存plot(x,y1,'r')畫(huà)圖結(jié)果再plot(x,y2,'g')和plot(x,y3,'b'),否則運(yùn)行結(jié)果圖上只能看到最后plot(x,y3,'b')畫(huà)圖結(jié)果?!癶oldoff”可以關(guān)閉保持繪圖功能。M腳本文件(3)在M文件編輯器的編輯器面板工具欄“運(yùn)行”區(qū)單擊(運(yùn)行)按鈕,打開(kāi)運(yùn)行界面如圖。M腳本文件查看工作區(qū)的變量如下:>>whosNameSizeBytesClassAttributesx1x2011608doubley11x2011608doubley21x2011608doubley31x2011608double03M函數(shù)文件
M函數(shù)文件的基本格式說(shuō)明M函數(shù)文件的執(zhí)行M函數(shù)文件
1.M函數(shù)文件的基本格式說(shuō)明M函數(shù)文件的基本格式如下:函數(shù)聲明行%H1行%在線幫助文本%編寫(xiě)和修改記錄函數(shù)體說(shuō)明:(1)函數(shù)聲明行以“function”引導(dǎo),是M函數(shù)文件必須有的,而M腳本文件沒(méi)有;函數(shù)名和文件名一致,當(dāng)不一致時(shí),MATLAB以文件名為準(zhǔn)。例如Ex0502函數(shù)保存在Ex0502.m文件中。函數(shù)聲明行的格式如下:function[輸出變量列表=]函數(shù)名(輸入變量列表)(2)H1行通常包含大寫(xiě)的函數(shù)文件名,可以提供help和lookfor關(guān)鍵詞用于查詢(xún)。(3)在線幫助文本通常包含函數(shù)輸入、輸出變量的含義和格式說(shuō)明。(4)編寫(xiě)和修改記錄一般在空1行后,記錄作者、日期和版本記錄,用于軟件檔案管理。(5)函數(shù)體由MATLAB的命令或者通過(guò)流程控制結(jié)構(gòu)組織的命令組成,通過(guò)函數(shù)體實(shí)現(xiàn)函數(shù)的功能。M函數(shù)文件
在MATLAB主頁(yè)面板工具欄“文件”區(qū)單擊(新建)按鈕選擇“函數(shù)”命令,則會(huì)創(chuàng)建一個(gè)新的函數(shù)文件并自動(dòng)生成函數(shù)語(yǔ)句,內(nèi)容如下:function[outputArg1,outputArg2]=untitled(inputArg1,inputArg2)%UNTITLED此處顯示有關(guān)此函數(shù)的摘要%此處顯示詳細(xì)說(shuō)明outputArg1=inputArg1;outputArg2=inputArg2;endM函數(shù)文件
2.M函數(shù)文件的執(zhí)行M函數(shù)文件的函數(shù)通過(guò)調(diào)用才會(huì)被執(zhí)行,通過(guò)函數(shù)名調(diào)用函數(shù),如果函數(shù)包含輸入?yún)?shù),調(diào)用時(shí)帶變量或者常量賦值輸入?yún)?shù),如果函數(shù)包含輸出參數(shù),調(diào)用時(shí)可以賦值對(duì)應(yīng)的變量,也可以不接收輸出值。函數(shù)執(zhí)行時(shí)應(yīng)注意下列幾點(diǎn):(1)函數(shù)文件在運(yùn)行過(guò)程中產(chǎn)生的變量都存放在函數(shù)本身的工作區(qū)中。(2)當(dāng)結(jié)束函數(shù)文件的運(yùn)行,函數(shù)工作區(qū)的變量被清除。(3)函數(shù)的工作區(qū)隨具體的M函數(shù)文件調(diào)用而產(chǎn)生,隨調(diào)用結(jié)束而刪除,是獨(dú)立的、臨時(shí)的。在MATLAB運(yùn)行過(guò)程中可以產(chǎn)生任意多個(gè)臨時(shí)的函數(shù)工作區(qū)。M函數(shù)文件
【例5.13】在M文件編輯/調(diào)試器窗口編寫(xiě)計(jì)算二階系統(tǒng)時(shí)域響應(yīng)的M函數(shù)文件,并在MATLAB命令行窗口中調(diào)用該文件。(1)修改系統(tǒng)生成的默認(rèn)函數(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ù)為時(shí)域響應(yīng)y。M函數(shù)文件
(2)文件幫助和搜索在命令行窗口輸入幫助命令:>>helpEx0513Ex0513二階系統(tǒng)階躍響應(yīng)曲線copyright2023-05-23“help”命令顯示M文件的第1個(gè)連續(xù)注釋塊。在命令行窗口輸入幫助命令:>>lookforEx0513Ex0513-二階系統(tǒng)階躍響應(yīng)曲線“l(fā)ookfor文件”命令查找的必須是MATLAB搜索路徑上的文件,顯示指定文件的第1行注釋?zhuān)⑨屩邪撐募?。M函數(shù)文件
(3)調(diào)用函數(shù)執(zhí)行接收函數(shù)返回結(jié)果在MATLAB命令行窗口輸入以下命令:>>f=Ex0513(0.3)說(shuō)明:調(diào)用Ex0513函數(shù),0.3作為輸入?yún)?shù)zeta值。輸出參數(shù)y賦值給f。此后,在調(diào)用函數(shù)的程序中可以使用f變量。運(yùn)行結(jié)果命令窗口顯示f值,同時(shí)創(chuàng)建繪圖窗口繪制曲線。如果“f=Ex0513(0.3);”調(diào)用函數(shù),則f雖然賦值,但不會(huì)顯示值。M函數(shù)文件
(4)不接收函數(shù)返回結(jié)果在MATLAB命令行窗口輸入以下命令:>>Ex0513(0.3)運(yùn)行結(jié)果則會(huì)命令窗口顯示y值,同時(shí)創(chuàng)建繪圖窗口繪制曲線。因?yàn)閥是函數(shù)中的,調(diào)用后就已經(jīng)消除。(5)函數(shù)定義時(shí)不包含輸出參數(shù)functionEx0513(zeta).......調(diào)用Ex0513函數(shù),命令窗口就不會(huì)顯示任何值。第5章MATLAB程序設(shè)計(jì)——函數(shù)調(diào)用和參數(shù)傳遞01子函數(shù)和私有函數(shù)
子函數(shù)私有函數(shù)調(diào)用函數(shù)的搜索順序子函數(shù)和私有函數(shù)
1.子函數(shù)在1個(gè)M函數(shù)文件中,可以包含1個(gè)以上的函數(shù),其中只有一個(gè)是主函數(shù),其他均為子函數(shù)。(1)在1個(gè)M文件中,主函數(shù)必須出現(xiàn)在最上方,其后是子函數(shù),子函數(shù)的次序無(wú)任何限制。(2)子函數(shù)不能被其他文件的函數(shù)調(diào)用,只能被同一文件中的函數(shù)(可以是主函數(shù)或子函數(shù))調(diào)用。(3)同一文件的主函數(shù)和子函數(shù)變量的工作區(qū)相互獨(dú)立。(4)用“help”和“l(fā)ookfor”命令不能提供子函數(shù)的幫助信息。子函數(shù)和私有函數(shù)
【例5.14】將畫(huà)二階系統(tǒng)時(shí)域曲線的函數(shù)作為子函數(shù),編寫(xiě)畫(huà)多條曲線的程序。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ù):畫(huà)二階系統(tǒng)時(shí)域曲線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ù)對(duì)其他目錄的文件是不可見(jiàn)的,私有函數(shù)可以和其他目錄下的函數(shù)重名。(2)私有函數(shù)父目錄的M腳本文件也不可調(diào)用私有函數(shù)。(3)在函數(shù)調(diào)用搜索時(shí),私有函數(shù)優(yōu)先于其他MATLAB路徑上的函數(shù)。3.調(diào)用函數(shù)的搜索順序在MATLAB中調(diào)用1個(gè)函數(shù),搜索的順序如下:(1)查找是否為子函數(shù)。(2)查找是否為私有函數(shù)。(3)從當(dāng)前路徑中搜索此函數(shù)。(4)從搜索路徑中搜索此函數(shù)。02局部變量和全局變量
局部變量全局變量局部變量和全局變量
1.局部變量局部變量(LocalVariables)是在函數(shù)體內(nèi)部使用的變量,其影響范圍只能在本函數(shù)內(nèi);每個(gè)函數(shù)在運(yùn)行時(shí),都占用獨(dú)立的函數(shù)工作區(qū),此工作區(qū)和MATLAB的工作區(qū)是相互獨(dú)立的。局部變量?jī)H存在于函數(shù)的工作區(qū)內(nèi),只在函數(shù)執(zhí)行期間存在,當(dāng)函數(shù)執(zhí)行完變量就消失。2.全局變量全局變量(GlobalVariables)是可以在不同的函數(shù)工作區(qū)和MATLAB工作區(qū)中共享使用的變量。全局變量在使用前必須用global定義,而且每個(gè)要共享全局變量的函數(shù)和工作區(qū)都必須逐個(gè)用global對(duì)變量加以定義。局部變量和全局變量
【例5.15】修改【例5.14】,在主函數(shù)和子函數(shù)中使用全局變量。functionEx0515()%EX0515 使用全局變量繪制二階系統(tǒng)時(shí)域響應(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ù),畫(huà)二階系統(tǒng)時(shí)域曲線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ù)
在一個(gè)父函數(shù)中可以嵌套多個(gè)子函數(shù),也可以多層嵌套;但是嵌套函數(shù)不能出現(xiàn)在if結(jié)構(gòu)、switch結(jié)構(gòu)、for循環(huán)、do…while循環(huán)和try…catch結(jié)構(gòu)中;每個(gè)函數(shù)都必須以“end”結(jié)束。【例5.16】繪制函數(shù)表達(dá)式
的曲線,輸入?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ù),就可以直接使用。當(dāng)輸入?yún)?shù)為10時(shí)繪制的曲線如圖。>>s=Ex0516(10)04函數(shù)的參數(shù)參數(shù)傳遞規(guī)則函數(shù)參數(shù)的個(gè)數(shù)函數(shù)的參數(shù)MATLAB的函數(shù)調(diào)用過(guò)程實(shí)際上就是參數(shù)傳遞的過(guò)程。函數(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)系就是通過(guò)函數(shù)的輸入/輸出參數(shù)。輸入?yún)?shù)在函數(shù)中的任何變化,都僅在函數(shù)內(nèi)進(jìn)行,不會(huì)傳遞回去。函數(shù)的參數(shù)【例5.17】修改畫(huà)二階系統(tǒng)時(shí)域的函數(shù),使用輸入/輸出參數(shù)來(lái)實(shí)現(xiàn)參數(shù)傳遞。functionEx0517()%EX0517參數(shù)傳遞繪制二階系統(tǒng)時(shí)域響應(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ù),畫(huà)二階系統(tǒng)時(shí)域曲線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)用時(shí)將z1傳遞給子函數(shù)zeta,子函數(shù)計(jì)算后將輸出參數(shù)x和y傳回給主函數(shù)的x1、y1;主函數(shù)調(diào)用子函數(shù)3次,后面兩次參數(shù)的傳遞也是同樣的。函數(shù)的參數(shù)2.函數(shù)參數(shù)的個(gè)數(shù)(1)nargin變量和nargout變量在MATLAB中有兩個(gè)特殊變量:nargin和nargout,函數(shù)的輸入/輸出參數(shù)的個(gè)數(shù)可以通過(guò)它們獲得,nargin用于獲得輸入?yún)?shù)的個(gè)數(shù),nargout用于獲得輸出參數(shù)的個(gè)數(shù)。語(yǔ)法:nargin %在函數(shù)體內(nèi)獲取實(shí)際輸入變量的個(gè)數(shù)nargout %在函數(shù)體內(nèi)獲取實(shí)際輸出變量的個(gè)數(shù)nargin('fun') %在函數(shù)體外獲取定義的輸入?yún)?shù)個(gè)數(shù)nargout('fun') %在函數(shù)體外獲取定義的輸出參數(shù)個(gè)數(shù)函數(shù)的參數(shù)【例5.18_1】計(jì)算兩個(gè)數(shù)的和,根據(jù)輸入?yún)?shù)個(gè)數(shù)的不同使用不同的運(yùn)算表達(dá)式。function[sum,n]=Ex0518(x,y)%EX0518 參數(shù)個(gè)數(shù)可變,計(jì)算x和y的和ifnargin==1 sum=x+0; %若輸入1個(gè)參數(shù)就計(jì)算與0的和 n=1elseifnargin==0 sum=0; %若無(wú)輸入?yún)?shù)就輸出0 n=0;else sum=x+y; %若輸入的是2個(gè)參數(shù)則計(jì)算其和 n=2;endend函數(shù)的參數(shù)在命令行窗口調(diào)用Ex0518函數(shù),分別使用2個(gè)、1個(gè)和無(wú)輸入?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ù)個(gè)數(shù),則會(huì)出錯(cuò)。>>[y,n]=Ex0518(1,2,3)錯(cuò)誤使用Ex0518輸入?yún)?shù)太多。
也可以在工作區(qū)查看函數(shù)體定義的輸入?yún)?shù)個(gè)數(shù)。>>nargin('Ex0518')ans= 2函數(shù)的參數(shù)【例5.18_2】添加以下程序,查看用nargout變量獲取輸出參數(shù)個(gè)數(shù)。ifnargout==0 %當(dāng)輸出參數(shù)個(gè)數(shù)為0時(shí),運(yùn)算結(jié)果為0
sum=0;end在命令行窗口調(diào)用Ex0518函數(shù),當(dāng)輸出參數(shù)格式不同時(shí),結(jié)果如下。>>Ex0518(2,3) %當(dāng)輸出參數(shù)個(gè)數(shù)為0時(shí)ans= 0>>y=Ex0518(2,3) %當(dāng)輸出參數(shù)個(gè)數(shù)為1時(shí)y= 5>>[y,n,x]=Ex0518 %當(dāng)輸出參數(shù)個(gè)數(shù)太多時(shí)錯(cuò)誤使用Ex0518輸出參數(shù)太多。
函數(shù)的參數(shù)(2)varargin變量和varargout變量MATLAB還有兩個(gè)特殊變量:varargin和varargout,可以獲得輸入/輸出變量的各元素內(nèi)容,varargin和varargout都是元胞數(shù)組?!纠?.18_3】計(jì)算所有輸入變量的和。function[y,n]=Ex0518(varargin)%EX0518 使用可變參數(shù)vararginifnargin==0 %當(dāng)沒(méi)有輸入變量時(shí)輸出0 disp('NoInputvariables.') y=0; n=0;elseifnargin==1 %當(dāng)有一個(gè)輸入變量時(shí),輸出該數(shù)
y=varargin{1}; n=1;else n=nargin; y=0; n=2; form=1:n y=varargin{m}+y; %當(dāng)有多個(gè)輸入變量時(shí),取輸入變量循環(huán)相加 endendn=nargin;函數(shù)的參數(shù)在MATLAB的命令行窗口中輸入不同個(gè)數(shù)的變量調(diào)用函數(shù)Ex0518,結(jié)果如下:>>[y,n]=Ex0518(1,2,3,4) %輸入4個(gè)參數(shù)y= 3n= 4>>[y,n]=Ex0518(1) %輸入1個(gè)參數(shù)y= 1n= 1>>[y,n]=Ex0518 %無(wú)輸入?yún)?shù)NoInputvariables.y= 0n= 0函數(shù)的參數(shù)(3)參數(shù)省略符號(hào)“~”對(duì)于參數(shù)個(gè)數(shù)變化另外一種便捷的方式,就是使用MATLAB提供的“~”符號(hào),表示可以省略的輸入或輸出參數(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ù)對(duì)于輸入?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ù)繪制不同的曲線,每個(gè)子函數(shù)繪制一種曲線。M文件的程序代碼。程序分析:主函數(shù)名為Ex0519,4個(gè)子函數(shù)名分別為po1、po2、po3和po4,文件保存為“Ex0519.m”。若在命令行窗口中輸入以下命令:>>y=Ex0519(1);則產(chǎn)生如圖所示的調(diào)用第一個(gè)子函數(shù)的極坐標(biāo)曲線。程序舉例
【例5.20】編寫(xiě)M函數(shù)文件,通過(guò)流程控制語(yǔ)句,建立如下的矩陣。functiony=Ex0520(m)%Ex0520 用循環(huán)流程控制語(yǔ)句創(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è)計(jì)界面axes1控件中繪制正弦波形。單選按鈕中選擇振幅,列表框中選擇頻率。(1)設(shè)計(jì)界面界面設(shè)計(jì)如圖。程序舉例
(2)回調(diào)函數(shù)回調(diào)函數(shù)需要在單擊“繪制”按鈕(pushbutton1)時(shí)繪制正弦曲線,單擊“關(guān)閉”按鈕(pushbutton2)時(shí)關(guān)閉窗口。編寫(xiě)回調(diào)函數(shù)的步驟:選擇“繪制”按鈕(pushbutton1),單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“查看回調(diào)”→“Callback”命令,進(jìn)入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被選中項(xiàng)的內(nèi)容x=0:0.1:10;plot(am*sin(fre*x)); %繪制正弦曲線,振幅和頻率根據(jù)選擇得出程序舉例
handles變量非常重要,它是1個(gè)結(jié)構(gòu)數(shù)組,包括以下兩部分內(nèi)容:(1)存儲(chǔ)所有在圖形界面中的控件、菜單、坐標(biāo)軸對(duì)象的句柄,每個(gè)對(duì)象的句柄名稱(chēng)與對(duì)象的“Tag”名相同,如列表listbox1的句柄是“handles.listbox1”。(2)通過(guò)get函數(shù)可以獲得不同對(duì)象的屬性值,例如,get(handles.listbox1,'string')得出9×1的元胞數(shù)組,記錄了所有列表項(xiàng)的值,fre1{n}用來(lái)獲取對(duì)應(yīng)列表項(xiàng)的值;get(handles.listbox1,'value')得出用戶(hù)所選的列表項(xiàng)的索引,如果選擇第一項(xiàng)則為1。程序運(yùn)行界面如圖。第5章MATLAB程序設(shè)計(jì)——利用函數(shù)句柄執(zhí)行函數(shù)01函數(shù)句柄的創(chuàng)建
函數(shù)句柄的創(chuàng)建使用函數(shù)句柄的優(yōu)點(diǎn)函數(shù)句柄的創(chuàng)建
1.函數(shù)句柄的創(chuàng)建與圖形對(duì)象的句柄不同,函數(shù)句柄不是在函數(shù)文件創(chuàng)建時(shí)自動(dòng)創(chuàng)建的,而是必須通過(guò)專(zhuān)門(mén)的定義。創(chuàng)建函數(shù)句柄使用“@”符號(hào)或“str2func”命令實(shí)現(xiàn)。語(yǔ)法:h_fun=@funh_fun=str2func('fun')說(shuō)明:fun是函數(shù)名,h_fun是函數(shù)句柄。【例5.22】創(chuàng)建MATLAB內(nèi)部函數(shù)的句柄。>>h_sin=@sin;>>h_cos=str2func('cos');函數(shù)句柄的創(chuàng)建
2.使用函數(shù)句柄的優(yōu)點(diǎn)利用函數(shù)句柄執(zhí)行函數(shù)的優(yōu)點(diǎn)有以下幾點(diǎn):(1)在更大范圍內(nèi)調(diào)用函數(shù)。函數(shù)句柄包含了函數(shù)文件的路徑和函數(shù)類(lèi)型,即函數(shù)是否為內(nèi)部函數(shù)、M或P文件、子函數(shù)、私有函數(shù)等。無(wú)論函數(shù)所在的文件是否在搜索路徑上,是否是當(dāng)前路徑,是否是子函數(shù)或私有函數(shù),只要函數(shù)句柄存在,函數(shù)就能夠執(zhí)行。(2)提高函數(shù)調(diào)用的速度。不使用函數(shù)句柄時(shí),對(duì)函數(shù)的每次調(diào)用都要為該函數(shù)進(jìn)行全面的路徑搜索,直接影響了速度。(3)使函數(shù)調(diào)用像使用變量一樣方便、簡(jiǎn)單。(4)可迅速獲得同名重載函數(shù)的位置、類(lèi)型信息。02用feval命令執(zhí)行函數(shù)
用feval命令執(zhí)行函數(shù)
函數(shù)也可以使用feval命令直接執(zhí)行,feval命令可以使用函數(shù)句柄或函數(shù)名。語(yǔ)法:[y1,y2,…]=feval(h_fun,arg1,arg2…)[y1,y2,…]=feval('funname',arg1,arg2…)說(shuō)明:h_fun是函數(shù)句柄;'funname'是函數(shù)名;arg1、arg2…是輸入?yún)?shù);y1、y2…是輸出參數(shù)。在MATLAB的命令行窗口調(diào)用Ex0520函數(shù)來(lái)實(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è)計(jì)——利用泛函命令進(jìn)行數(shù)值分析01求極小值
fminbnd函數(shù)fminsearch函數(shù)求極小值
MATLAB中的函數(shù)fminbnd和fminsearch可以用來(lái)尋找最小值。最大值的求法則可以通過(guò)“f(x)的最大值=
f(x)的最小值”得出。1.fminbnd函數(shù)fminbnd函數(shù)用來(lái)計(jì)算單變量非線性函數(shù)的極小值。語(yǔ)法:[x,y]=fminbnd(h_fun,x1,x2,options)[x,y]=fminbnd('funname',x1,x2,options)說(shuō)明:h_fun是函數(shù)句柄,'funname'是函數(shù)名,必須是單值非線性函數(shù);options是用來(lái)控制算法的參數(shù)向量,默認(rèn)值為0,可省略;x是fun函數(shù)在區(qū)間x1<x<x2上的局部最小值的發(fā)生點(diǎn);y是對(duì)應(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ù)最小值曲線如圖所示,最小值為圖中的圓點(diǎn)(0.6370,11.2528),誤差小于10
4。求極小值2.fminsearch函數(shù)fminsearch函數(shù)用于求多變量無(wú)束縛非線性最小值,采用Nelder-Mead單純形算法求解多變量函數(shù)的最小值。語(yǔ)法:x=fminsearch(h_fun,x0)x=fminsearch('funname',x0)【例5.24】
求著名的Banana測(cè)試函數(shù)f(x,y)=100(y
x2)2+(1
x)2的最小值,它的理論最小值是x=1,y=1。該測(cè)試函數(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)為初始值開(kāi)始搜索求最小值y=1.00001.000002求過(guò)零點(diǎn)
求過(guò)零點(diǎn)
fzero函數(shù)可以尋找一維函數(shù)的零點(diǎn),即求f(x)=0的根。語(yǔ)法:x=fzero(h_fun,x0,tol,trace)x=fzero('funname',x0,tol,trace)說(shuō)明:h_fun是待求零點(diǎn)的函數(shù)句柄;x0有兩個(gè)作用,即預(yù)定待搜索零點(diǎn)的大致位置和搜索起始點(diǎn);tol用來(lái)控制結(jié)果的相對(duì)精度,默認(rèn)值為eps;trace指定迭代信息是否在運(yùn)算中顯示,默認(rèn)為0,表示不顯示迭代信息。tol和trace都可以省略。求過(guò)零點(diǎn)
【例5.25】
求解humps函數(shù)的過(guò)零點(diǎn),humps函數(shù)的過(guò)零點(diǎn)用圓點(diǎn)表示,如圖。>>xzero=fzero(@humps,1) %求在1附近的零點(diǎn)xzero=1.2995>>xzero=fzero(@humps,[0.5,1.5]) %求在0.5~1.5范圍內(nèi)的零點(diǎn)xzero=1.2995>>xzero=fzero(@humps,[0.5,1]) %求在0.5~1范圍內(nèi)的零點(diǎn)錯(cuò)誤使用fzero(第274行)Functionvaluesattheintervalendpointsmustdifferinsign.程序分析:若在0.5~1的范圍內(nèi)找不到零點(diǎn),則提示出錯(cuò)信息。03數(shù)值積分?jǐn)?shù)值積分
函數(shù)quad基于數(shù)學(xué)上的正方形概念計(jì)算函數(shù)的面積,它在所需的區(qū)間計(jì)算被積函數(shù)應(yīng)用遞歸調(diào)用的方法,與trapz梯形比較,能夠進(jìn)行更高階的近似。語(yǔ)法:s=quad(h_fun,x1,x2,tol,trace,p1,p2,…)s=quad('funname',x1,x2,tol,trace,p1,p2,…)說(shuō)明:x1和x2分別是積分的上、下限;tol用來(lái)控制積分精度,省略時(shí)默認(rèn)為0.001;trace取1用圖形展現(xiàn)積分過(guò)程,取0則無(wú)圖形,省略時(shí)默認(rèn)不畫(huà)圖;p1、p2…是向函數(shù)傳遞的參數(shù),可省略。數(shù)值積分【例5.26】
計(jì)算y=humps(x)曲線下面的面積。>>x=0:0.01:1;>>y=humps(x);>>area=trapz(x,y) %用梯形計(jì)算積分area= 29.8571>>area1=quad(@humps,0,1) %用quad計(jì)算積分area1= 29.8583程序分析:用trapz函數(shù)梯形近似可能低估了實(shí)際面積,當(dāng)梯形的寬度變窄時(shí),就能夠得到更精確的結(jié)果。04微分方程的數(shù)值解
微分方程的數(shù)值解
MATLAB提供了ode23、ode45和ode113等多個(gè)函數(shù)求解微分方程的數(shù)值解。以下介紹低維方法、高維方法和變維方法解一階常微分方程組。語(yǔ)法:[t,y]=ode45(h_fun,tspan,y0,options,p1,p2…)[t,y]=ode45('funname',tspan,y0,options,p1,p2…)說(shuō)明:h_fun是函數(shù)句柄,函數(shù)以dx為輸出,以t、y為輸入量;tspan=[起始值終止值],表示積分的起始值和終止值;y0是初始狀態(tài)列向量;options可以定義函數(shù)運(yùn)行時(shí)的參數(shù),可省略;p1、p2…是函數(shù)的輸入?yún)?shù),可省略。微分方程的數(shù)值解
【例5.27】
解經(jīng)典的范德波爾(VanderPol)微分方程:(1)必須把高階微分方程式變換成一階微分方程組。令y1=x,y2=dx/dt,則將二階微分方程變?yōu)橐浑A微分方程組:(2)編寫(xiě)1個(gè)函數(shù)文件“vdpol.m”,設(shè)定
=2,該函數(shù)返回上述導(dǎo)數(shù)值。輸出結(jié)果由1個(gè)列向量yprime給出。y1和y2合并寫(xiě)成列向量y。M函數(shù)文件“vdpol.m”:%范德波爾方程functionyprime=vdpol(t,y)yprime=[y(2);2*(1-y(1)^2)*y(2)-y(1)]微分方程的數(shù)值解
(3)給定當(dāng)前時(shí)間及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') %畫(huà)微分方程解>>figure(2)>>plot(y1,y2) %畫(huà)相平面圖微分方程的數(shù)值解
設(shè)y1為橫坐標(biāo),y2為縱坐標(biāo),則畫(huà)出微分方程波形如圖。微分方程的數(shù)值解
畫(huà)出y1和y2的相平面圖如圖。第5章MATLAB程序設(shè)計(jì)——內(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ù)實(shí)現(xiàn)。語(yǔ)法:inline('string',arg1,arg2,…) %創(chuàng)建內(nèi)聯(lián)函數(shù)說(shuō)明:'string'必須是不帶賦值號(hào)(“=”)的字符串;arg1和arg2是函數(shù)的輸入變量?!纠?.28_1】創(chuàng)建內(nèi)聯(lián)函數(shù),實(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ù)的信息。語(yǔ)法:char(inline_fun) %查看內(nèi)聯(lián)函數(shù)的內(nèi)容class(inline_fun) %查看內(nèi)聯(lián)函數(shù)的類(lèi)型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ù)組運(yùn)算內(nèi)聯(lián)函數(shù)的輸入變量不能是數(shù)組,但可以使用vectorize函數(shù)將內(nèi)聯(lián)函數(shù)適用于數(shù)組運(yùn)算。語(yǔ)法:vectorize(inline_fun) %使內(nèi)聯(lián)函數(shù)適用于數(shù)組運(yùn)算【例5.28_3】使內(nèi)聯(lián)函數(shù)適用于數(shù)組運(yùn)算。>>ff=vectorize(f) %使內(nèi)聯(lián)函數(shù)f轉(zhuǎn)換為適合于數(shù)組運(yùn)算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í)行。語(yǔ)法:[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è)計(jì)——M文件性能的優(yōu)化和加速01M文件性能優(yōu)化使用循環(huán)時(shí)提高速度的措施大型矩陣的預(yù)先定維優(yōu)先考慮內(nèi)在函數(shù)采用高效的算法盡量使用M函數(shù)文件代替M腳本文件M文件性能優(yōu)化1.使用循環(huán)時(shí)提高速度的措施循環(huán)語(yǔ)句及循環(huán)體是MATLAB編程的瓶頸問(wèn)題。MATLAB與其他編程語(yǔ)言不同,它的基本數(shù)據(jù)是向量和矩陣,編程時(shí)應(yīng)盡量對(duì)向量和矩陣編程,而不要對(duì)矩陣的元素編程。2.大型矩陣的預(yù)先定維由于MATLAB變量在使用之前不需要定義和指定維數(shù),當(dāng)變量新賦值的元素下標(biāo)超出數(shù)組的維數(shù)時(shí),MATLAB就為該數(shù)組擴(kuò)維1次,大大地降低了運(yùn)行的效率?!纠?.29】將【例5.20】中的雙重循環(huán)改為單循環(huán),并用zeros函數(shù)定維來(lái)提高運(yùn)行速度,創(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ùn)算應(yīng)該盡量采用MATLAB的內(nèi)在函數(shù)。內(nèi)在函數(shù)是由更底層的C語(yǔ)言構(gòu)造的,其執(zhí)行速度顯然很快。4.采用高效的算法在實(shí)際應(yīng)用中,解決同樣的數(shù)學(xué)問(wèn)題經(jīng)常有各種各樣的算法,應(yīng)尋求更高效的算法。5.盡量使用M函數(shù)文件代替M腳本文件由于M腳本文件每次運(yùn)行時(shí),都必須把程序裝入內(nèi)存,然后逐句解釋執(zhí)行,十分費(fèi)時(shí)。因此,要盡量使用M函數(shù)文件代替M腳本文件。02P碼文件
P碼文件的生成P碼文件的特點(diǎn)P碼文件
1.P碼文件的生成P碼文件使用pcode命令生成,生成的P碼文件與原M文件名相同,其擴(kuò)展名為“.p”。語(yǔ)法:pcodeFilename.m %在當(dāng)前目錄生成Filename.ppcodeFilename.m-inplace %在Filename.m所在目錄生成Filename.p例如,將【例5.29】生成P碼文件,在命令行窗口中輸入命令,將Ex0529.m文件轉(zhuǎn)換為P碼文件。>>pcodeEx0529.m則在當(dāng)前目錄就生成了P碼文件Ex0529.p。P碼文件
2.P碼文件的特點(diǎn)(1)P碼文件的運(yùn)行速度比原M文件速度快1個(gè)M文件第1次被調(diào)用時(shí),MATLAB將其進(jìn)行語(yǔ)法分析,并生成P碼文件存放在內(nèi)存中。以后再次調(diào)用該M文件時(shí),MATLAB就直接調(diào)用內(nèi)存中的P碼文件,而不需要再對(duì)原M文件重新進(jìn)行語(yǔ)法分析,當(dāng)再次調(diào)用M文件時(shí),運(yùn)行的速度便會(huì)高于第1次運(yùn)行。(2)若存在同名的M文件和P碼文件時(shí)則P碼文件被調(diào)用。當(dāng)在MATLAB的同一目錄或搜索路徑中,同時(shí)存在同名的M文件和P碼文件,則該文件名被調(diào)用時(shí)執(zhí)行的是P碼文件。為了測(cè)試,可以將Ex0529.m文件和Ex0529.p文件放在同一目錄,然后在命令行窗口運(yùn)行該文件,結(jié)果仍然與原來(lái)一樣。>>y=Ex0529(5)(3)P碼文件保密性好。用字處理軟件打開(kāi)Ex0529.p文件,看到的是亂碼。第6章
線性控制系統(tǒng)分析與設(shè)計(jì)——線性系統(tǒng)的描述01狀態(tài)空間描述法
狀態(tài)空間描述法
狀態(tài)空間描述法是使用狀態(tài)方程模型描述控制系統(tǒng)的。狀態(tài)方程為一階微分方程,用數(shù)學(xué)形式描述為:其中,例如,二階系統(tǒng)可以用狀態(tài)方程描述為:則狀態(tài)空間描述法
寫(xiě)出矩陣形式:另外,系統(tǒng)的狀態(tài)方程也可以表示為:MATLAB中狀態(tài)方程模型的建立使用ss和dss函數(shù)。語(yǔ)法: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】寫(xiě)出二階系統(tǒng)
,當(dāng)=0.707,=1時(shí)的狀態(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)過(guò)拉普拉斯變換得出的,拉普拉斯變換得出控制系統(tǒng)的數(shù)學(xué)描述為:傳遞函數(shù)表示為有理函數(shù)形式:
。MATLAB中使用tf函數(shù)建立傳遞函數(shù)。語(yǔ)法:G=tf(num,den) %由傳遞函數(shù)分子、分母得出說(shuō)明: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零極點(diǎn)描述法
零極點(diǎn)描述法
傳遞函數(shù)的零極點(diǎn)形式為:其中:k是系統(tǒng)增益,zi(i=1,2,…)是系統(tǒng)零點(diǎn),pj(j=1,2,…)是系統(tǒng)極點(diǎn)。MATLAB中使用zpk函數(shù)可以由零極點(diǎn)得到傳遞函數(shù)模型。語(yǔ)法:G=zpk(z,p,k) %由零點(diǎn)、極點(diǎn)和增益獲得零極點(diǎn)描述法
【例6.1_3】得出二階系統(tǒng)的零極點(diǎn),并得出傳遞函數(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.零極點(diǎn)描述法
控制系統(tǒng)的傳遞函數(shù)也可以用部分分式法表示,部分分式法可以歸類(lèi)于零極點(diǎn)增益描述法。部分分式法是將傳遞函數(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ù)學(xué)描述狀態(tài)空間描述法脈沖傳遞函數(shù)描述法零極點(diǎn)增益描述法離散系統(tǒng)的數(shù)學(xué)描述1.狀態(tài)空間描述法線性時(shí)不變離散系統(tǒng)可以用一組差分方程表示:說(shuō)明:u為輸入向量,x為狀態(tài)向量,y為輸出向量,n為采樣時(shí)刻。狀態(tài)空間描述離散系統(tǒng)也可使用ss和dss函數(shù)。語(yǔ)法: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ù)學(xué)描述【例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ù)學(xué)描述2.脈沖傳遞函數(shù)描述法將離散系統(tǒng)的狀態(tài)方程描述變換為脈沖傳遞函數(shù),脈沖傳遞函數(shù)的等效表達(dá)式為:其脈沖傳遞函數(shù)形式為:脈沖傳遞函數(shù)也可以用tf函數(shù)實(shí)現(xiàn)。語(yǔ)法:G=tf(num,den,Ts) %由分子、分母得出脈沖傳遞函數(shù)說(shuō)明:Ts為采樣周期,為標(biāo)量,當(dāng)采樣周期未指明時(shí)可以用
1表示,自變量用z表示。離散系統(tǒng)的數(shù)學(xué)描述【例6.2_2】創(chuàng)建離散系統(tǒng)脈沖傳遞函數(shù)
。>>num1=[0.50];>>den
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024飼料原料出口銷(xiāo)售合同
- 職業(yè)學(xué)院學(xué)生資助工作實(shí)施辦法
- 2024年建筑工程施工及安全責(zé)任保險(xiǎn)合同范本3篇
- 2024年裝修項(xiàng)目監(jiān)理合同3篇
- 2025年度豪華大理石臺(tái)面定制與安裝服務(wù)合同范本3篇
- 2024年租房責(zé)任保險(xiǎn)合同2篇
- 2024年股權(quán)轉(zhuǎn)讓合同(雙邊)
- 2024年簡(jiǎn)明鋼結(jié)構(gòu)購(gòu)買(mǎi)合同
- 構(gòu)造地質(zhì)學(xué)看圖題及答案
- 2025年度網(wǎng)絡(luò)安全責(zé)任書(shū)協(xié)議書(shū)保障數(shù)據(jù)安全3篇
- 承諾函(支付寶)
- FZ/T 81024-2022機(jī)織披風(fēng)
- GB/T 24123-2009電容器用金屬化薄膜
- 艾滋病梅毒乙肝實(shí)驗(yàn)室檢測(cè)
- 國(guó)鐵橋梁人行道支架制作及安裝施工要點(diǎn)課件
- 領(lǐng)導(dǎo)科學(xué)全套精講課件
- 粵教版地理七年級(jí)下冊(cè)全冊(cè)課件
- 小學(xué)科學(xué)蘇教版六年級(jí)上冊(cè)全冊(cè)精華知識(shí)點(diǎn)(2022新版)
- 萎縮性胃炎共識(shí)解讀
- 2022版義務(wù)教育語(yǔ)文課程標(biāo)準(zhǔn)(2022版含新增和修訂部分)
- 精品金屬線管布線施工工程施工方法
評(píng)論
0/150
提交評(píng)論