2016-03-18 51 views
0

能否請你幫我以下的問題:我有以下功能手柄:操作在MATLAB功能句柄

r1 = @(lambda) b + lambda*(r - b); % r and b are vectors of return data 

我想找到那個讓我一個均值函數零的最優lambda表達式,用於該功能內的一組給定權力。我試圖這樣做,並沒有工作,因爲它返回我一個錯誤未定義操作符類型「function_handle」的輸入參數是:

lambda0 = 0.3; 
for a = 2:10 %power coefficient 
S1(a) = fzero(mean((r - b)*r1.^(1/(a - 1))),lambda0); 
end 

任何建議至於怎樣去了解這個問題是高度讚賞!先謝謝你。

回答

1

fzero接受函數句柄作爲第一個輸入。正如你現在所擁有的,你試圖通過一個聲明作爲第一個輸入。這個語句甚至無法正確評估,因爲您正在嘗試對函數句柄執行數字操作(稍後會詳細介紹)。

你需要,而不是做這樣的事情,我們創建一個新的功能手柄,用於評估功能處理和執行你所需要的其他操作。

S1(a) = fzero(@(lambda)mean((r - b)*r1(lambda).^(1/(a - 1))),lambda0); 

另外說明

上的功能句柄執行操作是相同的結果執行它們。

因此,舉例來說,如果我們有一個函數句柄:

func = @(x)2*x; 

如果我們評估這一點,通過與輸入值調用它x

func(2) 

    4 

這工作,因爲我們期望的那樣。現在,如果我們真正想要的價值(2*x)^2,我們可以嘗試把它寫,你在你的問題

func2 = func^2; 

我們會得到一個錯誤寫你的聲明的方式!

Undefined operator '^' for input arguments of type 'function_handle'.

這不起作用,因爲MATLAB試圖將^操作適用於功能手柄本身,而不是評價功能的值處理

相反,我們需要創建一個功能手柄,基本上包裝了另一個並執行任何附加選項:

func2 = @(x)func(x)^2; 
func2(2) 

    16 

把它全循環

因此,如果我們回去對於你的問題,你這樣定義了你的匿名函數r1

r1 = @(lambda) b + lambda*(r - b); % r and b are vectors of return data 

這一切看起來不錯。您有一個輸入參數,並從父工作區引用rb

現在當你調用fzero您嘗試創建一個新的功能手柄的希望寄託在這個功能手柄進行操作。

mean((r - b)*r1.^(1/(a - 1))) 

就像我們剛剛出現,這將導致一個非常類似的錯誤

Undefined operator .^ for input arguments of type 'function_handle'

因此,我們需要包裝成一個新的功能這一點。

newfunc = @(lambda)mean((r - b)*r1(lambda).^(1/(a - 1))); 

現在我們可以安全地通過這fzero

result = fzero(newfunc, lambda0); 
+0

非常感謝你,它的工作! – Astrid

+1

謝謝您的額外解釋,它真的幫助我瞭解手頭問題背後的機制。 – Astrid

+0

我有一個後續問題:是否可以使用fzero來限制[0,1]中的lambdas的值? – Astrid