1. ホーム
  2. matlab

[解決済み] matlabで関数ハンドルを使った操作

2022-02-05 11:08:10

質問事項

以下の問題について、ご教授ください。以下のような関数のハンドルがあります。

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

私は、平均関数をゼロにする最適なラムダを、その関数内の与えられた累乗のセットに対して見つけたいのです。私は何をしようとし、動作しませんでした、それは私に 'function_handle' 型の入力引数のための未定義の演算子のためのエラーを返します。

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

この問題を解決する方法について、何か提案があれば、ぜひお願いします。よろしくお願いします。

解決方法は?

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;

エラーが出ます!

<ブロッククオート

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

これはすべて素晴らしく見えます。入力引数が1つあり rb を親ワークスペースから取得します。

これで fzero は、新しい関数ハンドルを作成することを期待して、この関数ハンドルに対して操作を実行しようとします。

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

先ほど示したように、これとよく似たエラーが発生します。

<ブロッククオート

function_handle'型の入力引数に対して未定義の演算子.^があります。

そこで、これを新しい関数にラップする必要があります。

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

これで、安全に fzero .

result = fzero(newfunc, lambda0);