秋霞电影网午夜鲁丝片无码,真人h视频免费观看视频,囯产av无码片毛片一级,免费夜色私人影院在线观看,亚洲美女综合香蕉片,亚洲aⅴ天堂av在线电影猫咪,日韩三级片网址入口

第8章MATLAB程序設(shè)計(jì)

上傳人:xinsh****encai 文檔編號(hào):27712464 上傳時(shí)間:2021-08-19 格式:DOC 頁(yè)數(shù):31 大?。?.51MB
收藏 版權(quán)申訴 舉報(bào) 下載
第8章MATLAB程序設(shè)計(jì)_第1頁(yè)
第1頁(yè) / 共31頁(yè)
第8章MATLAB程序設(shè)計(jì)_第2頁(yè)
第2頁(yè) / 共31頁(yè)
第8章MATLAB程序設(shè)計(jì)_第3頁(yè)
第3頁(yè) / 共31頁(yè)

下載文檔到電腦,查找使用更方便

20 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《第8章MATLAB程序設(shè)計(jì)》由會(huì)員分享,可在線閱讀,更多相關(guān)《第8章MATLAB程序設(shè)計(jì)(31頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、第8章 MATLAB程序設(shè)計(jì) 8.1腳本文件和函數(shù)文件 M文件有兩種形式:M腳本文件和M函數(shù)文件。 8.1.1 M文本編輯器 MATLAB的M文件是通過(guò)M文件編輯/調(diào)試器窗口(Editor/Debugger)來(lái)創(chuàng)建的。 圖8.1 M文件編輯/調(diào)試器窗口 單擊MATLAB桌面上的圖標(biāo),或者單擊菜單“File”——“New”——“M-file”,可打開(kāi)空白的M文件編輯器,也可以通過(guò)打開(kāi)已有的M文件來(lái)打開(kāi)M文件編輯器。如圖8.1所示為打開(kāi)已創(chuàng)建的M文件。 8.1.2 M文件的基本格式 下面介紹繪制二階系統(tǒng)時(shí)域曲線的M文件,欠阻尼系統(tǒng)的時(shí)域輸出y與x的關(guān)系為,【例8.1】為M腳本文件

2、,【例8.2】為M函數(shù)文件。 【例8.1】用M腳本文件繪制二階系統(tǒng)時(shí)域曲線。 %EX0801 二階系統(tǒng)時(shí)域曲線 %畫(huà)阻尼系數(shù)為0.3的曲線 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) 【例8.2】創(chuàng)建一個(gè)畫(huà)二階系統(tǒng)時(shí)域曲線的函數(shù),阻尼系數(shù)zeta為函數(shù)的輸入?yún)?shù)。 function y=Ex0802(zeta) % EX0802 Step response of quadratic system. % 二階系統(tǒng)時(shí)

3、域響應(yīng)曲線 % zeta 阻尼系數(shù) % y 時(shí)域響應(yīng) % % copyright 2003-08-01 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) M函數(shù)文件的基本格式: 函數(shù)聲明行 H1行(用%開(kāi)頭的注釋行) 在線幫助文本(用%開(kāi)頭) 編寫(xiě)和修改記錄(用%開(kāi)頭) 函數(shù)體 例如,在命令窗口輸入help和lookfor命令查看幫助信息: help Ex0802 EX0802 S

4、tep response of quadratic system. 二階系統(tǒng)時(shí)域響應(yīng)曲線 zeta 阻尼系數(shù) y 時(shí)域響應(yīng) lookfor 二階系統(tǒng)時(shí)域響應(yīng) Ex0802.m: %二階系統(tǒng)時(shí)域響應(yīng) 8.1.3 M腳本文件 腳本文件的特點(diǎn): (1) 腳本文件中的命令格式和前后位置,與在命令窗口中輸入的沒(méi)有任何區(qū)別。 (2) MATLAB在運(yùn)行腳本文件時(shí),只是簡(jiǎn)單地按順序從文件中讀取一條條命令,送到MATLAB命令窗口中去執(zhí)行。 (3) 與在命令窗口中直接運(yùn)行命令一樣,腳本文件運(yùn)行產(chǎn)生的變量都是駐留在MATLAB的工作空間(workspace)中,可以很

5、方便地查看變量,除非用clear命令清除;腳本文件的命令也可以訪問(wèn)工作空間的所有數(shù)據(jù),因此要注意避免變量的覆蓋而造成程序出錯(cuò)。 【例8.1續(xù)】在M文件編輯/調(diào)試器窗口中編寫(xiě)M腳本文件繪制二階系統(tǒng)的多條時(shí)域曲線。 (1) 單擊MATLAB桌面上的圖標(biāo)打開(kāi)M文件編輯器。 (2) 將命令全部寫(xiě)入M文件編輯器中,為了能標(biāo)志該文件的名稱,在第一行寫(xiě)入包含文件名的注釋。保存文件為Ex0801.m。 %EX0801 二階系統(tǒng)時(shí)域曲線 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))

6、plot(x,y1,r) %畫(huà)阻尼系數(shù)為0.3的曲線 hold on y2=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的曲線 圖8.2 運(yùn)行界面 (3) 選擇M文件編輯器菜單“Debug”——“Run”,就可以在圖形窗中看到如圖8.2所示的曲線。 查看工作空間的變量: whos Name

7、 Size Bytes Class x 1x201 1608 double array y1 1x201 1608 double array y2 1x201 1608 double array y3 1x201 1608 double array Grand total is 804 elements using

8、6432 bytes 8.1.4 M函數(shù)文件 函數(shù)文件的特點(diǎn): (1) 第一行總是以“function”引導(dǎo)的函數(shù)聲明行; 函數(shù)聲明行的格式: function [輸出變量列表] = 函數(shù)名(輸入變量列表) (2) 函數(shù)文件在運(yùn)行過(guò)程中產(chǎn)生的變量都存放在函數(shù)本身的工作空間; (3) 當(dāng)文件執(zhí)行完最后一條命令或遇到“return”命令時(shí),就結(jié)束函數(shù)文件的運(yùn)行,同時(shí)函數(shù)工作空間的變量就被清除; (4) 函數(shù)的工作空間隨具體的M函數(shù)文件調(diào)用而產(chǎn)生,隨調(diào)用結(jié)束而刪除,是獨(dú)立的、臨時(shí)的,在MATLAB運(yùn)行過(guò)程中可以產(chǎn)生任意多個(gè)臨時(shí)的函數(shù)空間。 【例8.2續(xù)】在M文件編輯/調(diào)試

9、器窗口編寫(xiě)計(jì)算二階系統(tǒng)時(shí)域響應(yīng)的M函數(shù)文件,并在MATLAB命令窗口中調(diào)用該文件。 創(chuàng)建M函數(shù)文件并調(diào)用的步驟如下: (1) 編寫(xiě)函數(shù)代碼 function y=Ex0802(zeta) %EX0802 畫(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) (2) 將函數(shù)文件保存為“Ex0802.m”。 (3) 在MATLAB命令窗口輸入以下命令,則會(huì)出現(xiàn)f的計(jì)算值和繪制的曲線: f=Ex0802(0.3) 程序分析:

10、第一行指定該文件是函數(shù)文件,文件名為“Ex0802”,輸入?yún)?shù)為阻尼系數(shù)zeta,輸出參數(shù)為時(shí)域響應(yīng)y。 當(dāng)函數(shù)文件調(diào)用結(jié)束,查看x、y: x ??? Undefined function or variable x. y ??? Undefined function or variable y. 注意:M腳本文件和M函數(shù)文件的文件名及函數(shù)名的命名規(guī)則與MATLAB變量的命名規(guī)則相同。 8.2程序流程控制 8.2.1 for ... end循環(huán)結(jié)構(gòu) 語(yǔ)法: for 循環(huán)變量=array 循環(huán)體 end 說(shuō)明:循環(huán)體被循環(huán)執(zhí)行,執(zhí)行的次數(shù)就是ar

11、ray的列數(shù),array可以是向量也可以是矩陣,循環(huán)變量依次取array的各列,每取一次循環(huán)體執(zhí)行一次。 【例8.3】使用for ... end循環(huán)的array向量編程求出 1+3+5...+100 的值。 % EX0803 使用向量for循環(huán) sum=0; for n=1:2:100 sum=sum+n; end sum sum = 2500 計(jì)算的結(jié)果為:sum =2500。 程序說(shuō)明:循環(huán)變量為n,n對(duì)應(yīng)為向量1:2:100,循環(huán)次數(shù)為向量的列數(shù),每次循環(huán)n取一個(gè)元素。 【例8.4】使用for ... end循環(huán)的arr

12、ay矩陣編程將單位陣轉(zhuǎn)換為列向量。 % EX0804 使用矩陣for循環(huán) sum=zeros(6,1); for n=eye(6,6) sum=sum+n; end sum sum = 1 1 1 1 1 1 程序分析:循環(huán)變量n對(duì)應(yīng)為矩陣eye(6,6)的每一列,即第一次n為[1;0;0;0;0;0],第一次n為[0;1;0;0;0;0];循環(huán)次數(shù)為矩陣的列數(shù)6。 8.2.2 while ... end循環(huán)結(jié)構(gòu) 語(yǔ)法: while 表達(dá)式 循環(huán)體 en

13、d 說(shuō)明:只要表達(dá)式為邏輯真,就執(zhí)行循環(huán)體;一旦表達(dá)式為假,就結(jié)束循環(huán)。表達(dá)式可以是向量也可以是矩陣,如果表達(dá)式為矩陣則當(dāng)所有的元素都為真才執(zhí)行循環(huán)體,如果表達(dá)式為nan,MATLAB認(rèn)為是假,不執(zhí)行循環(huán)體。 【例8.5】與【例8.3】相同,計(jì)算1+3+5...+100 的值。 % EX0805 使用while循環(huán) sum=0; n=1; while n<=100 sum=sum+n; n=n+2 ; end sum n sum = 2500 n = 101 程序分析:可以看出while ... end循

14、環(huán)的循環(huán)次數(shù)由表達(dá)式來(lái)決定,當(dāng)n=101就停止循環(huán)。 8.2.3 If…else…end條件轉(zhuǎn)移結(jié)構(gòu) 語(yǔ)法: if 條件式1 語(yǔ)句段1 elseif 條件式2 語(yǔ)句段2 ... else 語(yǔ)句段n+1 end 說(shuō)明:當(dāng)有多個(gè)條件時(shí),條件式1為假再判斷elseif的條件式2,如果所有的條件式都不滿足,則執(zhí)行else的語(yǔ)句段n+1,當(dāng)條件式為真則執(zhí)行相應(yīng)的語(yǔ)句段;If…else…end結(jié)構(gòu)也可以是沒(méi)有elseif和else的簡(jiǎn)單結(jié)構(gòu)。 【例8.6】用If結(jié)構(gòu)執(zhí)行二階系統(tǒng)時(shí)域響應(yīng),根據(jù)阻尼系數(shù)0

15、同的時(shí)域響應(yīng)表達(dá)式。 function y=Ex0806(zeta) % EX0806 使用if結(jié)構(gòu)的二階系統(tǒng)時(shí)域響應(yīng) x=0:0.1:20; if (zeta>0)&(zeta<1) y=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta)); elseif zeta==1 y=1-exp(-x).*(1+x); end plot(x,y) 8.2.4 switch…case開(kāi)關(guān)結(jié)構(gòu) 語(yǔ)法: switch 開(kāi)關(guān)表達(dá)式 case 表達(dá)式1 語(yǔ)句段1

16、case表達(dá)式2 語(yǔ)句段2 ... otherwise 語(yǔ)句段n end 說(shuō)明: (1) 將開(kāi)關(guān)表達(dá)式依次與case后面的表達(dá)式進(jìn)行比較,如果表達(dá)式1不滿足,則與下一個(gè)表達(dá)式2比較,如果都不滿足則執(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ǔ)句段。 【例8.7】用switch…case開(kāi)關(guān)結(jié)構(gòu)得出各月份的

17、季節(jié)。 % EX0807 使用switch結(jié)構(gòu) for month=1:12; switch month case{3,4,5} season=spring case{6,7,8} season=summer case{9,10,11} season=autumn otherwise season=winter end end season = winter season = winter season = spring seas

18、on = spring season = spring season = summer season = summer season = summer season = autumn season = autumn season = autumn season = winter 程序分析:開(kāi)關(guān)表達(dá)式為向量1:12,case后面的表達(dá)式為元胞數(shù)組,當(dāng)元胞數(shù)組的某個(gè)元素與開(kāi)關(guān)表達(dá)式相等,就執(zhí)行其后的語(yǔ)句段。 8.2.5 try... catch... end試探結(jié)構(gòu) 語(yǔ)法: try 語(yǔ)句段1 catch 語(yǔ)句段2

19、end 說(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)。 【例8.8】用try... catch... end結(jié)構(gòu)來(lái)進(jìn)行矩陣相乘運(yùn)算。 % EX0808 try結(jié)構(gòu) n=4; a=magic(n); m=3; b=eye(3); try c=a*b catch c=a(1:m,1:m)*b end lasterr c = 16 2 3 5 11

20、10 9 7 6 ans = Error using ==> * Inner matrix dimensions must agree. 程序分析:試探出矩陣的大小不匹配時(shí),矩陣無(wú)法相乘,則再執(zhí)行catch后面的語(yǔ)句段,將a的子矩陣取出與b矩陣相乘??梢酝ㄟ^(guò)這種結(jié)構(gòu)靈活地實(shí)現(xiàn)矩陣的乘法運(yùn)算。 8.2.6流程控制語(yǔ)句 1. break命令 break命令可以使包含break的最內(nèi)層的for或while語(yǔ)句強(qiáng)制終止,立即跳出該結(jié)構(gòu),執(zhí)行end后面的命令,break命令一般和If結(jié)構(gòu)結(jié)合使用。 【例8.9】將【例8.5】增加條件用If與break命令結(jié)

21、合,停止while循環(huán)。計(jì)算1+3+5...+100 的值,當(dāng)和大于1000時(shí)終止計(jì)算。 % EX0809 用break終止while循環(huán) sum=0; n=1; while n<=100 if sum<1000 sum=sum+n; n=n+2; else break end end sum n sum = 1024 n = 65 程序分析:while…end循環(huán)結(jié)構(gòu)嵌套If…else…end分支結(jié)構(gòu),當(dāng)sum為1024時(shí)跳出while循環(huán)結(jié)構(gòu)

22、,終止循環(huán)。 2. continue命令 continue命令用于結(jié)束本次for或while循環(huán),只結(jié)束本次循環(huán)而繼續(xù)進(jìn)行下次循環(huán)。 【例8.10】將If命令與continue命令結(jié)合,計(jì)算的1~100中所有素?cái)?shù)的和,判斷是否為素?cái)?shù)是將100以內(nèi)的每個(gè)數(shù)都被2~整除,不能被整除的就是素?cái)?shù)。 % EX0810 用continue終止while循環(huán) sum=2;ss=0; for n=3:100 for m=2:fix(sqrt(n)) if mod(n,m)==0 ss=1; %能被整除就用ss為1表示

23、 break; %能被整除就跳出內(nèi)循環(huán) else ss=0; %不能被整除就用ss為0表示 end end if ss==1 continue; %能被整除就跳出本次外循環(huán) end sum=sum+n; end sum sum = 1060 程序分析:fix(sqrt(n))是將取整;本程序?yàn)殡p重循環(huán),兩個(gè)for循環(huán)嵌套還嵌套一個(gè)if結(jié)構(gòu);當(dāng)mod(n

24、,m)==0時(shí)就用break跳出判斷是否為素?cái)?shù)的內(nèi)循環(huán),并繼續(xù)用continue跳出求素?cái)?shù)和的外循環(huán)而繼續(xù)下次外循環(huán)。 3. return命令 return命令是終止當(dāng)前命令的執(zhí)行,并且立即返回到上一級(jí)調(diào)用函數(shù)或等待鍵盤(pán)輸入命令,可以用來(lái)提前結(jié)束程序的運(yùn)行。 注意:當(dāng)程序進(jìn)入死循環(huán),則按Ctrl+break鍵來(lái)終止程序的運(yùn)行。 4. pause命令 pause命令用來(lái)使程序運(yùn)行暫停,等待用戶按任意鍵繼續(xù)。 語(yǔ)法: pause %暫停 pause(n) %暫停n秒 5. keyboard命令 keyboard命令用來(lái)使程序暫停運(yùn)行,等待鍵盤(pán)命令

25、,執(zhí)行完自己的工作后,輸入return語(yǔ)句,程序就繼續(xù)運(yùn)行。 6. input命令 input命令用來(lái)提示用戶應(yīng)該從鍵盤(pán)輸入數(shù)值、字符串和表達(dá)式,并接受該輸入。 a=input(input a number:) %輸入數(shù)值給a input a number:45 a = 45 b=input(input a number:,s) %輸入字符串給b input a number:45 b = 45 input(input a number:) %將輸入值進(jìn)行運(yùn)算 input a number:2+3 ans = 5 8.3函數(shù)

26、調(diào)用和參數(shù)傳遞 8.3.1子函數(shù)和私有函數(shù) 1. 子函數(shù) 在一個(gè)M函數(shù)文件中,可以包含一個(gè)以上的函數(shù),其中只有一個(gè)是主函數(shù),其它則為子函數(shù)。 (1) 在一個(gè)M文件中,主函數(shù)必須出現(xiàn)在最上方,其后是子函數(shù),子函數(shù)的次序無(wú)任何限制; (2) 子函數(shù)不能被其它文件的函數(shù)調(diào)用,只能被同一文件中的函數(shù)(可以是主函數(shù)或子函數(shù))調(diào)用; (3) 同一文件的主函數(shù)和子函數(shù)變量的工作空間相互獨(dú)立; (4) 用help和lookfor命令不能提供子函數(shù)的幫助信息。 【例8.11】將【例8.2】畫(huà)二階系統(tǒng)時(shí)域曲線的函數(shù)作為子函數(shù),編寫(xiě)畫(huà)多條曲線的程序。 function Ex0811() % EX

27、0811 使用函數(shù)調(diào)用繪制二階系統(tǒng)時(shí)域響應(yīng) z1=0.3; Ex0802(z1); %調(diào)用Ex0802 hold on z1=0.5 Ex0802(z1) %調(diào)用Ex0802 z1=0.707; Ex0802(z1) %調(diào)用Ex0802 function y=Ex0802(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ù)是Ex0811,子函數(shù)是Ex

28、0802,在主函數(shù)中三次調(diào)用子函數(shù)。程序保存為Ex0811.m文件。 2. 私有函數(shù) 私有函數(shù)是指存放在private子目錄中的M函數(shù)文件,具有以下性質(zhì): (1) 在private目錄下的私有函數(shù),只能被其父目錄的M函數(shù)文件所調(diào)用,而不能被其它目錄的函數(shù)調(diào)用,對(duì)其它目錄的文件私有函數(shù)是不可見(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)用一個(gè)函數(shù),搜索的順序如下: 查找是否子函數(shù); 查找是否私有函數(shù)

29、; 從當(dāng)前路徑中搜索此函數(shù); 從搜索路徑中搜索此函數(shù)。 8.3.2局部變量和全局變量 1. 局部變量 局部變量(Local Variables)是在函數(shù)體內(nèi)部使用的變量,其影響范圍只能在本函數(shù)內(nèi),只在函數(shù)執(zhí)行期間存在。 2. 全局變量 全局變量(Global Variables)是可以在不同的函數(shù)工作空間和MATALB工作空間中共享使用的變量。 【例8.12】修改【例8.11】在主函數(shù)和子函數(shù)中使用全局變量。 function Ex0812() % EX0812 使用全局變量繪制二階系統(tǒng)時(shí)域響應(yīng) global X X=0:0.1:20; z1=0.3;

30、 Ex0802(z1); hold on z1=0.5; Ex0802(z1); z1=0.707; Ex0802(z1); function Ex0802(zeta) %子函數(shù),畫(huà)二階系統(tǒng)時(shí)域曲線 global X y=1-1/sqrt(1-zeta^2)*exp(-zeta*X).*sin(sqrt(1-zeta^2)*X+acos(zeta)); plot(X,y); 程序分析:X變量為全局變量,在需要使用的主函數(shù)和子函數(shù)中都需要用global定義;同樣如果在工作空間中定義X為全局變量后也可以使用: global X who Your variables

31、 are: X 注意:由于全局變量在任何定義過(guò)的函數(shù)中都可以修改,因此不提倡使用全局變量;必須使用時(shí)應(yīng)十分小心,建議把全局變量的定義放在函數(shù)體的開(kāi)始,全局變量用大寫(xiě)字符命名。 8.3.3函數(shù)的參數(shù) 1. 參數(shù)傳遞規(guī)則 function Ex0813() % EX0813 參數(shù)傳遞繪制二階系統(tǒng)時(shí)域響應(yīng) z1=0.3; [x1,y1]=Ex0802(z1); plot(x1,y1) hold on z1=0.5; [x2,y2]=Ex0802(z1); plot(x2,y2) z1=0.707; [x3,y3]=Ex0802(z1); plot(x3,y3);

32、 function [x,y]=Ex0502(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)); function [x,y]=Ex0802(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)); 圖8.3 參數(shù)傳遞 【例8.13】將【例8.11】畫(huà)二階系統(tǒng)時(shí)

33、域的函數(shù)修改,使用輸入輸出參數(shù)來(lái)實(shí)現(xiàn)參數(shù)傳遞,如圖8.3所示。 程序分析:主函數(shù)Ex0813調(diào)用子函數(shù)Ex0802,子函數(shù)中的zeta為輸入?yún)?shù),函數(shù)調(diào)用時(shí)將z1傳遞給子函數(shù)zeta,子函數(shù)計(jì)算后將輸出參數(shù)x和y傳回給主函數(shù)的x1、y1;主函數(shù)調(diào)用子函數(shù)三次,后面兩次參數(shù)的傳遞也是同樣。 2. 函數(shù)參數(shù)的個(gè)數(shù) (1) nargin和nargout變量 函數(shù)的輸入輸出參數(shù)的個(gè)數(shù)可以通過(guò)變量nargin和nargout獲得,nargin用于獲得輸入?yún)?shù)的個(gè)數(shù),nargout用于獲得輸出參數(shù)的個(gè)數(shù)。 語(yǔ)法: nargin %在函數(shù)體內(nèi)獲取實(shí)際輸入變量的個(gè)數(shù) narg

34、out %在函數(shù)體內(nèi)獲取實(shí)際輸出變量的個(gè)數(shù) nargin(’fun’) %在函數(shù)體外獲取定義的輸入?yún)?shù)個(gè)數(shù) nargout(‘fun’) %在函數(shù)體外獲取定義的輸出參數(shù)個(gè)數(shù) 【例8.14】計(jì)算兩個(gè)數(shù)的和,根據(jù)輸入的參數(shù)個(gè)數(shù)不同使用不同的運(yùn)算表達(dá)式。 function [sum,n]=Ex0814(x,y) % EX0814 參數(shù)個(gè)數(shù)可變,計(jì)算x和y的和 if nargin==1 sum=x+0; %輸入一個(gè)參數(shù)就計(jì)算與0的和 elseif nargin==0 sum=0; %無(wú)輸入?yún)?shù)就輸出0 else su

35、m=x+y; %輸入的是兩個(gè)數(shù)則就計(jì)算和 end n=nargin; 在命令窗口調(diào)用Ex0814函數(shù),分別使用2個(gè)、1個(gè)和無(wú)輸入?yún)?shù)結(jié)果如下: [y,n]=Ex0814(2,3) y = 5 n = 2 [y,n]=Ex0814(2) y = 2 n = 1 [y,n]=Ex0814 y = 0 n = 0 注意:如果輸入的參數(shù)多于輸入?yún)?shù)個(gè)數(shù),則會(huì)出錯(cuò)。 [y,n]=Ex0814(1,2,3) ??? Error using ==> Ex081

36、4 Too many input arguments. 也可以在工作空間查看函數(shù)體定義的輸入?yún)?shù)個(gè)數(shù): nargin(Ex0814) ans = 2 【例8.14續(xù)】添加以下程序,查看用nargout變量獲取輸出參數(shù)個(gè)數(shù)。 if nargout==0 %當(dāng)輸出參數(shù)個(gè)數(shù)為0時(shí),運(yùn)算結(jié)果為0 sum=0; end 在命令窗口調(diào)用Ex0814函數(shù),當(dāng)輸出參數(shù)格式不同時(shí),結(jié)果如下: Ex0814(2,3) %當(dāng)輸出參數(shù)個(gè)數(shù)為0時(shí) ans = 0 y=Ex0814(2,3) %當(dāng)輸出參數(shù)個(gè)數(shù)為1時(shí) y =

37、 5 [y,n,x]=Ex0814 %當(dāng)輸出參數(shù)個(gè)數(shù)為太多時(shí) ??? Error using ==> Ex0814 Too many output arguments. 程序分析:當(dāng)輸出參數(shù)個(gè)數(shù)為0時(shí),即使有兩個(gè)輸入?yún)?shù),運(yùn)算結(jié)果也為0,結(jié)果送給ans變量;當(dāng)輸出的參數(shù)個(gè)數(shù)太多,也會(huì)出錯(cuò)。 (2) varargin和varargout變量 varargin和varargout可以獲得輸入輸出變量的各元素內(nèi)容。 【例8.15】計(jì)算所有輸入變量的和。 function [y,n]=Ex0815(varargin) % EX0815 使用可變參數(shù)varar

38、gin if nargin==0 %當(dāng)沒(méi)有輸入變量時(shí)輸出0 disp(No Input variables.) y=0; elseif nargin==1 %當(dāng)一個(gè)輸入變量時(shí),輸出該數(shù) y=varargin{1}; else n=nargin; y=0; for m=1:n y=varargin{m}+y; %當(dāng)有多個(gè)輸入變量時(shí),取輸入變量循環(huán)相加 end end n=nargin; 在MATLAB的命令窗口中輸入不同個(gè)數(shù)的變量調(diào)用函數(shù)Ex0815,結(jié)果如下: [y

39、,n]=Ex0815(1,2,3,4) %輸入4個(gè)參數(shù) y = 10 n = 4 [y,n]=Ex0815(1) %輸入1個(gè)參數(shù) y = 1 n = 1 [y,n]=Ex0815 %無(wú)輸入?yún)?shù) No Input variables. y = 0 n = 0 程序分析:n為輸入?yún)?shù)的個(gè)數(shù);y為求和運(yùn)算的結(jié)果。 8.3.4程序舉例 【例8.16】根據(jù)阻尼系數(shù)繪制不同二階系統(tǒng)的時(shí)域響應(yīng),當(dāng)欠阻尼時(shí),當(dāng)臨界阻尼時(shí),當(dāng)過(guò)阻尼時(shí)。 M文件的程序代碼如下: f

40、unction y=Ex0816(z1) % EX0816 主函數(shù)調(diào)用子函數(shù),根據(jù)阻尼系數(shù)繪制二階系統(tǒng)時(shí)域曲線 t=0:0.1:20; if (z1>=0)&(z1<1) y=plotxy1(z1,t); elseif z1==1 y=plotxy2(z1,t); else y=plotxy3(z1,t); end function y1=plotxy1(zeta,x) %畫(huà)欠阻尼二階系統(tǒng)時(shí)域曲線 y1=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta));

41、 plot(x,y1) function y2=plotxy2(zeta,x) %畫(huà)臨界阻尼二階系統(tǒng)時(shí)域曲線 y2=1-exp(-x).*(1+x); plot(x,y2) function y3=plotxy3(zeta,x) %畫(huà)過(guò)阻尼二階系統(tǒng)時(shí)域曲線 y3=1-1/(2*sqrt(zeta^2-1))*(exp(-((zeta-sqrt(zeta^2-1))*x))./(zeta-sqrt(zeta^2-1))... -exp(-((zeta+sqrt(zeta^2-1))*x))./(zeta+sqrt(zeta^2-1))); plot(x,y3)

42、 程序分析:主函數(shù)名為Ex0816,三個(gè)子函數(shù)名分別為plotxy1、plotxy2、plotxy3,文件保存為Ex0816.m。當(dāng)在命令窗口中輸入以下命令: y=Ex0816(0.3); hold on y=Ex0816(0.707); y=Ex0816(1); y=Ex0816(2); 則產(chǎn)生如圖8.4所示時(shí)域響應(yīng)曲線。 圖8.4 不同阻尼系數(shù)的時(shí)域響應(yīng)曲線 【例8.17】編寫(xiě)M函數(shù)文件,通過(guò)流程控制語(yǔ)句,建立如下的矩陣。 function y=Ex0817(m) % EX0817 用循環(huán)流程控制語(yǔ)句創(chuàng)建矩陣 y=0; m=

43、m-1; for n=1:m y=[0,y]; %創(chuàng)建全0行 end for n=1:m a=[1:1:n]; b=a; for k=m:-1:n b=[0,b]; end y=[b;y]; n=n+1; end 程序分析:將矩陣的行列數(shù)用輸入?yún)?shù)m來(lái)確定,輸出參數(shù)為矩陣y。使用雙重循環(huán)來(lái)創(chuàng)建矩陣,將文件保存為Ex0817.m。 在命令窗口中調(diào)用Ex0817函數(shù): y=Ex0817(5) y = 0 1 2 3 4

44、 0 0 1 2 3 0 0 0 1 2 0 0 0 0 1 0 0 0 0 0 8.4 M文件性能的優(yōu)化和加速 8.4.1 P碼文件 1. P碼文件的生成 P碼文件使用pcode命令生成,生成的P碼文件與原M文件名相同,其擴(kuò)展名為“.p”。 語(yǔ)法: pcode Filename.m %在當(dāng)前目錄生成Filename.p pcode Filename.m -inplace %在Filename

45、.m所在目錄生成Filename.p pcode Ex0817.m 則在當(dāng)前目錄就生成了P碼文件Ex0817.p。 2. P碼文件的特點(diǎn) (1) P碼文件的運(yùn)行速度比原M文件速度快 (2) 存在同名的M文件和P碼文件時(shí)則P碼文件被調(diào)用 (3) P碼文件保密性好 用字處理軟件打開(kāi)Ex0817.p文件,看到的是亂碼。 8.4.2 M文件性能優(yōu)化 1. 使用循環(huán)時(shí)提高速度的措施 循環(huán)語(yǔ)句及循環(huán)體是MATLAB編程的瓶頸問(wèn)題,改進(jìn)這種狀況有三種方法: (1) 盡量用向量的運(yùn)算來(lái)代替循環(huán)操作。 (2) 在必須使用多重循環(huán)的情況下,如果兩個(gè)循環(huán)執(zhí)行的次數(shù)不同,則建議在循環(huán)

46、的外環(huán)執(zhí)行循環(huán)次數(shù)少的,內(nèi)環(huán)執(zhí)行循環(huán)次數(shù)多的,也可以顯著提高速度。 (3) 應(yīng)用Mex技術(shù) 如果耗時(shí)的循環(huán)不可避免,就應(yīng)該考慮用其他語(yǔ)言,如C或Fortran語(yǔ)言,按照Mex技術(shù)要求的格式編寫(xiě)相應(yīng)部分的程序,然后通過(guò)編譯聯(lián)接,形成在MATLAB可以直接調(diào)用的動(dòng)態(tài)鏈接庫(kù)(DLL)文件,這樣就可以顯著地加快運(yùn)算速度(在8.1.1小節(jié)介紹)。 2. 大型矩陣的預(yù)先定維 給大型矩陣動(dòng)態(tài)地定維是個(gè)很費(fèi)時(shí)間的事。 【例8.18】將【例8.17】中的雙重循環(huán)改為單循環(huán),并先用zeros函數(shù)定維來(lái)提高運(yùn)行速度,創(chuàng)建矩陣。 function y=Ex0818(m) % EX0818 先定維再

47、創(chuàng)建矩陣 m=m-1; y=zeros(m); for n=1:m-1 a=1:m-n; y(n,n+1:m)=a; end y 在命令窗口中分別調(diào)用Ex0817和Ex0818函數(shù),比較其運(yùn)行速度的不同: y=Ex0817(200) y=Ex0818(200) 3. 優(yōu)先考慮內(nèi)在函數(shù) 矩陣運(yùn)算應(yīng)該盡量采用MATLAB的內(nèi)在函數(shù),因?yàn)閮?nèi)在函數(shù)是由更底層的C語(yǔ)言構(gòu)造的,其執(zhí)行速度顯然很快。 4. 采用高效的算法 在實(shí)際應(yīng)用中,解決同樣的數(shù)學(xué)問(wèn)題經(jīng)常有各種各樣的算法。因此,應(yīng)尋求更高效的算法。 5. 盡量使用M函數(shù)文件代替M腳本文件

48、 由于M腳本文件每次運(yùn)行時(shí),都必須把程序裝入內(nèi)存,然后逐句解釋執(zhí)行,十分費(fèi)時(shí)。 8.4.3 JIT和加速器 1. JIT和加速器的加速范圍 JIT和加速器的應(yīng)用范圍如下: 只對(duì)維數(shù)不超過(guò)3的“非稀疏”數(shù)組起作用; 只對(duì)“雙精度”、“整數(shù)”、“字符串”和“邏輯”等四種數(shù)據(jù)類(lèi)型起作用; 只對(duì)內(nèi)部函數(shù)的調(diào)用起作用,對(duì)用戶的M函數(shù)或MEX文件不起作用; 只對(duì)控制語(yǔ)句for、while、if、elseif、switch中標(biāo)量運(yùn)算的條件表達(dá)式起作用; 當(dāng)一行程序中含有“不可加速的”命令或變量時(shí),整行都不被加速; 當(dāng)變量改變數(shù)據(jù)類(lèi)型或維數(shù),則該語(yǔ)句不被加速; 如果i和j不以

49、虛數(shù)單位形式使用,則該語(yǔ)句不被加速; 在Intel系列CPU硬件上,Windows和Linux系統(tǒng)加速能力最強(qiáng)。 2. 使用程序性能剖析窗口 (1) 打開(kāi)程序性能剖析窗口 指示燈 命令輸入欄 時(shí)間指示器 開(kāi)始剖析 圖8.5 程序性能剖析窗口 選擇菜單“View”——“Profiler”;或使用在命令窗口輸入“profile viewer”命令都可以打開(kāi)程序性能剖析窗口,如圖8.5所示。 (2) 對(duì)MATLAB的命令進(jìn)行剖析 對(duì)MATLAB的命令進(jìn)行剖析有兩種方式: 在上圖中的“命令輸入欄”中輸入需要剖析的命令,然后單擊“Start Profiling”按鈕,則

50、指示燈變?yōu)榫G色,“Start Profiling”按鈕變灰色,時(shí)間指示器的計(jì)時(shí)在累加;當(dāng)命令運(yùn)行結(jié)束時(shí),狀態(tài)恢復(fù),并出現(xiàn)剖析報(bào)告。 將“命令輸入欄”清空,然后單擊“Start Profiling”按鈕開(kāi)始剖析,則“Start Profiling”按鈕變?yōu)椤癝top Profiling”,指示燈變?yōu)榫G色表示啟動(dòng)剖析,時(shí)間指示器的計(jì)時(shí)在累加;然后在MATLAB命令窗口中輸入需要剖析的命令,進(jìn)行剖析;當(dāng)命令運(yùn)行結(jié)束,單擊“Stop Profiling”按鈕停止剖析,則狀態(tài)恢復(fù),并出現(xiàn)剖析報(bào)告。這種方式的時(shí)間指示器顯示的只是單擊按鈕“Stop Profiling”開(kāi)始到單擊“Stop Profil

51、ing”按鈕的時(shí)間,并不表示命令的運(yùn)行時(shí)間。 (3) 查看剖析報(bào)告 在程序性能分析窗口中以表格顯示“剖析分析匯總表”(Profile Summary),從上到下按占用時(shí)間的多少排列。 將第三章的例題進(jìn)行剖析,【例3.24】求微分方程組的解,保存為“Ex0324.m”文件,內(nèi)容如下: %符號(hào)微分方程組求解 [x,y]=dsolve(Dx=y,Dy=-x) [x,y]=dsolve(Dx=y,Dy=-x,t) 圖8.6 剖析報(bào)告 將該文件進(jìn)行剖析,在“命令輸入欄”中輸入“Ex0324”,然后單擊“Start Profiling”按鈕開(kāi)始剖析,則“剖析分析匯總表”如圖8.6所示,單擊

52、“Ex0324”超鏈接則顯示詳細(xì)的列表: 3. JIT和加速器的開(kāi)關(guān)函數(shù) 在MATLAB6.5版總是把JIT和加速器置于開(kāi)啟狀態(tài),可以使用命令來(lái)控制JIT和加速器的開(kāi)啟和關(guān)閉。 語(yǔ)法: feature JIT on %開(kāi)啟JIT feature JIT off %關(guān)閉JIT feature accel on %開(kāi)啟加速器 feature accel off %關(guān)閉加速器 將【例8.18】創(chuàng)建矩陣的程序在開(kāi)啟或關(guān)閉JIT和加速器時(shí),查看其運(yùn)行速度。 在圖8.6的“命令輸入欄”中輸入“y=Ex0818(200)” 當(dāng)默認(rèn)狀態(tài)時(shí)JIT和加速器置

53、于開(kāi)啟狀態(tài),在程序性能剖析窗口中查看運(yùn)行時(shí)間為0.43;當(dāng)使用“feature JIT off”命令關(guān)閉JIT時(shí),運(yùn)行時(shí)間為0.451;當(dāng)將JIT和加速器都關(guān)閉時(shí)則運(yùn)行時(shí)間為0.481。 注意:JIT和加速器對(duì)于不同的M文件作用不同,而不同的運(yùn)行環(huán)境、不同軟件、不同機(jī)器都會(huì)得出不同的運(yùn)行時(shí)間,上面的運(yùn)行時(shí)間只作為參考。 8.5內(nèi)聯(lián)函數(shù) 1. 內(nèi)聯(lián)函數(shù)的創(chuàng)建 創(chuàng)建內(nèi)聯(lián)函數(shù)可以使用inline命令實(shí)現(xiàn)。 語(yǔ)法: inline(‘string’,arg1,arg2,…) %創(chuàng)建內(nèi)聯(lián)函數(shù) 說(shuō)明:’string’必須是不帶賦值號(hào)(“=”)的字符串;arg1和arg2是函數(shù)的輸入變

54、量。 【例8.19】創(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 = Inline function: f(x,z) = sin(x)*exp(-z*x) y=f(5,0.3) %調(diào)用函數(shù)f y = -0.2140 2. 查看內(nèi)聯(lián)函數(shù) MATLAB可以用char、class和argnames命令方便地查看內(nèi)聯(lián)函數(shù)的信息。 語(yǔ)法: char(inline_fun) %查看內(nèi)聯(lián)函數(shù)的內(nèi)容 class(inline_fun)

55、 %查看內(nèi)聯(lián)函數(shù)的類(lèi)型 argnames(inline_fun) %查看內(nèi)聯(lián)函數(shù)的變量 【例8.19續(xù)】查看內(nèi)聯(lián)函數(shù)的信息。 char(f) ans = sin(x)*exp(-z*x) class(f) ans = inline argnames(f) ans = x z 3. 使內(nèi)聯(lián)函數(shù)適用于數(shù)組運(yùn)算 內(nèi)聯(lián)函數(shù)的輸入變量不能是數(shù)組,但可以使用vectorize命令將內(nèi)聯(lián)函數(shù)適用于數(shù)組運(yùn)算。 語(yǔ)法: vectorize(inline_fun) %使內(nèi)聯(lián)函數(shù)適用于數(shù)組運(yùn)算 【例

56、8.19續(xù)】使內(nèi)聯(lián)函數(shù)適用于數(shù)組運(yùn)算。 ff=vectorize(f) %使內(nèi)聯(lián)函數(shù)f轉(zhuǎn)換為適合數(shù)組運(yùn)算 ff = Inline function: ff(x,z) = sin(x).*exp(-z.*x) x=0:0.1:20; y=ff(x,0.3); 4. 執(zhí)行內(nèi)聯(lián)函數(shù) 內(nèi)聯(lián)函數(shù)還可以直接使用feval命令執(zhí)行。 語(yǔ)法: [y1,y2,…]=feval(inline_fun,arg1,arg2…) 【例8.19續(xù)】執(zhí)行內(nèi)聯(lián)函數(shù)。 x=0:0.1:20; z=0:0.05:10; y=feval(f

57、f,x,z) 8.6利用函數(shù)句柄執(zhí)行函數(shù) 8.6.1函數(shù)句柄的創(chuàng)建 1. 函數(shù)句柄的創(chuàng)建 語(yǔ)法: h_fun=@fun %創(chuàng)建函數(shù)句柄 h_fun=str2func(‘fun’) %創(chuàng)建函數(shù)句柄 h_array=str2func({‘fun1’,’fun2’,…}) %創(chuàng)建函數(shù)句柄數(shù)組 說(shuō)明:fun是函數(shù)名,h_fun是函數(shù)句柄,h_array是函數(shù)句柄數(shù)組。 【例8.20】創(chuàng)建MATLAB內(nèi)部函數(shù)的句柄。 h_sin=@sin; %創(chuàng)建函數(shù)句柄 h_cos=str2func(cos); %創(chuàng)建函

58、數(shù)句柄數(shù)組 h_array=str2func({sin,cos,tan}) h_array = @sin @cos @tan 2. 使用函數(shù)句柄的優(yōu)點(diǎn) (1) 在更大范圍調(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)用象使用變量一

59、樣方便、簡(jiǎn)單。 (4) 可迅速獲得同名重載函數(shù)的位置、類(lèi)型信息。 8.6.2用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ù)。 【例8.21】將【例8.17】編寫(xiě)的繪制二階系統(tǒng)時(shí)域響應(yīng)曲線中的調(diào)用各子函數(shù)改為利用函數(shù)句柄實(shí)現(xiàn)。 function y=Ex

60、0821(z1) % EX0821 利用函數(shù)句柄執(zhí)行函數(shù),二階系統(tǒng)時(shí)域響應(yīng) t=0:0.1:20; h_plotxy1=str2func(plotxy1) %創(chuàng)建函數(shù)句柄 h_plotxy2=str2func(plotxy2) %創(chuàng)建函數(shù)句柄 h_plotxy3=str2func(plotxy3) %創(chuàng)建函數(shù)句柄 if (z1>=0)&(z1<1) y=feval(h_plotxy1,z1,t); %執(zhí)行函數(shù) elseif z1==1 y=feval(h_plotxy2,z1,t); %執(zhí)行函數(shù) else y=feval(h_plo

61、txy3,z1,t); %執(zhí)行函數(shù) end function y1=plotxy1(zeta,x) %畫(huà)欠阻尼二階系統(tǒng)時(shí)域曲線 y1=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta)); plot(x,y1) function y2=plotxy2(zeta,x) %畫(huà)臨界阻尼二階系統(tǒng)時(shí)域曲線 y2=1-exp(-x).*(1+x); plot(x,y2) function y3=plotxy3(zeta,x) %畫(huà)過(guò)阻尼二階系統(tǒng)時(shí)域曲線 y3=1-1/(2*sqrt(zeta

62、^2-1))*(exp(-((zeta-sqrt(zeta^2-1))*x))./(zeta-sqrt(zeta^2-1))... -exp(-((zeta+sqrt(zeta^2-1))*x))./(zeta+sqrt(zeta^2-1))); plot(x,y3) 程序分析:在主函數(shù)中使用函數(shù)句柄執(zhí)行各子函數(shù),運(yùn)行的結(jié)果與【例8.17】相同。 在MATLAB的命令窗口調(diào)用該Ex0821函數(shù)有三種格式: (1) 用feval命令利用函數(shù)句柄執(zhí)行 h_Ex0821=str2func(Ex0821) h_Ex0821 = @Ex0821 y=f

63、eval(h_Ex0821,1); h_plotxy1 = @plotxy1 h_plotxy2 = @plotxy2 h_plotxy3 = @plotxy3 (2) 用feval命令利用函數(shù)名執(zhí)行 y=feval(Ex0821,1); (3) 直接調(diào)用函數(shù) y=Ex0821(1); 8.7利用泛函命令進(jìn)行數(shù)值分析 在MATLAB中,所有以函數(shù)為輸入變量的命令,都稱為泛函命令。 常見(jiàn)語(yǔ)法: [輸出變量列表]=函數(shù)名(h_fun,輸入變量列表) [輸出變量列表]=函數(shù)名(‘funname’,輸入

64、變量列表) 說(shuō)明:h_fun是要被執(zhí)行的M函數(shù)文件的句柄,或者是內(nèi)聯(lián)函數(shù)和字符串;‘funname’是M函數(shù)文件名。 8.7.1求極小值 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

65、的最小值。 【例8.22】用fminbnd求解humps函數(shù)的極小值。 [x,y]=fminbnd(@humps,0.5,0.8) %求在0.5—0.8之間極小值 x = 0.6370 y = 11.2528 程序分析:humps函數(shù)是MATLAB提供的M文件,保存為humps.m文件,@humps 表示humps函數(shù)的句柄,humps的曲線如圖8.7所示,最小值為圖中的圓點(diǎn)(0.6370,11.2528),誤差小于10-4。 圖8.7 求humps函數(shù)最小值 2. fminsearch函數(shù) fminsearch函數(shù)是求多變量無(wú)束縛

66、非線性最小值。 語(yǔ)法: x=fminsearch(h_fun,x0) x=fminsearch(‘funname’,x0) 說(shuō)明:x0是最小值點(diǎn)的初始猜測(cè)值。 【例8.23】求著名的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 = Inline function: fn(x) = 100*(x(2)-x(1)^2)^2+(1-x(1))^2 y=fminsearch(fn,[0.5,-1]) %從(0.5,-1)為初始值開(kāi)始搜索求最小值

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

最新文檔

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!