




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 MatLab & 數(shù)學(xué)建模 第三講 MatLab程序設(shè)計(jì)一、 M文件我們前面所介紹在MATLAB所做的運(yùn)算,是適合于所要計(jì)算的算式不太長(zhǎng)或是想以交談式方式做運(yùn)算,如果要計(jì)算的算式很長(zhǎng)有數(shù)十行或是須要一再執(zhí)行的算式,那么那樣的方式就行不通了。MATLAB提供了所謂的 M-file 的方式,可讓使用者自行將指令及算式寫成巨集程式然后儲(chǔ)存成一個(gè)特別的文檔,其擴(kuò)展名是m,譬如 picture.m,其中的picture就是文件名稱。1編寫M腳本文件的步驟l 點(diǎn)擊MATLAB指令窗工具條上的New File圖標(biāo) ,就可翻開如下圖的MATLAB文件編輯調(diào)試器。用戶即可在空白窗口中編寫程序。輸入如下
2、一段程序 (picture.m)x=linspace(0,2*pi,20); y=sin(x); plot(x,y,'r+') title('2D plot') 點(diǎn)擊編輯調(diào)試器工具條圖標(biāo) ,在彈出的Windows標(biāo)準(zhǔn)風(fēng)格的“保存為對(duì)話框中,選擇保存文件夾,鍵入新編文件名如picture,點(diǎn)擊【保存】鍵,就完成了文件保存。2運(yùn)行文件l 使picture.m所在目錄成為當(dāng)前目錄(系統(tǒng)默認(rèn)路徑),或讓該目錄處在MATLAB的搜索路徑上.l 然后在指令窗口運(yùn)行以下指令,便可得到圖形。picture 再來看另一個(gè) M-file: area.m 的例子 % 新建M-file
3、, area.m % 計(jì)算一個(gè)球的體積 r = input('Type radius 輸入半徑:'); Area=pi*r2; volume=(4/3)*pi*r3; fprintf('半徑 The radius is %12.5fn',r) fprintf('面積 The area of a circle is %12.5fn',Area) fprintf('體積 The volume of a sphere is %12.5fn',volume)在指令窗口運(yùn)行指令 area二、 M文件函數(shù)一個(gè)函數(shù)M文件與腳本文件類似之處在于它
4、們都是一個(gè)有.m 擴(kuò)展名的文本文件。如同腳本M文件一樣,函數(shù)M文件不進(jìn)入命令窗口,而是由文本編輯器所創(chuàng)立的外部文本文件。一個(gè)函數(shù)的M文件與腳本文件在通信方面是不同的。函數(shù)與MATLAB工作空間之間的通信,只通過傳遞給它的變量和通過它所創(chuàng)立的輸出變量。在函數(shù)內(nèi)中間變量不出現(xiàn)在MATLAB工作空間,或與MATLAB工作空間不交互。一個(gè)函數(shù)的M文件的第一行把M文件定義為一個(gè)函數(shù),并指定它的名字。它與文件名相同,但沒有.m 擴(kuò)展名。它也定義了它的輸入和輸出變量。M文件函數(shù)之間可以互相調(diào)用.M文件函數(shù)必須遵循以下特定的規(guī)那么。 1. 函數(shù)名和文件名必須相同。例如,函數(shù)fliplr 存儲(chǔ)在名為fliplr
5、.m 文件中。 2. MATLAB頭一次執(zhí)行一個(gè)M文件函數(shù)時(shí),它翻開相應(yīng)的文本文件并將命令編輯成存儲(chǔ)器的內(nèi)部表示,以加速執(zhí)行以后所有的調(diào)用。如果函數(shù)包含了對(duì)其它M文件函數(shù)的引用,它們也同樣被編譯到存儲(chǔ)器。普通的腳本M文件不被編譯,即使它們是從函數(shù)M文件內(nèi)調(diào)用;翻開腳本M文件,調(diào)用一次就逐行進(jìn)行注釋。 3. 在函數(shù)M文件中,到第一個(gè)非注釋行為止的注釋行是幫助文本。當(dāng)需要幫助時(shí),返回該文本。例如, » help fliplr返回上述前八行注釋。 4. 第一行幫助行,名為H1 行,是由lookfor 命令搜索的行。 5. 函數(shù)可以有零個(gè)或更多個(gè)輸入?yún)⒘?。函?shù)可以有零個(gè)或更多個(gè)輸出參量。 6
6、. 函數(shù)可以按少于函數(shù)M文件中所規(guī)定的輸入和輸出變量進(jìn)行調(diào)用,但不能用多于函數(shù)M文件中所規(guī)定的輸入和輸出變量數(shù)目。如果輸入和輸出變量數(shù)目多于函數(shù)M文件中function 語句一開始所規(guī)定的數(shù)目,那么調(diào)用時(shí)自動(dòng)返回一個(gè)錯(cuò)誤。 7. 當(dāng)函數(shù)有一個(gè)以上輸出變量時(shí),輸出變量包含在括號(hào)內(nèi)。例如,V,D = eig(A)。不要把這個(gè)句法與等號(hào)右邊的V,D 相混淆。右邊的V,D 是由數(shù)組V和D 所組成。 8. 當(dāng)調(diào)用一個(gè)函數(shù)時(shí),所用的輸入和輸出的參量的數(shù)目,在函數(shù)內(nèi)是規(guī)定好的。函數(shù)工作空間變量nargin 包含輸入?yún)⒘總€(gè)數(shù);函數(shù)工作空間變量nargout 包含輸出參量個(gè)數(shù)。事實(shí)上,這些變量常用來設(shè)置缺省輸入
7、變量,并決定用戶所希望的輸出變量。例: ,計(jì)算f(1)f(2)+f2(3)首先建立一個(gè)M函數(shù):fun1.mfunction Y= fun1(x)Y=(x3 - 2*x2 + x - 6.3)/(x2 + 0.05*x - 3.14);在指令窗口運(yùn)行以下指令:fun1(1)*fun1(2)+fun1(3)*fun1(3)ans = -12.6023例:計(jì)算階乘函數(shù) fact.mfunction output = fact(n) if n = 1 output = 1; return; end output = n*fact(n-1); return:通常情況下,當(dāng)被調(diào)函數(shù)執(zhí)行完后,MATLAB會(huì)
8、自動(dòng)地把控制轉(zhuǎn)至主調(diào)函數(shù)或者指定窗口。如果在被調(diào)函數(shù)中插入return命令后,可以強(qiáng)制matlab結(jié)束執(zhí)行該函數(shù)并把控制轉(zhuǎn)出。Return命令可使正在運(yùn)行的函數(shù)正常退出,返回調(diào)用它的函數(shù)繼續(xù)運(yùn)行,經(jīng)常用于函數(shù)的末尾用來正常結(jié)束函數(shù)的運(yùn)行。【例】M函數(shù)文件例如。circle.mfunction sa = circle(r,s)%CIRCLEplot a circle of radii r in the line specified by s.%r指定半徑的數(shù)值%s指定線色的字符串%sa圓面積% circle(r)利用藍(lán)實(shí)線畫半徑為 r 的圓周線.% circle(r,s)利用串 s 指定的線色畫
9、半徑為 r 的圓周線.% sa=circle(r)計(jì)算圓面積,并畫半徑為 r 的藍(lán)色圓面.% sa=circle(r,s)計(jì)算圓面積,并畫半徑為 r 的 s 色圓面.if nargin>2 error('輸入宗量太多。');end;if nargin=1 s='b'end;clf;t=0:pi/100:2*pi;x=r*exp(i*t);if nargout=0 plot(x,s);else sa=pi*r*r; fill(real(x),imag(x),s)endaxis('square')三 MATLAB控制流for循環(huán)結(jié)構(gòu)For循環(huán)允
10、許一組命令以固定的和預(yù)定的次數(shù)重復(fù)。For循環(huán)的一般形式是:for x = arraycommandsend在for和end語句之間的commands按數(shù)組中的每一列執(zhí)行一次?!纠?for n=1:10 x(n)=sin(n*pi/10); end» xx = Columns 1 through 7 0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 0.8090 Columns 8 through 10 0.5878 0.3090 0.0000 For循環(huán)可按需要嵌套。n=0:1:10;for i=1:11for j=1:11y(i)=sin(n(
11、i);n(j)=n(j)*10;endendy = Columns 1 through 7 0 -0.5064 0.9300 -0.8027 -0.1425 -0.9765 -0.5118 Columns 8 through 11 0.8586 -0.9957 0.9917 0.9287n = 1.0e+012 * Columns 1 through 7 0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 Columns 8 through 11 0.7000 0.8000 0.9000 1.0000可以利用break命令跳出for循環(huán)【例】一個(gè)簡(jiǎn)單的for
12、循環(huán)例如。for i=1:10; %i依次取1,2,10,.x(i)=i; %對(duì)每個(gè)i值,重復(fù)執(zhí)行由該指令構(gòu)成的循環(huán)體,end; x %要求顯示運(yùn)行后數(shù)組x的值。 x = 1 2 3 4 5 6 7 8 9 10 while循環(huán)結(jié)構(gòu)與For循環(huán)以固定次數(shù)求一組命令的值相反,While 循環(huán)以不定的次數(shù)求一組語句的值。While循環(huán)的一般形式是: while expression commands end只要在表達(dá)式里的所有元素為真,就執(zhí)行while和end 語句之間的commands?!纠?num=0;EPS=1; while (1+EPS)>1 EPS=EPS/2; num=num+
13、1; end» numnum = 53» EPS=2*EPSEPS = 2.2204e-016【例】x = zeros(1,6); % x是一個(gè)的零矩陣 i = 1; while i <= 6, x(i) = 1/i; i = i+1; end » xx =1.0000 0.5000 0.3333 0.2500 0.2000 0.1667可以利用break命令跳出while循環(huán)while循環(huán)可按需要嵌套。【例】Fibonacci數(shù)組的元素滿足Fibonacci 規(guī)那么: ,;且?,F(xiàn)要求該數(shù)組中第一個(gè)大于10000的元素。a(1)=1;a(2)=1;i=2;w
14、hile a(i)<=10000 a(i+1)=a(i-1)+a(i); %當(dāng)現(xiàn)有的元素仍小于10000時(shí),求解下一個(gè)元素。 i=i+1;end;i,a(i), i = 21 ans = 10946 if-else-end分支結(jié)構(gòu)很多情況下,命令的序列必須根據(jù)關(guān)系的檢驗(yàn)有條件地執(zhí)行。在編程語言里,這種邏輯由某種If-Else-End結(jié)構(gòu)來提供。最簡(jiǎn)單的If-Else-End結(jié)構(gòu)是: if expression commands end 如果在表達(dá)式中的所有元素為真(非零),那么就執(zhí)行if和end語言之間的commands【例】» apples=10; » cost=a
15、pples*25 cost = 250» if apples>5 cost=(1-20/100)*cost; end» costcost = 200假設(shè)有兩個(gè)選擇,If-Else-End結(jié)構(gòu)是: if expression commands evaluated if True else commands evaluated if False end在這里,如果表達(dá)式為真,那么執(zhí)行第一組命令;如果表達(dá)式是假,那么執(zhí)行第二組命令。 當(dāng)有三個(gè)或更多的選擇時(shí),If-Else-End結(jié)構(gòu)采用形式 if expression1 commands evaluated if expr
16、ession1 is True elseif expression2 commands evaluated if expression2 is True elseif expression3 commands evaluated if expression3 is True elseif expression4 commands evaluated if expression4 is True elseif else commands evaluated if no other expression is True end 最后的這種形式,只和所碰到的、與第一個(gè)真值表達(dá)式相關(guān)的命令被執(zhí)行;接下
17、來的關(guān)系表達(dá)式不檢驗(yàn),跳過其余的If-Else-End結(jié)構(gòu)。而且,最后的else命令可有可無?!纠縤f rand(1)>0.5disp('i love you')elsedisp('i donot love you')end【例】一個(gè)簡(jiǎn)單的分支結(jié)構(gòu)。cost=10;number=12;if number>8 sums=number*0.95*cost;end,sums sums = 114.0000 【例】用for循環(huán)指令來尋求Fibonacc數(shù)組中第一個(gè)大于10000的元素。n=100;a=ones(1,n);for i=3:n a(i)=a(i
18、-1)+a(i-2); if a(i)>=10000 a(i), break; %跳出所在的一級(jí)循環(huán)。 end;end,i ans = 10946i =21 switch-case-end結(jié)構(gòu)if-else-end語句所對(duì)應(yīng)的是多重判斷選擇,而有時(shí)也會(huì)遇到多分支判斷選擇的問題。MATLAB語言為解決多分支判斷選擇提供了switch-case語句。swich語句是多分支選擇語句,雖然在某些場(chǎng)合switch功能可以由if語句的多層嵌套來完成,但是會(huì)使程序變得復(fù)雜和難于修改維護(hù),而利用switch語句構(gòu)造多分支選擇時(shí)顯得更加簡(jiǎn)單明了、容易理解。switch-case語句的一般表達(dá)形式為:swi
19、tch表達(dá)式Case 選擇判斷值1 選擇判斷語句1case 選擇判斷值2 選擇判斷語句2otherwise 判斷執(zhí)行語句 end與其他的程序設(shè)計(jì)語言的switch-case語句不同的是,在MATLAB語言中,當(dāng)其中一個(gè)case語句后的條件為真時(shí),switch-case語句不對(duì)其后的case語句進(jìn)行判斷,也就是說在MATLAB語言中,即使有多條case判斷語句為真,也只執(zhí)行所遇到的第一條為真的語句。這樣就不必像C語言那樣,在每條case語句后加上break語句以防止繼續(xù)執(zhí)行后面為真的case條件語句。【例】學(xué)生的成績(jī)管理,用來演示switch結(jié)構(gòu)的應(yīng)用。%劃分區(qū)域:總分值(100),優(yōu)秀(90-
20、99),良好(80-89),及格(60-79),不及格(<60)。 N = input('輸入分?jǐn)?shù)');switch N case 100 %得分為100時(shí) S ='總分值'%列為'總分值'等級(jí) case 90 %得分在90和99之間 S =' 優(yōu)秀' %列為'優(yōu)秀'等級(jí) case 80 %得分在80和89之間 S =' 良好' %列為'良好'等級(jí) case 60 %得分在60和79之間 S =' 及格' %列為'及格'等級(jí) otherwise
21、%得分低于60。 S ='不及格' %列為'不及格'等級(jí) end disp(S)(此程序不正確!)程序2:N = input('輸入分?jǐn)?shù)');N1=fix(N/10);switch N1 case 10 %得分為100時(shí) S ='總分值'%列為'總分值'等級(jí) case 9 %得分在90和99之間 S =' 優(yōu)秀' %列為'優(yōu)秀'等級(jí) case 8 %得分在80和89之間 S =' 良好' %列為'良好'等級(jí) case 6,7 %得分在60和79之間 S
22、 =' 及格' %列為'及格'等級(jí) otherwise %得分低于60。 S ='不及格' %列為'不及格'等級(jí) end disp(S) 例: 某商場(chǎng)對(duì)顧客所購(gòu)置的商品實(shí)行打折銷售,標(biāo)準(zhǔn)如下(商品價(jià)格用price來表示): price<200 沒有折扣 200price<500 3%折扣 500price<1000 5%折扣 1000price<2500 8%折扣 2500price<5000 10%折扣5000price 14%折扣輸入所售商品的價(jià)格,求其實(shí)際銷售價(jià)格。 程序如下:price=inp
23、ut('請(qǐng)輸入商品價(jià)格');switch fix(price/100) case 0,1 %價(jià)格小于200 rate=0; case 2,3,4 %價(jià)格大于等于200但小于500 rate=3/100; case num2cell(5:9) %價(jià)格大于等于500但小于1000 rate=5/100; case num2cell(10:24) %價(jià)格大于等于1000但小于2500 rate=8/100; case num2cell(25:49) %價(jià)格大于等于2500但小于5000 rate=10/100; otherwise %價(jià)格大于等于5000 rate=14/100;en
24、dprice=price*(1-rate) %輸出商品實(shí)際銷售價(jià)格try-catch結(jié)構(gòu)【例】try-catch結(jié)構(gòu)應(yīng)用實(shí)例。clear,N=4;A=magic(3);%設(shè)置3行3列矩陣A。try A_N=A(N,:),%取A的第N行元素catch A_end=A(end,:),%如果取A(N,:)出錯(cuò),那么改取A的最后一行。endlasterr%顯示出錯(cuò)原因 A_end = 4 9 2ans = Index exceeds matrix dimensions. 例:tang.ma=2;b=2;x=-a:0.2:a;y=-b:0.2:b;for i=1:length(y) for j=1:length(x) if x(j)+y(i)>1 z(i,j)=0.5457*exp(-0.75*y(i)2-3.75*x(j)2-1.5*x(j); elseif x(j)+y(i)<=-1 z(i,j)=0.5457*exp(-0.75*y(i)2-3.75*
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 不定積分例題及參考答案
- 設(shè)備銷售合同14篇
- 計(jì)算機(jī)文化基礎(chǔ)模擬練習(xí)題(附參考答案)
- 表部分項(xiàng)工程安全技術(shù)交底表
- 2025年上學(xué)期湘潭縣一中高一五月月考試卷地理
- 苯乙胺項(xiàng)目商業(yè)計(jì)劃書
- 幼兒園大班《了不起的人》教案
- 財(cái)務(wù)會(huì)計(jì)培訓(xùn)教材
- 2025年阿里Android架構(gòu)師面試就這?我上我也行
- 建筑施工特種作業(yè)-橋(門)式起重機(jī)司機(jī)真題庫(kù)-8
- 2025壓覆礦產(chǎn)資源調(diào)查評(píng)估規(guī)范
- java筆試題目及答案
- 安徽省合肥一中2025屆高三5月回歸教材讀本
- 2024年江蘇省無錫市中考?xì)v史真題(解析版)
- 人人講安全個(gè)個(gè)會(huì)應(yīng)急 課件-2024-2025學(xué)年高二下學(xué)期防災(zāi)減災(zāi)主題班會(huì)
- 《成人慢性腎臟病食養(yǎng)指南(2024年版)》解讀
- 靜電放電(ESD)及其防護(hù)措施培訓(xùn)課件
- 2025年北京市東城區(qū)九年級(jí)初三一模語文試卷(含答案)
- 品控勞務(wù)合同協(xié)議
- 消防培訓(xùn)課件2025
- 2025-2030中國(guó)HFO1234yf行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
評(píng)論
0/150
提交評(píng)論