第7章程序設(shè)計(jì)_第1頁
第7章程序設(shè)計(jì)_第2頁
第7章程序設(shè)計(jì)_第3頁
第7章程序設(shè)計(jì)_第4頁
第7章程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩66頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

MATLAB7.0從入門到精通哈爾濱工業(yè)大學(xué)(威海)汽車工程學(xué)院2/5/20231課程主要內(nèi)容第1章MATLAB簡(jiǎn)介第2章數(shù)值運(yùn)算第3章單元數(shù)組和結(jié)構(gòu)第4章字符串第5章符號(hào)運(yùn)算第6章MATLAB繪圖基礎(chǔ)第7章程序設(shè)計(jì)第8章計(jì)算方法的MATLAB實(shí)現(xiàn)第9章優(yōu)化設(shè)計(jì)第10章SIMULINK仿真初探2/5/20232第7章程序設(shè)計(jì)MATLAB作為一種廣泛應(yīng)用于科學(xué)計(jì)算的工具軟件,不僅具有強(qiáng)大的數(shù)值計(jì)算、符號(hào)計(jì)算、矩陣運(yùn)算的能力和豐富的繪圖功能,還可以像C語言、FORTRAN等計(jì)算機(jī)高級(jí)語言一樣進(jìn)行程序設(shè)計(jì),編寫擴(kuò)展名為.m的M文件,實(shí)現(xiàn)各種復(fù)雜的運(yùn)算,同時(shí)MATLAB自帶的許多函數(shù)就是M文件函數(shù),用戶也可以利用M文件來生成和擴(kuò)充自己的函數(shù)庫。2/5/202337.1腳本和函數(shù)所謂M文件,簡(jiǎn)單來說就是用戶把要實(shí)現(xiàn)的命令寫在一個(gè)以.m作為擴(kuò)展名的文件中,然后由MATLAB系統(tǒng)進(jìn)行解釋,最后運(yùn)行出結(jié)果。M文件有函數(shù)和腳本兩種格式。兩者只是在語法和使用上有些不同。腳本式M文件沒有輸入?yún)?shù)或輸出參數(shù),而函數(shù)式M文件有輸入?yún)?shù)和輸出參數(shù);函數(shù)可以有零個(gè)或多個(gè)輸入或輸出變量。2/5/202347.1.1腳本腳本是一個(gè)擴(kuò)展名為.m的文件,其中包含了MATLAB的各種命令,與批處理文件很類似,在MATLAB命令窗口下直接輸入此文件的主文件名,MATLAB可逐一執(zhí)行在此文件內(nèi)的所有命令,和在命令窗口逐行輸入這些命令一樣。腳本式M文件運(yùn)行產(chǎn)生的所有變量都是全局變量,運(yùn)行腳本后,所產(chǎn)生的所有變量都駐留在MATLAB基本工作空間,只要用戶不使用clear命令加以清除,且MATLAB指令窗口不關(guān)閉,這些變量將一直保存?;究臻g隨MATLAB的啟動(dòng)而產(chǎn)生,在關(guān)閉MATLAB軟件時(shí)該基本空間被刪除。例:huitu0.m2/5/20235huitu0程序結(jié)果2/5/202367.1.2函數(shù)MATLAB中許多常用的函數(shù)都是函數(shù)式M文件,使用時(shí),MATLAB獲取傳遞給它的變量,利用操作系統(tǒng)所給的輸入,運(yùn)算得到要求的結(jié)果,然后返回這些結(jié)果。函數(shù)文件類似于一個(gè)黑箱,由函數(shù)執(zhí)行的命令以及這些命令所創(chuàng)建的中間變量都是隱含的。運(yùn)算過程中的中間變量都是局部變量(除特別聲明外),存放在函數(shù)本身的工作空間內(nèi),不會(huì)和MATLAB基本工作空間的變量相互覆蓋,對(duì)用戶來說,可見的只是輸入和輸出,因此易于使程序模塊化,特別適合于大型程序代碼。例:huitu.m2/5/20237huitu(1,2,3)程序結(jié)果2/5/202387.2M文件的程序結(jié)構(gòu)程序結(jié)構(gòu)一般分為順序結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、分支結(jié)構(gòu)三種。理論上講,只要有以上三種結(jié)構(gòu)就可以構(gòu)造功能強(qiáng)大的程序。與大多數(shù)計(jì)算機(jī)語言一樣,MATLAB也提供了上述三種程序結(jié)構(gòu)。雖然MATLAB沒有C語言那樣具有豐富的控制結(jié)構(gòu),但是MATLAB自身的強(qiáng)大功能彌補(bǔ)了這個(gè)不足,使用戶在編程時(shí)幾乎感覺不到困難。下面分別對(duì)這三種結(jié)構(gòu)進(jìn)行介紹。2/5/202397.2.1順序結(jié)構(gòu)順序結(jié)構(gòu)就是依次順序地執(zhí)行程序的各條語句。順序結(jié)構(gòu)一般不含有其他子結(jié)構(gòu)或控制語句,批處理文件就是典型的順序結(jié)構(gòu)的文件。例:jizhi.m2/5/202310jizhi程序結(jié)果2/5/2023117.2.2循環(huán)結(jié)構(gòu)在實(shí)際計(jì)算中,經(jīng)常會(huì)碰到許多有規(guī)律的重復(fù)計(jì)算,此時(shí)就要對(duì)某些語句進(jìn)行重復(fù)執(zhí)行。一組被重復(fù)執(zhí)行的語句稱為循環(huán)體,每個(gè)循環(huán)語句都要有循環(huán)條件,以判斷循環(huán)是否要繼續(xù)進(jìn)行下去。MATLAB中的循環(huán)語句包括for循環(huán)與while循環(huán)。2/5/2023121、for循環(huán)for循環(huán)允許一組命令以固定的和預(yù)定的次數(shù)重復(fù)執(zhí)行,for循環(huán)的一般形式如下所示:for循環(huán)變量=數(shù)組循環(huán)體(執(zhí)行語句);end在for與end語句之間的執(zhí)行語句是按矩陣(或數(shù)組)中的每一列執(zhí)行一次,即在每一次循環(huán)中,矩陣(或數(shù)組)元素一個(gè)一個(gè)地被賦給循環(huán)變量,然后由執(zhí)行語句執(zhí)行。例:for1.m,specmat.m2/5/202313程序結(jié)果>>for1x=Columns1through72.03041.80081.51311.41651.71832.51113.7462Columns8through105.26206.85878.38912/5/202314>>specmat(6)ans=1111111234561361015151410101515151515151516151515152/5/202315用for循環(huán)語句需要注意以下事項(xiàng):(1)不能在for循環(huán)體內(nèi)重新對(duì)循環(huán)變量n賦值來終止循環(huán)的執(zhí)行。(2)for循環(huán)可以進(jìn)行嵌套循環(huán)。(3)循環(huán)語句內(nèi)的“;”可防止中間變量的輸出。2/5/2023162、while循環(huán)與for循環(huán)固定的次數(shù)求一組命令的值相反,while循環(huán)以不定的次數(shù)來求一組命令的值。while循環(huán)的一般形式如下:while表達(dá)式循環(huán)體();n+1;(自增)end只要表達(dá)式中的元素為真,就執(zhí)行while和end語句之間的命令。通常,表達(dá)式給出的是一個(gè)標(biāo)量值,但數(shù)組(或矩陣)同樣有效。若為數(shù)組(或矩陣),則要求所有的元素都必須為真。例:while1.m2/5/202317程序結(jié)果>>while1a=2.46192/5/202318程序?qū)嵗龁栴}描述:根據(jù)統(tǒng)計(jì)學(xué)的基礎(chǔ)知識(shí)分析樣本的平均值和標(biāo)準(zhǔn)差。例:for2.m和while2.m2/5/202319程序結(jié)果>>for2Enterthenumberofthepoints:6Enterthevalue:1Enterthevalue:3Enterthevalue:5Enterthevalue:7Enterthevalue:9Enterthevalue:0Themeanofthisdatasetis:4.166667Thestandarddeviationis:3.488075Thenumberofdatais:62/5/202320>>while2Enterthefirstvalue:1Enterthefirstvalue:3Enterthefirstvalue:5Enterthefirstvalue:7Enterthefirstvalue:9Enterthefirstvalue:0Enterthefirstvalue:-1Themeanofthisdatasetis:4.166667Thestandarddeviationis:3.488075Thenumberofdatais:62/5/2023217.2.3分支結(jié)構(gòu)在程序設(shè)計(jì)中,經(jīng)常要根據(jù)一定的條件來執(zhí)行不同的語句。當(dāng)某些條件滿足時(shí),只執(zhí)行其中的某個(gè)語句或某些語句。在這種情況下,分支結(jié)構(gòu)就會(huì)是很好的選擇了。在MATLAB中的分支結(jié)構(gòu)語句包括if-else-end語句與switch-case-otherwise語句。2/5/2023221、if-else-end選擇語句if-else-end選擇語句的結(jié)構(gòu)如下所示:if條件式1表達(dá)式1;elseif條件式2表達(dá)式2;...else表達(dá)式n;end哪一個(gè)if后的表達(dá)式中值為真,就執(zhí)行該if后的表達(dá)式,否則跳過該表達(dá)式進(jìn)行其它判斷。例:ff.m2/5/202323程序結(jié)果>>ff(-1)ans=1>>ff(2)ans=0.5000>>ff(8)ans=0.9894>>ff(16)ans=42/5/202324采用plot(x,ff(x))繪分段函數(shù)圖。x1=-2:0.01:0;x2=0.5:0.01:5;x3=5.01:0.01:10;x4=10.01:0.01:12;plot(x1,ff(x1))holdonplot(x2,ff(x2))holdonplot(x3,ff(x3))holdonplot(x4,ff(x4))gridon2/5/202325程序結(jié)果2/5/202326MATLAB中的選擇語句switch-case-otherwise,是特別讓熟悉C等高級(jí)語言的用戶方便地編寫M文件而專門添加的。switch-case-otherwise語句的通用格式如下:swithexpressioncasevalue1statements1;...casevaluenstatementsn;otherwisestatements;end2、switch-case-otherwise分支語句2/5/202327其中,switch-expression給出了開關(guān)條件,當(dāng)有case-expression與之匹配時(shí),就執(zhí)行其后的語句,如果沒有case-expression與之匹配,就執(zhí)行otherwise后面的語句。在執(zhí)行過程中,只有一個(gè)case命令被執(zhí)行,當(dāng)執(zhí)行完命令后,程序就跳出分支結(jié)構(gòu),執(zhí)行end下面的語句。例:fm.m2/5/202328程序結(jié)果>>fm(0)ans=20>>fm(1)ans=40>>fm(2)ans=60>>fm(3)ans=80>>fm(5)ans=1002/5/202329工程實(shí)例問題描述:向上斜拋的小球,具有如下的運(yùn)動(dòng)模型,仿真小球的運(yùn)動(dòng)軌跡。例:ball.m2/5/202330程序結(jié)果>>ballEntertheinitialvelocity:20Rangeversusangletheta:00.000057.07321013.93161520.36662026.18282531.20343035.27603538.27674040.11442/5/2023314540.73325040.11445538.27676035.27606531.20347026.18287520.36668013.9316857.0732900.0000Maxrangesis40.7332at45degrees.2/5/202332圖形結(jié)果2/5/2023337.3程序流控制在許多程序設(shè)計(jì)語言中,經(jīng)常要碰到提前終止循環(huán)、跳出程序、顯示出錯(cuò)信息等,此時(shí)就需要用到控制程序流的命令。在MATLAB中,同樣有這樣的程序控制流命令。下面逐一介紹MATLAB中的程序流的控制命令。2/5/2023341、continue命令continue命令經(jīng)常與for或while語句一起使用,其作用是結(jié)束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行的語句,接著進(jìn)行下一次是否執(zhí)行循環(huán)的判斷。注:當(dāng)條件滿足時(shí),continue語句才被調(diào)用,跳出后面的語句,循環(huán)繼續(xù),條件不滿足則繼續(xù)執(zhí)行后面的程序。例:continue1.m2/5/202335程序結(jié)果>>continue1357911468101257911136810121479111315810121416911131517101214161811131517191214161820

2/5/2023362、break命令break命令也經(jīng)常與for或while等語句一起使用,其作用是終止本次循環(huán),跳出最內(nèi)層的循環(huán)。使用break命令可以不必等到循環(huán)的自然結(jié)束,而是根據(jù)條件,強(qiáng)制退出循環(huán)。這在很多情況下是必須的。注:當(dāng)條件滿足時(shí),break語句才被調(diào)用,系統(tǒng)將在循環(huán)尚未結(jié)束時(shí)跳出當(dāng)前循環(huán),條件不滿足則繼續(xù)執(zhí)行后面的程序。例:jitu.m2/5/202337程序結(jié)果>>jituThenumberofchickenis22.Thenumberofrabbitis14.2/5/2023383、return命令return命令能使當(dāng)前正在運(yùn)行的函數(shù)正常退出,并返回調(diào)用它的函數(shù),繼續(xù)運(yùn)行。這個(gè)語句經(jīng)常用于函數(shù)的末尾,以正常結(jié)束函數(shù)的運(yùn)行。當(dāng)然,也可用于函數(shù)的其他地方,對(duì)某些條件進(jìn)行判斷,如果條件不符合要求,調(diào)用return語句終止當(dāng)前運(yùn)行,并返回調(diào)用它的函數(shù)或環(huán)境。實(shí)際上,MATLAB中此語句的作用與其他的程序設(shè)計(jì)語言中的作用相同。例:dreturn.m2/5/202339程序?qū)嵗?gt;>dreturn('2')ans=5>>dreturn('')ans=5>>dreturn('')ans=12/5/2023404、echo語句通常在MATLAB中執(zhí)行M文件時(shí),在命令窗口是看不到執(zhí)行過程的。但在特殊情況下,比如需要對(duì)M文件演示時(shí),要求M文件的每條命令都要顯示出來,此時(shí)用echo命令就可以實(shí)現(xiàn)這樣的操作。對(duì)于腳本式M文件與函數(shù)式M文件,echo命令略有不同。對(duì)于腳本式M文件,可以用以下方式來實(shí)現(xiàn):echoon%顯示其后所有執(zhí)行的命令文件的指令echooff%不顯示其后所有執(zhí)行的命令文件的指令echo%在上述兩種情況下進(jìn)行切換對(duì)于函數(shù)式M文件,可以用以下方式來實(shí)現(xiàn):echofilenameon%使filename指定的M文件的執(zhí)行指令顯示出來echofilenameoff%使filename指定的M文件的執(zhí)行指令不顯示出來echoonall%其后的所有M文件的執(zhí)行指令顯示2/5/2023415、error語句在進(jìn)行程序設(shè)計(jì)時(shí),許多情況下有錯(cuò)誤出現(xiàn),此時(shí)如果能把錯(cuò)誤信息顯示出來,那樣就會(huì)使用戶了解到是什么原因引起錯(cuò)誤,以采取適合的方式防止錯(cuò)誤的再次發(fā)生。MATLAB中的error(‘錯(cuò)誤信息?就用于實(shí)現(xiàn)上述功能。此命令能顯示錯(cuò)誤信息并終止當(dāng)前函數(shù)的運(yùn)行,將控制信息返回到鍵盤。該指令用來指示出錯(cuò)信息并終止當(dāng)前函數(shù)的運(yùn)行。error(‘message’)類似的是warning,區(qū)別是warning之后程序繼續(xù)運(yùn)行。2/5/2023426、try...catch語句try...catch語句的作用與上面的error語句類似,是用于對(duì)異常進(jìn)行處理的命令。把有可能引起異常的語句放在try控制塊中,這樣當(dāng)try控制塊中statement語句引起異常時(shí),catch控制塊就可以捕獲它,并針對(duì)不同的錯(cuò)誤類型,進(jìn)行不同的處理。它與C++程序設(shè)計(jì)語言中的try...catch命令作用一樣。try...catch命令的調(diào)用格式如下:try(commands1),catch(commands2),end組命令1總被執(zhí)行,當(dāng)執(zhí)行出現(xiàn)錯(cuò)誤時(shí),catch控制塊就可捕獲它,執(zhí)行組命令2,針對(duì)不同錯(cuò)誤類型進(jìn)行不同的處理??捎胠asterr函數(shù)查詢出錯(cuò)原因。注意try和catch控制塊中的語句之間用逗號(hào)隔開。例:chucuo.m2/5/202343程序結(jié)果>>chucuoa_end=492ans=Attemptedtoaccessa(4,:);indexoutofboundsbecausesize(a)=[3,3].2/5/2023447、input語句input命令用來提示用戶從鍵盤輸入數(shù)據(jù)、字符串或表達(dá)式,并接受輸入值。r=input(‘prompt’)在屏幕上顯示提示信息prompt,等待用戶輸入,并將值賦給r,直接回車則輸出空矩陣。r=input(‘prompt’,’s’)返回的字符串作為文本變量而不作為變量名或者數(shù)值。例:test.m2/5/202345程序結(jié)果>>testDoyouwantmore?Y/N[Y]:Yyouhaveselectedthefirstcharacter>>testDoyouwantmore?Y/N[Y]:Nyouhaveselectedthesecondone>>testDoyouwantmore?Y/N[Y]:syouhaveselectedthesecondone2/5/2023468、pause命令pause命令用于暫時(shí)終止程序的運(yùn)行,等待用戶按任意鍵繼續(xù)進(jìn)行。pause暫停M文件的執(zhí)行,按任意鍵繼續(xù)pause(n)終止程序n秒,n是任意實(shí)數(shù)pauseon允許后面的pause命令起作用pauseoff使后面的pause命令不起作用例:pause1.m2/5/2023477.4腳本文件腳本文件只是逐條的解釋文件中的程序條,與命令窗口直接輸入一樣,只是它具有了存儲(chǔ)能力,且可以方便的多次運(yùn)行該程序段,在命令窗口中只需輸入存儲(chǔ)的文件名即可,且存儲(chǔ)的文件名沒有特殊要求。腳本文件中可以調(diào)用函數(shù),只需調(diào)用函數(shù)名即可。2/5/2023487.5函數(shù)文件函數(shù)的格式必須加function,并且M文件的存儲(chǔ)名必須與函數(shù)名相同。一般函數(shù)都有輸入和輸出。2/5/202349謝謝!2/5/202350huitu0.mx=-pi:0.01:pi;y=cos(x);plot(x,y);gridon返回2/5/202351huitu.mfunctionf=huitu(a,b,c)x=-pi:0.01:pi;f=a*sin(b*x+c);plot(x,f);gridon返回2/5/202352jizhi.mx=-pi:0.01:pi;y=sin(x)+sin(2*x)-cos(3*x);h=plot(x,y);x=get(h,'XData');y=get(h,'YData');imin=find(min(y)==y);imax=find(max(y)==y);holdontext(x(imin),y(imin),['minimum=',num2str(y(imin))]);text(x(imax),y(imax),['maximum=',num2str(y(imax))]);gridonplot(x(imin),y(imin),'o')plot(x(imax),y(imax),'*')返回2/5/202353for1.mforn=1:10x(n)=exp(n/5)+cos(n*pi/5);endx返回2/5/202354specmat.mfunctionA=specmat(n)A=ones(n);forr=1:nforc=1:nifr>1&c>1s=A(r-1,c)+A(r,c-1);ifs<20A(r,c)=s;elseA(r,c)=max(A(r-1,c),A(r,c-1));endendendend返回2/5/202355while1.mn=1;a=0;whilen<10a=a+log(n)/n;n=n+1;enda返回2/5/202356for2.msum1=0;sum2=0;n=input('Enterthenumberofthepoints:');ifn<2disp('Atleast2valuesmustbeentered.');elsefori=1:nx=input('Enterthevalue:');sum1=sum1+x;sum2=sum2+x^2;endxvar=sum1/n;std_dev=sqrt((n*sum2-sum1^2)/(n*(n-1)));fprintf('Themeanofthisdatasetis:%f\n',xvar);fprintf('Thestandarddeviationis:%f\n',std_dev);fprintf('Thenumberofdatais:%d\n',n);end返回2/5/202357while2.mn=0;sum1=0;sum2=0;x=input('Enterthefirstvalue:');whilex>=0n=n+1;sum1=sum1+x;sum2=sum2+x^2;x=input('Enterthefirstvalue:');endxvar=sum1/n;std_dev=sqrt((n*sum2-sum1^2)/(n*(n-1)));fprintf('Themeanofthisdatasetis:%f\n',xvar);fprintf('Thestandarddeviationis:%f\n',std_dev);fprintf('Thenumberofdatais:%d\n',n);返回2/5/202358ff.mfunctiony=ff(x)ifx<=0y=x.^2;elseif0<x&x<=5y=1./x;elseif5<x&x<=10y=sin(x);elseifx>10y=x./4;end返回2/5/202359fm.mfunctionf=fm(n)switchncase0f=20;case1f=40;case2f=60;case3f=80;otherwisef=100;end返回2/5/202360ball.mconv=pi/180;g=-9.82;v0=input('Entertheinitialvelocity:');range=zeros(1,91);%計(jì)算最大的水平距離。fori=1:91theta=i-1;vx0=v0*cos(theta*conv);vy0=v0*sin(theta*conv);maxtime=-2*vy0/g;range(i)=vx0*maxtime;end2/5/202361%顯示計(jì)算水平距離的列表。fprintf('Rangeversusangletheta:\n');fori=1:5:91theta=i-1;fprintf('%2d%8.4f\n',theta,range(i));end%計(jì)算最大的角度和水平距離。[maxrangeindex]=max(range);maxangle=index-1;fprintf('\nMaxrangesis%8.4fat%2ddegrees.\n',maxrange,maxangle);2/5/202362%繪制軌跡圖形。fori=5:10:80theta=i;vx0=v0*cos(theta*conv);vy0=v0*sin(theta*conv);maxtime=-2*vy0/g;%計(jì)算小球軌跡的x,y坐標(biāo)數(shù)值。x=zeros(1,21);y=zeros(1,21);forj=1:21time=(j-1)*maxtime/20;x(j)=vx0*time;y(j)=vy0*time+0.5*g*time^2;endplot(x,y,'g')ifi==5holdon;endend2/5/202363%添加圖形的標(biāo)題和坐標(biāo)軸名稱。title('TrajectoryofBallvsInitialAngle\theta');xlabel('x(meters)');ylabel('y(meters)');axis([0max(range)+50-v0^2/2/g]);gridon2/5/202364%繪制最大水平的軌跡圖形。vx0=v0*cos(maxangle*conv);vy0=v0*sin(maxangle*conv);maxtime=-2*vy0/g;x=zeros(1,21);y=zeros(1,21)

溫馨提示

  • 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. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論