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
這一切看起來不錯。您有一個輸入參數,並從父工作區引用r
和b
。
現在當你調用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);
非常感謝你,它的工作! – Astrid
謝謝您的額外解釋,它真的幫助我瞭解手頭問題背後的機制。 – Astrid
我有一個後續問題:是否可以使用fzero來限制[0,1]中的lambdas的值? – Astrid