6.9函數為輸入參數之呼叫法
有些函數之輸入參數必須呼叫其他函數名稱,以該函數進行運算。例如fzero、fminsearch、 fminbnd等等,其中均需輸入或呼叫適當函數名稱,使運算正常進行。大體上傳輸函數之方法有四:
一、 以字串之型式對照M函數檔之名稱。例如:
function y = freebody(time)
% calculation of height with respect to time
y =1/2*980*time.*time;
>>[x,f]=fzero('freebody',[0 1])
x = 0
f = 0
二、 以現存函數名稱之握把呼叫,例如:
>>[x,f]=fzero(@freebody,[0 1])
x = 0
f = 0
或
>>f1=@freebody;[x,f]=fzero(f1,[0 1])
x = 0
f = 0
三、 利用inline指令轉換,例如:
>> g=inline('freebody(time)')
g = Inline function:
g(time) = freebody(time)
>> [x, value]=fzero(g,[0 1])
x = 0
value = 0
四、 直接使用運算式,例如:
>>f1='x.^2-5';[x, value]=fzero(f1,[0 5])
x = 2.2361
value = 8.8818e-016
或,
>>[x, value]=fzero('x.^2-5',[0 5])
x = 2.2361
value = 8.8818e-016
上述四種呼叫方式原則上均可適用。但在MATLAB之應用上,仍以握把呼叫較有效率,其執行速度也較快。雖然如此,由於撰寫程式本乎於習慣,故何者為佳,端視當時情況而定。一般之匿函數屬於握把呼叫型,可以使用在任何主函數內的位置。但這種函數以簡短為主,無法應用在大程式上。以下面之三個匿名函數為例,f1、f2各自定義內容,而g則由f2配合f1,輾轉以x為自變數,則不必利用傳統的函數型式,可以輕易加以串聯,並得到g([1 2 3])之結果:
>>f1=@(x) sqrt(x);
>>f2=@(x) 5*exp(-x);
>>g=@(x) f2(f1(x));
>>g([1:3])
ans =
1.8394 1.2156 0.8846
沒有留言:
張貼留言