官术网_书友最值得收藏!

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的連桿APBQ的一端分別固定于兩個(gè)定點(diǎn)PQPQ之間的距離為b >aAB兩端用一根長(zhǎng)度同樣為b的連桿相連,并在連桿AB上確定的一個(gè)定點(diǎn)T,它到A點(diǎn)的距離為r。當(dāng)連桿AP繞點(diǎn)P旋轉(zhuǎn)并帶動(dòng)連桿ABBQ一同運(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)的xy坐標(biāo),我們將這些坐標(biāo)分別組織為兩個(gè)數(shù)列,并作為函數(shù)的兩個(gè)輸出參數(shù)。

而函數(shù)的輸入接口則往往由我們所希望提供給用戶的靈活性,以及希望用戶承擔(dān)的計(jì)算責(zé)任來確定。對(duì)本例題而言,我們希望能夠繪制一條完整的雙葉線,因此在函數(shù)內(nèi)部,我們將?的取值范圍固定為[0,2π]區(qū)間,而連桿的長(zhǎng)度ab以及點(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)。

主站蜘蛛池模板: 大化| 荔浦县| 宜章县| 东海县| 桐梓县| 延川县| 德令哈市| 东山县| 高碑店市| 舒城县| 海城市| 河北区| 九寨沟县| 大足县| 米易县| 土默特右旗| 巴林左旗| 苗栗县| 深圳市| 柳林县| 临洮县| 浦江县| 永仁县| 洪洞县| 山阳县| 吉水县| 玉树县| 绥中县| 铜梁县| 永登县| 合作市| 津南区| 四子王旗| 商河县| 平江县| 清新县| 许昌市| 余庆县| 丘北县| 彭阳县| 河津市|