- MATLAB程序設(shè)計(jì)及應(yīng)用
- 郭斯羽等編著
- 2237字
- 2022-05-06 19:27:53
3.1.2 函數(shù)M文件
如果一個(gè)M文件的第一行有效代碼(除空白行和注釋行之外的代碼行)是以關(guān)鍵字function開頭的函數(shù)聲明行,那么這個(gè)M文件就是一個(gè)函數(shù)M文件。一個(gè)函數(shù)M文件對(duì)外部而言,就提供了一個(gè)MATLAB函數(shù),實(shí)際上它同樣也可以視為一個(gè)完整的、完成了某項(xiàng)具體任務(wù)的MATLAB程序。MATLAB的絕大多數(shù)函數(shù)都是以函數(shù)M文件的形式提供的。
在函數(shù)聲明行中,不但包括函數(shù)名,也包括函數(shù)的輸入/輸出接口。下面介紹常見的輸入/輸出的聲明方式。
1. 有一個(gè)或多個(gè)輸入?yún)?shù)、一個(gè)或多個(gè)輸出參數(shù)
MATLAB函數(shù)可以具有不止一個(gè)輸出參數(shù),這一點(diǎn)相較于C/C++、Java等相對(duì)“傳統(tǒng)”的編程語(yǔ)言而言,在語(yǔ)法層面上提供了一種靈活便利的途徑來強(qiáng)化MATLAB函數(shù)的功能。具有N個(gè)輸入?yún)?shù)、M個(gè)輸出參數(shù)的MATLAB函數(shù)的聲明方式如下:

在關(guān)鍵詞function之后是輸出參數(shù)列表,輸出參數(shù)列表用“[]”括起來,輸出參數(shù)之間以空格或逗號(hào)區(qū)隔。如果僅有一個(gè)輸出參數(shù),則[]可省略;輸出參數(shù)列表之后是“=”號(hào),然后是函數(shù)名;函數(shù)名之后是用“()”括起來的輸入?yún)?shù)列表,輸入?yún)?shù)之間以逗號(hào)區(qū)隔。
【例3.2】
使用如圖3-6所示的雙曲柄機(jī)構(gòu)可以生成雙葉線。兩根長(zhǎng)度均為a的連桿AP和BQ的一端分別固定于兩個(gè)定點(diǎn)P、Q,P、Q之間的距離為b >a。A、B兩端用一根長(zhǎng)度同樣為b的連桿相連,并在連桿AB上確定的一個(gè)定點(diǎn)T,它到A點(diǎn)的距離為r。當(dāng)連桿AP繞點(diǎn)P旋轉(zhuǎn)并帶動(dòng)連桿AB和BQ一同運(yùn)動(dòng)時(shí),點(diǎn)T的運(yùn)動(dòng)軌跡就是一條雙葉線。
根據(jù)連桿機(jī)構(gòu)的運(yùn)動(dòng)分析結(jié)果,若以P為平面直角坐標(biāo)系原點(diǎn),則T的坐標(biāo)(x,y)為


圖3-6 雙曲柄機(jī)構(gòu)
式中,φ為連桿AP的朝向角,β為連桿AB的朝向角:

arctan 2表示值域?yàn)?-π,π]的四象限反正切函數(shù),δ為連桿BQ的朝向角:

式中,k=b/a。
下面使用函數(shù)M文件來實(shí)現(xiàn)雙葉線的繪制。在設(shè)計(jì)函數(shù)時(shí),一個(gè)十分關(guān)鍵的內(nèi)容就是設(shè)計(jì)函數(shù)的輸入/輸出接口。函數(shù)的輸出接口通常是根據(jù)函數(shù)要完成的任務(wù)來設(shè)計(jì)的,例如,在本例題中,我們希望最終提供給函數(shù)的用戶的結(jié)果就是點(diǎn)T的運(yùn)動(dòng)軌跡上的一系列位置對(duì)應(yīng)的x和y坐標(biāo),我們將這些坐標(biāo)分別組織為兩個(gè)數(shù)列,并作為函數(shù)的兩個(gè)輸出參數(shù)。
而函數(shù)的輸入接口則往往由我們所希望提供給用戶的靈活性,以及希望用戶承擔(dān)的計(jì)算責(zé)任來確定。對(duì)本例題而言,我們希望能夠繪制一條完整的雙葉線,因此在函數(shù)內(nèi)部,我們將?的取值范圍固定為[0,2π]區(qū)間,而連桿的長(zhǎng)度a、b以及點(diǎn)T的位置r均可由用戶規(guī)定,這些參量將作為函數(shù)的輸入?yún)?shù)。此外,我們將曲線繪制的光滑程度也交由用戶來負(fù)責(zé)。因此,額外增加一個(gè)輸入?yún)?shù)n,表示用戶希望將?的取值范圍[0,2π]分為n個(gè)等間隔的離散點(diǎn)。
根據(jù)以上設(shè)計(jì)的函數(shù)的輸入/輸出接口及坐標(biāo)的計(jì)算公式,給出如下的函數(shù)M文件。
duleaves.m


將函數(shù)M文件按上述文件名保存好之后,即可在命令窗口中調(diào)用該函數(shù)。調(diào)用方式如下:

執(zhí)行完畢后,即可用plot函數(shù)繪制所得的雙葉線。在上述調(diào)用的參數(shù)設(shè)置(a=0.3,b=0.5,r=0.25)下,得到的雙葉線如圖3-7所示。

若將r值改為0.2,則得到的雙葉線如圖3-8所示。


圖3-7 例3.2中r=0.25時(shí)的雙葉線

圖3-8 例3.2中r=0.2時(shí)的雙葉線
關(guān)于函數(shù)M文件的調(diào)用說明如下:
(1)與腳本M文件一樣,函數(shù)M文件通過文件名來調(diào)用,而不是用函數(shù)聲明行中給出的函數(shù)名來調(diào)用。假設(shè)例3.2中的函數(shù)被保存為shuangyexian.m,那么在命令窗口中調(diào)用時(shí),就應(yīng)該使用shuangyexian而非使用duleaves作為函數(shù)名。顯然,內(nèi)部聲明的函數(shù)名與M文件名不相同的情況容易帶來不必要的誤解和麻煩。因此,建議保持函數(shù)M文件名與內(nèi)部聲明的函數(shù)名一致。如果在新的M文件中創(chuàng)建函數(shù),在保存時(shí)MATLAB也將默認(rèn)提供內(nèi)部聲明的函數(shù)名作為保存的M文件名,盡管用戶可以修改該文件名。
(2)如果用戶在調(diào)用函數(shù)時(shí)希望保存函數(shù)的多個(gè)輸出參數(shù),那么這些輸出參數(shù)要使用“[]”符號(hào)括起來。如果只希望保存函數(shù)的第一個(gè)輸出參數(shù),則[]符號(hào)可以省略。例如,如果在例3.2中只希望保留x坐標(biāo)數(shù)列,那么可以使用下面的調(diào)用方式:

(3)如果用戶僅希望保留開頭的若干輸出參數(shù),而將后面的輸出參數(shù)省略,那么只需要用[]符號(hào)將希望保留的那些輸出參數(shù)括起來,不必再提供后面的輸出參數(shù)。但是如果用戶希望省略掉位置靠前的某些輸出參數(shù),而保留若干位置靠后的輸出參數(shù),那么,此時(shí)不能直接跳過希望省略掉的那些輸出參數(shù)的位置,而需要在這些位置上使用占位符“~”。例如,在例3.2中只希望保留y坐標(biāo)數(shù)列而省略x坐標(biāo)數(shù)列,那么需要以如下方式調(diào)用:

(4)如果用戶沒有保留任何輸出參數(shù),那么函數(shù)的第一個(gè)輸出參數(shù)將被保留到ans變量中,其余的輸出參數(shù)被省略。
(5)如果函數(shù)調(diào)用不是以分號(hào)結(jié)尾,那么所有被保留的輸出參數(shù)的值將被顯示在命令窗口中。如果沒有保留任何輸出參數(shù),那么保留到ans變量中的第一個(gè)輸出參數(shù)的值將被顯示。例如

實(shí)際上等價(jià)于

2. 無(wú)輸出參數(shù)的函數(shù)
MATLAB函數(shù)可以沒有輸出參數(shù)。此時(shí),在函數(shù)聲明中,可將輸出參數(shù)列表與其后的“=”去除,即

無(wú)輸出參數(shù)的函數(shù)一般以文本或圖形顯示計(jì)算結(jié)果,或者將這些結(jié)果保存為文件。
3. 無(wú)輸入?yún)?shù)的函數(shù)
MATLAB函數(shù)也可以沒有輸入函數(shù)。函數(shù)聲明中的輸入?yún)?shù)列表可以為空,()符號(hào)可保留也可省略,以下兩種方式均是合法的:

在調(diào)用無(wú)輸入?yún)?shù)的函數(shù)時(shí),函數(shù)名之后既可以加()符號(hào),也可以把該符號(hào)省略。
【例3.3】
將例3.1中的代碼封裝為無(wú)輸入/輸出參數(shù)的函數(shù)M文件。
只需在例3.1的代碼之前增加如下的函數(shù)聲明:

將代碼保存為sprangle.m,然后在命令窗口中輸入如下命令:

就可以得到與圖3-5相同的圖形。
從調(diào)用的方式看,例3.1和例3.3是一樣的。但是請(qǐng)注意,在例3.3的調(diào)用完成后,命令窗口的工作空間中并不會(huì)出現(xiàn)例3.1中的那些變量。也就是說函數(shù)M文件中的變量并不會(huì)出現(xiàn)在命令窗口的工作空間中,從而也就可以避免變量沖突的潛在風(fēng)險(xiǎn)。
- Visual C++程序設(shè)計(jì)教程
- The DevOps 2.3 Toolkit
- Mastering OpenCV Android Application Programming
- Offer來了:Java面試核心知識(shí)點(diǎn)精講(原理篇)
- The DevOps 2.4 Toolkit
- TradeStation交易應(yīng)用實(shí)踐:量化方法構(gòu)建贏家策略(原書第2版)
- Python忍者秘籍
- 從零開始學(xué)Linux編程
- Java SE實(shí)踐教程
- Learning Hadoop 2
- 從零開始學(xué)Python網(wǎng)絡(luò)爬蟲
- Python入門很輕松(微課超值版)
- Kotlin極簡(jiǎn)教程
- 硬件產(chǎn)品設(shè)計(jì)與開發(fā):從原型到交付
- ASP.NET Core and Angular 2