




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2023/1/31MATLAB程序設(shè)計(jì)吳鵬(rocwoods)rocwoods@126.comMATLAB從零到進(jìn)階2023/1/31主要內(nèi)容
M文件——腳本文件和函數(shù)文件
MATLAB程序流程控制與調(diào)試程序流程控制示例
匿名函數(shù)、子函數(shù)與嵌套函數(shù)
匿名函數(shù)、子函數(shù)與嵌套函數(shù)應(yīng)用案例
編寫(xiě)高效的MATLAB程序
養(yǎng)成良好的編程風(fēng)格
2023/1/31第一節(jié)M文件——腳本文件和函數(shù)文件
2023/1/31一、腳本文件1.什么時(shí)候適合用腳本文件2.什么是腳本文件
指令的增加并且需要頻繁重復(fù)計(jì)算時(shí),直接從指令窗進(jìn)行計(jì)算很麻煩。這時(shí)候使用腳本文件最為適宜
。
所謂腳本文件,就是一些按用戶意圖排列的MATLAB指令(包括流程控制指令在內(nèi))組成的M文件。3.腳本文件和函數(shù)文件的區(qū)別
腳本文件運(yùn)行后,產(chǎn)生的所有變量都駐留在MATLAB基本工作空間(baseworkspace)中。只要用戶不使用clear指令加以清除,或MATLAB不關(guān)閉,這些變量將一直保存在基本工作空間。2023/1/31二、函數(shù)文件其中out1,out2,…為輸出參數(shù)列表,in1,in2,…為輸入?yún)?shù)列表,funname為函數(shù)名。輸入?yún)?shù)和輸出參數(shù)個(gè)數(shù)根據(jù)問(wèn)題的需要可以為0個(gè)到多個(gè)。函數(shù)文件也需要保存到MATLAB的搜索路徑下才能被調(diào)用。
格式:每個(gè)函數(shù)都由“function”引導(dǎo),如下:function[out1,out2,…]=funname(in1,in2,…)注釋說(shuō)明部分(%號(hào)引導(dǎo)的行)函數(shù)體
2023/1/31第二節(jié)MATLAB程序流程控制與調(diào)試
2023/1/31一、MATLAB程序流程控制if-else-end結(jié)構(gòu)switch-case-otherwise-end結(jié)構(gòu)for循環(huán)while循環(huán)try-catch結(jié)構(gòu)其他中斷、暫停語(yǔ)句2023/1/31二、MATLAB程序調(diào)試
2.設(shè)置斷點(diǎn)進(jìn)行調(diào)試
1.語(yǔ)法錯(cuò)誤和運(yùn)行結(jié)果錯(cuò)誤
語(yǔ)法錯(cuò)誤即所書(shū)寫(xiě)的代碼不符合MATLAB語(yǔ)法規(guī)范所造成的錯(cuò)誤,比如由于粗心造成的拼寫(xiě)錯(cuò)誤,不十分了解某個(gè)函數(shù)的調(diào)用方法而造成的調(diào)用錯(cuò)誤等
。運(yùn)行結(jié)果錯(cuò)誤是一類(lèi)非常難以檢查的錯(cuò)誤,程序能正常運(yùn)行,只是運(yùn)行結(jié)果與期望的不一樣,這類(lèi)錯(cuò)誤大多是由于算法錯(cuò)誤引起的。2023/1/31在程序編輯窗口中編寫(xiě)的M代碼的每一行的前面都標(biāo)有行號(hào),在可執(zhí)行的命令行的行號(hào)后面都有一個(gè)小短橫“-”,單擊某一行的“-”,就可在該行設(shè)置一個(gè)斷點(diǎn),此時(shí)的“-”變成了紅色的圓點(diǎn),表示設(shè)置斷點(diǎn)成功。將光標(biāo)放到M代碼的某一行上,然后按快捷鍵F12,或者單擊程序編輯窗口工具欄上的圖標(biāo),也可以通過(guò)菜單項(xiàng)“Debug→Set/ClearBreakpoint”設(shè)置斷點(diǎn)。用函數(shù)dbstop設(shè)置斷點(diǎn)。2023/1/31第三節(jié)程序流程控制示例
2023/1/31一、概述
要通過(guò)一個(gè)完整的MATLAB程序來(lái)展示各種流程控制的用法,該程序來(lái)源于如下一個(gè)有趣的問(wèn)題。一只失明的小貓不幸掉進(jìn)山洞里,山洞有三個(gè)門(mén),其中第一個(gè)門(mén)進(jìn)去后走兩個(gè)小時(shí)后可以回到地面,第二個(gè)門(mén)進(jìn)去后走四個(gè)小時(shí)又回到原始出發(fā)點(diǎn),不幸的是第三個(gè)門(mén)進(jìn)去后走六個(gè)小時(shí)還是回到原始出發(fā)點(diǎn)。小貓由于眼睛失明,每次都是隨機(jī)的選擇其中一個(gè)門(mén)走。問(wèn)題是這只可憐的小貓走出山洞的期望時(shí)間是多少?2023/1/31二、問(wèn)題分析
設(shè)小貓走出山洞的期望時(shí)間為t,如果小貓不幸進(jìn)了第二個(gè)或第三個(gè)門(mén),那么它過(guò)四個(gè)小時(shí)或是六個(gè)小時(shí)后又和進(jìn)門(mén)之前面臨狀況一樣了,只不過(guò)這兩種不幸的情況發(fā)生的概率都為1/3,而萬(wàn)幸一次性走出去的概率也是1/3。于是我們可以得到下面的方程:
t=2*1/3+(4+t)*1/3+(6+t)*1/3
很簡(jiǎn)單的一元一次方程,解得t=12。1.解析分析方法2.計(jì)算機(jī)模擬的思路2023/1/31輸入正整數(shù)n作為模擬小貓出洞的次數(shù),生成一個(gè)1*n的數(shù)組T用來(lái)記錄每次小貓出洞時(shí)間,初始值為0。k從1循環(huán)到n,T(k)用來(lái)記錄每次實(shí)際出洞的時(shí)間。隨機(jī)等概率的生成{1,2,3}之間的一個(gè)數(shù)c,如果c=1,T(k)=T(k)+2,小貓走出山洞,開(kāi)始下一次模擬。否則根據(jù)c=2或者c=3決定T(k)=T(k)+4或T(k)=T(k)+6,并繼續(xù)隨機(jī)生成c,直到c=1。模擬完n次后,計(jì)算T的均值得到小貓走出山洞的期望時(shí)間的近似值2023/1/31三、程序代碼
functionT=cat_in_holl(varargin)%varargin,使函數(shù)可以接受參數(shù)個(gè)數(shù)不定的輸入if~isempty(varargin)%輸入?yún)?shù)非空n=varargin{1};%varargin為cell型數(shù)組,取其第一個(gè)元素賦給nend%try-catch結(jié)構(gòu)用法示例try%如果n是正整數(shù)下面語(yǔ)句不會(huì)發(fā)生錯(cuò)誤,進(jìn)而執(zhí)行try-catch結(jié)構(gòu)之后的語(yǔ)句
%否則會(huì)發(fā)生錯(cuò)誤,執(zhí)行由catch引導(dǎo)的語(yǔ)句。
ifn>0&&mod(n,1)==0;%n為正整數(shù)的判斷條件
%空語(yǔ)句,不會(huì)報(bào)錯(cuò)
else%n不是正整數(shù),報(bào)錯(cuò)
error;end2023/1/31catchME%ME,用來(lái)記錄發(fā)生錯(cuò)誤的一些信息
disp('函數(shù)沒(méi)有輸入?yún)?shù)或者輸入?yún)?shù)不是正整數(shù)標(biāo)量');T=[];%給T賦空值
return;%函數(shù)返回,后面語(yǔ)句不再執(zhí)行,沒(méi)有return會(huì)接著執(zhí)行后面的語(yǔ)句end%switch-case-end結(jié)構(gòu)用法示例switchnargin%nargin,函數(shù)輸入?yún)?shù)的個(gè)數(shù)
case1%case1的情況是我們程序的核心部分,即整個(gè)模擬出洞的過(guò)程
T=zeros(1,n);fork=1:n%for循環(huán)用法示例
c=unidrnd(3,1);%等概率隨機(jī)生成{1,2,3}中某個(gè)數(shù)字2023/1/31whilec~=1%while循環(huán)用法示例
ifc==2T(k)=T(k)+4;elseT(k)=T(k)+6;endc=unidrnd(3,1);endT(k)=T(k)+2;endcase2T=[];disp('函數(shù)只能有一個(gè)輸入?yún)?shù),且為正整數(shù)');otherwiseT=[];disp('函數(shù)輸入?yún)?shù)個(gè)數(shù)不能大于1,參數(shù)需為正整數(shù)');end2023/1/31四、程序驗(yàn)證
在Editor中新建一個(gè)m文件,將上述程序復(fù)制過(guò)去,并以cat_in_holl.m文件名保存到MATLAB的搜索路徑下,對(duì)于n=10^4以及n=10^5,我們可以用如下指令得到近似期望時(shí)間T:
>>n=1e4; >>T=cat_in_holl(n); >>mean(T) ans= 11.8888 >>T=cat_in_holl(n); >>mean(T) ans= 12.02222023/1/31cat_in_holl.m是一個(gè)完整的m函數(shù)文件,里面用到了幾乎各種流程控制方法。讀者朋友可以試運(yùn)行如下指令,觀看程序結(jié)果,體會(huì)各流程控制的功能:
T=cat_in_holl;%沒(méi)有輸入?yún)?shù)
T=cat_in_holl(10.1);%輸入?yún)?shù)為小數(shù)
T=cat_in_holl(-10000);%輸入?yún)?shù)為負(fù)數(shù)
T=cat_in_holl({1000});%輸入為元胞數(shù)組
T=cat_in_holl(1000,100);%輸入?yún)?shù)為2個(gè)
T=cat_in_holl(1000,100,100);%輸入?yún)?shù)大于2個(gè)2023/1/31第四節(jié)匿名函數(shù)、子函數(shù)與嵌套函數(shù)
2023/1/31一、匿名函數(shù)1. 匿名函數(shù)定義
fhandle=@(arglist)expr
其中,expr是具體的函數(shù)表達(dá)式,arglist是指定的函數(shù)的自變量。 匿名函數(shù)按照不同的分類(lèi)方法可以分為不同的種類(lèi)。按照自變量的個(gè)數(shù)以及層數(shù)可以分為以下幾種:?jiǎn)巫兞磕涿瘮?shù),多變量匿名函數(shù),單重匿名函數(shù),多重匿名函數(shù)。2. 單變量匿名函數(shù)
f=@(x)x.^2;3. 多變量匿名函數(shù)
g=@(x,y)x.^2+y.^2;2023/1/314. 單重匿名函數(shù) 無(wú)論單變量還是多變量匿名函數(shù),都屬于單重匿名函數(shù)。這類(lèi)匿名函數(shù)的特點(diǎn)是,只有一個(gè)“@”符號(hào)引導(dǎo),“@”之后就是具體的函數(shù)表達(dá)式。自變量輸入單重匿名函數(shù)后,得到的是具體的數(shù)值。除了單重匿名函數(shù)外,還有雙層、乃至多重匿名函數(shù)。這些多重匿名函數(shù)在參數(shù)傳遞方面非常方便。5. 多重匿名函數(shù)
f=@(a,b)@(x)a*x+b f= @(a,b)@(x)a*x+b
其中“a,b”是外層變量,“x”是內(nèi)層變量。可以這樣理解這個(gè)表達(dá)式:每個(gè)“@”符號(hào)后面括號(hào)里的變量的作用域一直到表達(dá)式的結(jié)尾。這樣,“a,b”的作用域就是“@(x)a*x+b”,而“x”的作用域就是“a*x+b”。因此,對(duì)于給定的“a,b”,“gab=f(a,b)”是一個(gè)單層以x為變量的單變量匿名函數(shù)。2023/1/31二、子函數(shù)函數(shù)M文件中,我們稱第一個(gè)“function”引導(dǎo)的函數(shù)為主函數(shù),外部調(diào)用函數(shù)文件時(shí)總是從主函數(shù)開(kāi)始執(zhí)行。如果整個(gè)函數(shù)文件只有一個(gè)函數(shù),那這個(gè)函數(shù)就是主函數(shù)。在設(shè)計(jì)比較復(fù)雜的程序的時(shí)候,為了能夠使程序之間邏輯關(guān)系清楚,易于閱讀和維護(hù),通常會(huì)采用模塊化的設(shè)計(jì)方式,這時(shí)就會(huì)涉及子函數(shù)的使用。從函數(shù)編寫(xiě)格式以及形態(tài)上來(lái)說(shuō),子函數(shù)和主函數(shù)并無(wú)區(qū)別,區(qū)別僅在于在函數(shù)文件中的位置以及調(diào)用關(guān)系。2023/1/31子函數(shù)是在同一函數(shù)文件中,主函數(shù)之后的由“function”引導(dǎo)的函數(shù),一個(gè)函數(shù)文件可以有多個(gè)子函數(shù)。這些子函數(shù)在函數(shù)文件中的排列順序可以隨意,前提是都要位于主函數(shù)后。子函數(shù)可以被其所在的函數(shù)文件中的主函數(shù)和其他子函數(shù)調(diào)用,子函數(shù)也可以調(diào)用主函數(shù),在設(shè)計(jì)子函數(shù)調(diào)用主函數(shù)的程序時(shí)一定要小心,避免形成“死”的調(diào)用循環(huán)。
2023/1/31三、嵌套函數(shù)在程序編寫(xiě)中,有的數(shù)學(xué)表達(dá)式比較長(zhǎng),不方便用一行來(lái)表示,而且這個(gè)表達(dá)式里還有其他的參數(shù)。這時(shí)候我們就需要將其寫(xiě)成函數(shù),用嵌套函數(shù)可以方便的解決參數(shù)共享問(wèn)題。當(dāng)求解微分方程或者進(jìn)行優(yōu)化問(wèn)題求解時(shí),一些復(fù)雜的表達(dá)式往往涉及參數(shù)傳遞過(guò)程,這個(gè)時(shí)候,比較適合將其表達(dá)式寫(xiě)成嵌套函數(shù)。在編寫(xiě)GUI用戶界面的回調(diào)函數(shù)時(shí),參數(shù)傳遞往往是個(gè)棘手的問(wèn)題。利用嵌套函數(shù),可以方便解決這個(gè)問(wèn)題。2023/1/311. 嵌套函數(shù)定義
嵌套函數(shù),即nestedfunction,顧名思義,是嵌套在函數(shù)體內(nèi)部的函數(shù)。嵌套函數(shù)以function聲明,結(jié)束的時(shí)候加上end。需要說(shuō)明的是,包含有嵌套函數(shù)的函數(shù),無(wú)論他是主函數(shù)、子函數(shù)或者嵌套函數(shù),都應(yīng)該在末尾的地方加上end。下面代碼是一個(gè)簡(jiǎn)單的嵌套函數(shù)的例子:functionr=MyTestNestedFun(input)a=5;c=sin(input)+tan(input);functiony=nestedfun(b)y=a*c+b;endr=nestedfun(5);end
2023/1/312. 嵌套函數(shù)種類(lèi)嵌套函數(shù)可以分為單重嵌套函數(shù)和多重嵌套函數(shù)。單重嵌套函數(shù),這樣的函數(shù)嵌套在別的函數(shù)體內(nèi),自己內(nèi)部不再有嵌套的函數(shù),例如上面介紹的是單重嵌套函數(shù)。多重嵌套函數(shù)嵌套在別的函數(shù)體內(nèi),同時(shí)自己內(nèi)部又嵌套著別的另一層或幾層函數(shù)。如下面類(lèi)型的函數(shù):2023/1/31functionx=A(p1,p2)...functiony1=B1(p3)...functionz1=C1(p4)...end...end...functiony2=B2(p5)...functionz2=C2(p6)...functionw=D(p7)...endendendend
2023/1/313. 嵌套函數(shù)的變量作用域變量的作用域指的變量能夠被程序訪問(wèn)、修改、設(shè)置等的代碼范圍。
父函數(shù)和嵌套在其內(nèi)的函數(shù),他們各自的變量是可以互相訪問(wèn)的。但是必須注意的是,嵌套函數(shù)訪問(wèn)父函數(shù)的變量,可以在函數(shù)定義里直接拿過(guò)來(lái)用,而父函數(shù)訪問(wèn)嵌套在其內(nèi)的函數(shù)里的變量則必須要經(jīng)過(guò)調(diào)用之后。彼此沒(méi)有嵌套關(guān)系的嵌套函數(shù)間是不能簡(jiǎn)單得共享變量的。如果非要共享,則只能通過(guò)它們所在的父函數(shù)來(lái)進(jìn)行。2023/1/31四、嵌套函數(shù)彼此調(diào)用關(guān)系將主函數(shù)看成“父親”,嵌套函數(shù)依據(jù)嵌套深度可以看成“兒子”,“孫子”,“重孫”等等。這樣最外層的主函數(shù)可以認(rèn)為是所有內(nèi)部函數(shù)的“祖先”,位于不同嵌套函數(shù)里的函數(shù)之間的關(guān)系類(lèi)似于一個(gè)家族之間的“親屬關(guān)系”。嵌套函數(shù)之間的調(diào)用關(guān)系可以總結(jié)成下面幾句話:父親可以求助兒子,兒子可以求助父親,也即父子可以互相求助。一個(gè)人不能求助孫子、重孫等后代,但是可以求助自己的直系祖宗(祖父、曾祖父等等)以及和其直系祖宗是親兄弟的先人。一個(gè)人可以求助自己的親兄弟,或者親叔叔、親伯伯但不能求助侄兒。
2023/1/31第五節(jié)匿名函數(shù)、子函數(shù)與嵌套函數(shù)應(yīng)用案例2023/1/31一、匿名函數(shù)應(yīng)用實(shí)例1. 匿名函數(shù)在求解方程中的應(yīng)用【例4.5-1】求下列方程的根:求解代碼如下:>>f=@(x)exp(x)+x^2+x^(sqrt(x))-100%構(gòu)造方程的匿名函數(shù)形式f=@(x)exp(x)+x^2+x^(sqrt(x))-100>>formatlong>>x0=fzero(f,3)%求方程的根,初始值為3x0=4.163549956946139%求出的解>>f(x0)%代入原方程驗(yàn)證ans=2.842170943040401e-0142023/1/31一、匿名函數(shù)應(yīng)用實(shí)例【例4.5-1序】對(duì)于 ,求下列方程相應(yīng)的值,并畫(huà)出和相應(yīng)的的圖像。
求解代碼如下:f=@(a)@(x)exp(x)+x^a+x^(sqrt(x))-100;%構(gòu)造函數(shù)句柄formatlongaa=0:0.01:2;plot(aa,arrayfun(@(a)fzero(f(a),4),aa),'*-')%利用arrayfun求解不同的a對(duì)應(yīng)的xxlabel('$a$','interpreter','latex','fontsize',15)%標(biāo)注x、y坐標(biāo)軸,按照l(shuí)atex語(yǔ)法ylabel('$x$','interpreter','latex','fontsize',15)title('$\mathrm{e}^{x}+x^{\sqrt{x}}+x^a-100$','interpreter','latex',...'fontsize',15)
2023/1/31【例4.5-1序】得到的圖形2023/1/31一、匿名函數(shù)應(yīng)用實(shí)例2. 匿名函數(shù)在顯式表示隱函數(shù)方面的應(yīng)用 隱函數(shù)一般無(wú)法在數(shù)學(xué)上顯式的表達(dá)。這里說(shuō)的顯式表示指的是構(gòu)造一個(gè)MATLAB函數(shù)來(lái)表達(dá)隱函數(shù),具體思路是對(duì)于給定的隱函數(shù)的自變量x,通過(guò)數(shù)值方法求解出因變量y,這樣就相當(dāng)于顯式表達(dá)隱函數(shù)。請(qǐng)看下面的例子:
【例4.5-2】顯式表示下列y關(guān)于x的隱函數(shù): 利用匿名函數(shù),我們可以在MATLAB中顯式得寫(xiě)出y和x的關(guān)系式如下:
y=@(x)fzero(@(y)(exp(y)+x^y)^(1/y)-x^2*y,1);2023/1/31一、匿名函數(shù)應(yīng)用實(shí)例 【例4.5-3】顯式表示下列z關(guān)于x,y的隱函數(shù):
z=@(x,y)fzero(@(z)z-sin((z*x-0.5)^2+x*2*y^2-z/10)*...exp(-((x-0.5-exp(-y+z))^2+y^2-z/5+3)),rand);z(1,2)ans=7.369600885222808e-004z(0,0.5)ans=0.0028075073342922023/1/31一、匿名函數(shù)應(yīng)用實(shí)例3. 匿名函數(shù)在求積分區(qū)域方面的應(yīng)用
有的時(shí)候,我們需要根據(jù)已知的積分值和被積函數(shù)求對(duì)應(yīng)的積分區(qū)域,當(dāng)被積函數(shù)表達(dá)式不是很復(fù)雜的時(shí)候,用匿名函數(shù)比較適合。請(qǐng)看下例:
【例4.5-4】要使sin(x)^2./(x^2)這個(gè)式子的積分值為0.99*pi,求其關(guān)于0對(duì)稱的積分區(qū)域。
u0=fzero(@(u)0.99*pi/2-quadl(@(x)sin(x).^2./(x.^2),0,u),1) u0= 32.3138103582174102023/1/31一、匿名函數(shù)應(yīng)用實(shí)例4. 匿名函數(shù)和符號(hào)計(jì)算的結(jié)合
【例4.5-5】求下面函數(shù)三階導(dǎo)數(shù)在[0,1]區(qū)間的圖像:
本例如果用手算的話,比較繁瑣。如果用符號(hào)運(yùn)算得到三階導(dǎo)數(shù)的解析表達(dá)式,然后再轉(zhuǎn)化成匿名函數(shù),則比較方便。本例展示了符號(hào)計(jì)算和數(shù)值計(jì)算結(jié)算結(jié)合的一種途徑。代碼如下:symsxf=(x+tan(x))^(sin(x));c=diff(f,3);f3=eval(['@(x)'vectorize(c)]);x=linspace(0,1,100);plot(x,f3(x))title('(x+tan(x))\^(sin(x))三階導(dǎo)數(shù)圖像')2023/1/312023/1/31一、匿名函數(shù)應(yīng)用實(shí)例5. 匿名函數(shù)在優(yōu)化中的應(yīng)用 匿名函數(shù)在優(yōu)化中的應(yīng)用主要是以表示目標(biāo)函數(shù)的形式出現(xiàn)的。
【例4.5-6】求下面函數(shù)的最小值 用匿名函數(shù)來(lái)表示目標(biāo)函數(shù)如下:
f=@(x)3*x(1)^2+2*x(1)*x(2)+x(2)^2;
進(jìn)一步求解:
x0=[1,1];%初始值
[x,fval]=fminunc(f,x0) x= 1.0e-006* 0.2541-0.2029 fval= 1.3173e-0132023/1/31二、子函數(shù)和嵌套函數(shù)應(yīng)用實(shí)例在求解積分上限中的應(yīng)用【例4.5-7】如下述積分表達(dá)式,如何已知和,求得?2023/1/31functionsol=exampleIntLimit1(a,e,l)%用嵌套函數(shù)表示被積表達(dá)式
functionf=fun1(beta)f=a.*(1-e.^2)./(1-e.^2.*sin(beta).^2).^(3/2);end%調(diào)用fzero求滿足條件的beta0值sol=fzero(@(beta0)fun2(beta0,l,@fun1),3);end%用子函數(shù)表示積分functiong=fun2(beta0,l,fhdle)g=quadl(fhdle,0,beta0)-l;end2023/1/31二、子函數(shù)和嵌套函數(shù)應(yīng)用實(shí)例2. 在GUI中的應(yīng)用(三角界面,見(jiàn)書(shū)中代碼)在3D作圖中的應(yīng)用【例4.5-9】畫(huà)出下列函數(shù)的圖像:其中2023/1/31function[m,n,TT]=plot3dnmT(N,L)%N:inf的近似,L:[0,2]區(qū)間的剖分個(gè)數(shù)C=zeros(N,1);%nested-function:Tmn=calcT(mm,nn)中用來(lái)存儲(chǔ)計(jì)算結(jié)果m=linspace(0,2,L);[m,n]=meshgrid(m,m);TT=zeros(size(n));%和網(wǎng)格數(shù)據(jù)m,n對(duì)應(yīng)的計(jì)算出來(lái)的T(m,n)網(wǎng)格數(shù)據(jù)forii=1:Lforjj=1:LTT(ii,jj)=calcT(m(ii,jj),n(ii,jj));endend%=====計(jì)算T(m,n)的nest-functionfunctionTmn=calcT(mm,nn)forN1=1:NC(N1)=(mm^N1/gamma(N1+1))*sum(nn.^(0:N1-1)./gamma(1:N1));Tmn=1.0-exp(-mm-nn)*sum(C);endendmesh(n,m,TT);end
2023/1/31嵌套函數(shù)表示待優(yōu)化的目標(biāo)函數(shù)【例4.5-10】已知求下面表達(dá)式的最小值。其中,m在[0,2]這個(gè)區(qū)間范圍內(nèi)
2023/1/31functionm=Findmw=[pi/2,pi,pi*1.5];N=[pi/2-1,-2,-1.5*pi-1];functiony=ObjecFun(m)y=(quadl(@(t)t.^m.*cos(t),0,w(1))-N(1))^2+(quadl(@(t)t.^m.*cos(t),0,...w(2))-N(2))^2+(quadl(@(t)t.^m.*cos(t),0,w(3))-N(3))^2;endm=fminbnd(@ObjecFun,0,2);end2023/1/31二、子函數(shù)和嵌套函數(shù)應(yīng)用實(shí)例5. 嵌套函數(shù)在表示微分方程方面的應(yīng)用(求解微分方程,見(jiàn)書(shū)中代碼)2023/1/31第六節(jié)編寫(xiě)高效的MATLAB程序2023/1/31一、重新認(rèn)識(shí)循環(huán)1. 高版本MATLAB對(duì)循環(huán)結(jié)構(gòu)的優(yōu)化
從MATLAB6.5版開(kāi)始,MATLAB引入了JIT(justintime)技術(shù)和加速器(accelerator),并在后續(xù)版本中不斷優(yōu)化。到了R2009a,很多情況下,循環(huán)體本身已經(jīng)不是程序性能提高的瓶頸了,瓶頸更多的來(lái)源于循環(huán)體內(nèi)部的代碼實(shí)現(xiàn)方式,以及使用循環(huán)的方式。(詳見(jiàn)例【例4.6-1】)選擇循環(huán)還是向量化凡是涉及到矩陣運(yùn)算的時(shí)候,則盡量用向量化如果向量化可能導(dǎo)致超大型矩陣的產(chǎn)生,使用前要慎重向量化的使用要靈活,多分析其運(yùn)行機(jī)制,并與循環(huán)做對(duì)比MATLAB初學(xué)者要盡量多用向量化思路編程高效的編程包括高效的開(kāi)發(fā)和高效的運(yùn)行
2023/1/31二、提高代碼效率的方法
1. 預(yù)分配內(nèi)存 當(dāng)矩陣尺寸較大時(shí),預(yù)分配內(nèi)存(preallocation),是MATLAB高效編程中最應(yīng)該注意,同時(shí)也是很容易把握的一個(gè)技巧(詳見(jiàn)例【例4.6-5】)選用恰當(dāng)?shù)暮瘮?shù)類(lèi)型
MATLAB有多種函數(shù)類(lèi)型,不同的函數(shù)類(lèi)型調(diào)用效率差別相當(dāng)大,為了寫(xiě)出高效的MATLAB代碼,我們就要選用恰當(dāng)?shù)暮瘮?shù)類(lèi)型來(lái)實(shí)現(xiàn)我們的任務(wù)。(詳見(jiàn)例【例4.6-6】【例4.6-7】)選用恰當(dāng)?shù)臄?shù)據(jù)類(lèi)型
MATLAB同樣有多種數(shù)據(jù)類(lèi)型,不同的數(shù)據(jù)類(lèi)型在存儲(chǔ)和訪問(wèn)效率上也不盡相同,選用恰當(dāng)?shù)臄?shù)據(jù)類(lèi)型對(duì)寫(xiě)出高效的MATLAB代碼同樣具有重要的意義。(詳見(jiàn)例【例4.6-8】)2023/1/31二、提高代碼效率的方法
4. 減少減少無(wú)謂損耗——給一些函數(shù)“瘦身”
MATLAB自身以及工具箱里的很多函數(shù)具有較
溫馨提示
- 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. 人人文庫(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO/IEC 15415:2024 EN Automatic identification and data capture techniques - Bar code symbol print quality test specification - Two-dimensional symbols
- 2025年度化工生產(chǎn)工廠技術(shù)許可合同協(xié)議
- 2025年城市管道天然氣項(xiàng)目建議書(shū)
- 設(shè)備管理科設(shè)備維護(hù)與更新計(jì)劃
- 提升倉(cāng)庫(kù)服務(wù)質(zhì)量的個(gè)人策略計(jì)劃
- 社區(qū)個(gè)人工作計(jì)劃改善社區(qū)供水設(shè)施
- 2025年特種大型鋁合金型材合作協(xié)議書(shū)
- 新聞媒體安全管理的必要性計(jì)劃
- 社團(tuán)交流合作的網(wǎng)絡(luò)平臺(tái)計(jì)劃
- 2025年中大型重載軸承項(xiàng)目建議書(shū)
- 消防工程管理辦法附流程圖
- 幼兒園手工教學(xué)中教師指導(dǎo)行為研究-以自貢市幼兒園為例
- 初中物理實(shí)驗(yàn)教學(xué)
- 雨水管道中粗砂回填
- 團(tuán)意操作流程詳解課件
- SH/T 0356-1996燃料油
- 第1課中華優(yōu)秀傳統(tǒng)文化的內(nèi)涵與特點(diǎn)課件(共28張PPT)
- 耳鼻咽喉頭頸外科學(xué)-鼻科癥狀學(xué)課件
- 輪胎使用日常說(shuō)明
- 第8章 動(dòng)車(chē)組空調(diào)裝置檢修動(dòng)車(chē)組維護(hù)與檢修
- 《幼小銜接存在的問(wèn)題及對(duì)策研究(論文)6400字》
評(píng)論
0/150
提交評(píng)論