Matlab 第五講:編程二:函數(shù)_第1頁
Matlab 第五講:編程二:函數(shù)_第2頁
Matlab 第五講:編程二:函數(shù)_第3頁
Matlab 第五講:編程二:函數(shù)_第4頁
Matlab 第五講:編程二:函數(shù)_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1,Matlab 函數(shù)文件,數(shù)學(xué)軟件 Matlab,2,本講主要內(nèi)容,什么是函數(shù)文件 如何編寫函數(shù)文件 遞歸函數(shù) 函數(shù)參數(shù)的可調(diào)性 全局與局部變量 子函數(shù),3,M 文件根據(jù)調(diào)用方式的不同可以分為兩類:,Script:腳本文件/命令文件,Function:函數(shù)文件,Matlab 編程,直接輸入文件名即可運(yùn)行,供其它M文件調(diào)用,通常帶輸入?yún)?shù)和輸出參數(shù),4,function 輸出形參列表=函數(shù)名(輸入形參列表) % 注釋說明部分(可選) 函數(shù)體語句(必須),第一行為引導(dǎo)行,表示該 M文件是函數(shù)文件 函數(shù)名的命名規(guī)則與變量名相同 ( 必須以字母開頭 ) 當(dāng)輸出形參多于一個(gè)時(shí),用方括號(hào)括起來 以百分號(hào)

2、開始的語句為注釋語句,函數(shù)文件,函數(shù)文件由 function 語句引導(dǎo),函數(shù)文件名必須與函數(shù)名一致 函數(shù)必須是一個(gè)單獨(dú)的 M文件,5,函數(shù)文件(f2cf.m):,例:將華氏溫度轉(zhuǎn)化為攝氏溫度:,編程示例,clear; f=input(Please input f:); c=5*(f-32)/9; fprintf(c = %gn,c);,腳本文件 (f2cs.m):,function c = f2cf(f) c=5*(f-32)/9; fprintf(c = %gn,c);,6,函數(shù)文件舉例,function a,b = myswap(x,y) % swap x and y a = y; b =

3、 x;,例:交換兩個(gè)變量的值 myswap.m,有兩個(gè)輸入?yún)?shù)和兩個(gè)輸出參數(shù),7,function printyh(n) % 打印楊輝三角形, 本函數(shù)沒有輸出參數(shù) yh=1; disp(yh); if n=1, return; end yh=1,1; disp(yh); for k=3:n yh_old=yh; k2=ceil(k/2); for l=2:k2 yh(l)=yh_old(l-1)+yh_old(l); end yh(k2+1:k)=yh(k-k2:-1:1); disp(yh); end,函數(shù)文件舉例,例:打印楊輝三角形 printyh.m,沒有輸入?yún)?shù)和輸出參數(shù),8,函數(shù)調(diào)用

4、的一般格式,輸出實(shí)參列表=函數(shù)名(輸入實(shí)參列表),函數(shù)調(diào)用時(shí),實(shí)參的順序應(yīng)與函數(shù)定義時(shí)形參的順序一致 實(shí)參與形參之間的結(jié)合是通過值傳遞實(shí)現(xiàn)的 函數(shù)可以嵌套調(diào)用,即一個(gè)函數(shù)可以被其它函數(shù)調(diào)用, 甚至可以被它自身調(diào)用,此時(shí)稱為遞歸調(diào)用 函數(shù)所傳遞的參數(shù)具有可調(diào)性,Matlab 用兩個(gè)永久變量 nargin 和 nargout 分別記錄調(diào)用該函數(shù)時(shí)的輸入實(shí)參 和輸出實(shí)參的個(gè)數(shù),函數(shù)調(diào)用,9,% 函數(shù)文件 myfactor.m function y=myfactor(n) if (n=1) y=1; else y=n*myfactor(n-1); end,例:利用函數(shù)的遞歸調(diào)用計(jì)算 n!,遞歸函數(shù)舉例

5、,10,% main.m % clear; s = 0; n = 10; for i = 1 : n s = s + myfactor(i); end fprintf( s=%g n,s),例:計(jì)算 1! + 2! + + 10!,遞歸函數(shù)舉例,11,% ex4nargin.m function y = ex4nargin(a,b) if (nargin=1) y = a; elseif (nargin=2) y = a*b; end,參數(shù)的可調(diào)性舉例,例:nargin 和 nargout 的使用,% ex4nargout.m function p,q=ex4nargout(a,b) if (

6、nargout=1) p = a + b; elseif (nargout=2) p = a + b; q = a - b; end,12,函數(shù)通過輸入和輸出參數(shù)與其它 M 文件進(jìn)行數(shù)據(jù)傳遞,當(dāng)函數(shù)調(diào)用完畢后,該函數(shù)文件中定義的所有局部變量都將被釋放,即全部被清除,如果在若干個(gè) M文件中,都把某個(gè)變量定義為全局變量,則這些函數(shù)將公共使用這一變量。所有函數(shù)都可以對(duì)它進(jìn)行存取和修改操作,函數(shù)文件中的變量都是局部的,即一個(gè)函數(shù)文件中定義的變量不能被另一個(gè)函數(shù)文件或其它 M 文件使用,全局變量與局部變量,定義全局變量是 M文件間傳遞信息的一種手段,13,變量名列表中的各個(gè)變量用空格隔開,不能用逗號(hào)!

7、在使用全局變量的所有M文件中,都要對(duì)其所使用的全局變量進(jìn)行定義,全局變量給函數(shù)間的數(shù)據(jù)傳遞帶來了方便,但卻破壞了函數(shù)對(duì)變量的封裝,降低了程序的可讀性,因而在結(jié)構(gòu)化程序設(shè)計(jì)中,全局變量是不受歡迎的。特別是當(dāng)程序較大,子程序較多時(shí),全局變量將個(gè)程序調(diào)試和維護(hù)帶來不便,故不提倡使用全局變量。,global 變量名列表,全局變量的定義,14,程序示例,% ex4global.m clear; global a b a=1; b=3; y=mysquaresum(a,b); fprintf( a=%g, b=%g n,a,b); z=myproduct(a,b); fprintf( a=%g, b=%g

8、n,a,b);,% mysquaresum.m function square_sum=mysquaresum(x,y) square_sum=x2 + y2; a=x+y;,% myproduct.m function product=myproduct(x,y) global a product=x*y; a=x+y;,15,子函數(shù),一個(gè)函數(shù)文件中可以含有一個(gè)或多個(gè)函數(shù), 其中第一個(gè)稱為主函數(shù),其它函數(shù)稱為子函數(shù) 子函數(shù)由 function 語句引導(dǎo) 除了用 global 定義的全局變量外,所有函數(shù)中的變量都是局部變量,函數(shù)之間通過輸入、輸出參數(shù)進(jìn)行數(shù)據(jù)傳遞,調(diào)用一個(gè)函數(shù)時(shí),Matlab

9、會(huì)首先檢查該函數(shù)是否為一個(gè)子函數(shù),主函數(shù)必須位于最前面,子函數(shù)出現(xiàn)的次序任意 子函數(shù)只能被主函數(shù)和位于同一個(gè)函數(shù)文件中的其它子函數(shù)調(diào)用,16,子函數(shù)舉例,% ex4subfun.m function avg, med = ex4subfun(x) % 主函數(shù) n = length(x); avg = mean(x, n); med = median(x, n); function a = mean(x, n) % 子函數(shù),計(jì)算平均值 a = sum(x)/n; function m = median(x, n) % 子函數(shù),計(jì)算中值 x = sort(x); if rem(n, 2) = 1

10、m = x(n+1)/2); else m = (x(n/2)+x(n/2+1)/2; end,17,Matlab 自定義函數(shù),18,Matlab 自定義函數(shù)的五種方式,命令文件/函數(shù)文件+ 函數(shù)文件 :多個(gè) M 文件,自定義函數(shù)的五種方式,函數(shù)文件 + 子函數(shù) : 一個(gè) M 文件,inline : 無需 M 文件,符號(hào)表達(dá)式 + subs 方式 : 無需 M 文件,字符串 + subs 方式 : 無需 M 文件,19,%命令/函數(shù)文件:myfile1.m clear for t=1:10; y=mylfg(t); fprintf(%4d(1/3) = %6.4fn,t,y); end,%函數(shù)

11、文件:mylfg.m function y = mylfg(x) y=x(1/3);,函數(shù)必須單獨(dú)寫一個(gè)文件!不能與命令文件寫在同一個(gè)文件中!,自定義函數(shù)方式(一),方式一:命令文件/函數(shù)文件 + 函數(shù)文件,20,自定義函數(shù)方式(二),%函數(shù)文件:funtry2.m function =funtry2() for t=1:10 y=lfg2(t); fprintf(%4d(1/3) = %6.4fn,t,y); end function y=lfg2(x) %子函數(shù) y=x(1/3);,函數(shù)文件中可以定義一個(gè)或多個(gè)子函數(shù),此時(shí)我們稱該函數(shù)為主函數(shù),子函數(shù)只能被主函數(shù)或同一個(gè)函數(shù)文件中的其它子函

12、數(shù)調(diào)用!,方式二:函數(shù)文件 + 子函數(shù),21,f=inline(函數(shù)表達(dá)式,變量1,變量2,.),y=f(數(shù)值列表),代入的數(shù)值列表順序應(yīng)與定義時(shí)的變量名順序一致,例:,自定義函數(shù)方式(三),方式三:inline + 命令/函數(shù)文件,inline 命令可以用來定義一個(gè)內(nèi)聯(lián)函數(shù),調(diào)用方式:,22,這種函數(shù)定義方式是將 f 作為一個(gè)內(nèi)部函數(shù)調(diào)用。其特點(diǎn)是:調(diào)用方式最接近于我們平時(shí)對(duì)函數(shù)的定義,使程序更具可讀性。同時(shí)由于它是基于 Matlab 的數(shù)值計(jì)算內(nèi)核的,所以它的運(yùn)算速度較快,程序更有效率。,這種定義方式的缺點(diǎn):,定義一個(gè)內(nèi)聯(lián)函數(shù)用去的內(nèi)存空間比相同條件下其他的方法要大得多。 該方法只能對(duì)數(shù)值

13、進(jìn)行代入,不支持符號(hào)代入,并且對(duì)于定義后的函數(shù)不能進(jìn)行求導(dǎo)等符號(hào)運(yùn)算。,自定義函數(shù)方式(三),23,自定義函數(shù)方式(三),24,%函數(shù)文件:function =funtry3() lfg=inline(x.(1/3); %表達(dá)式兩端的單引號(hào)不可缺少 fid=fopen(myfile3.txt,w); for t=1:50; y=lfg(t); fprintf(fid,%4d(1/3) = %6.4fn,t,y); end fclose(fid); ezplot(lfg,0,50),diff(lfg,x),自定義函數(shù)方式(三),X,25,注:對(duì)于在 syms 中已經(jīng)定義過符號(hào)變量,在 subs

14、中進(jìn)行替代時(shí),單引號(hào)可以省略。但如果在 syms 后又被重新定義為其它類型,則必須加單引號(hào),否則不可替換。,syms 定義一個(gè)符號(hào)表達(dá)式,用 subs 命令調(diào)用,syms f x %定義符號(hào) f=1/(1+x2); %定義符號(hào)表達(dá)式,subs(f,x,代替 x 的數(shù)值或符號(hào)),自定義函數(shù)方式(四),方式四: syms + subs,26,這種函數(shù)定義方法的一個(gè)特點(diǎn)是可以用符號(hào)進(jìn)行替換,該方法的缺點(diǎn)也是明顯的:由于使用符號(hào)運(yùn)算內(nèi)核,運(yùn)算速度會(huì)大大降低。,自定義函數(shù)方式(四),27,注:此處 x 的單引號(hào)不可省略。本函數(shù)方式可以代入字符,但字符不能參與運(yùn)算,否則將自行轉(zhuǎn)化成該字符的 ASCII 碼運(yùn)算,這與我們想要的結(jié)

溫馨提示

  • 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)論