2

1x25 ベクトル (weights_vector) の関数である関数を最小化しようとしています。つまり、関数を最小化するベクトル内の値を見つけようとしています。

関数は次のように定義されます。

    function weights_correct = Moo(weights_vector)

    corr_matrix = evalin('base', 'corr_matrix');
    tolerance = evalin('base', 'tolerance');
    returns = evalin('base', 'returns');

    weights_correct = weights_vector'*corr_matrix*weights_vector - tolerance*returns'*weights_vector; 

    end       

この関数で、私は呼び出しています:

    weights_correct = fminsearch(@Moo, weights_vector);

これは、エラーが表示されるまで繰り返されます

    "Exiting: Maximum number of function evaluations has been exceeded
         - increase MaxFunEvals option."

これは、私が正しく最小化していないと信じるように導きます。どうしたの?

4

2 に答える 2

3

ここでの evalin の使用はばかげています。evalin を複数回呼び出すと、理由もなく非効率になります。evalin を誤った目的で使用することを学ぶ努力をする場合は、代わりに、関数ハンドルの使用方法を学ぶ努力をしてください。

m-file を定義することもできますが、その必要はありません。単純な関数ハンドルで十分です。

Moo = @(w_v) w_v'*corr_matrix*w_v-tolerance*returns'*w_v;

次に、より優れたオプティマイザーを呼び出します。25 変数の問題で fminsearch を使用するのは正気ではありません。最適化を頻繁に行う場合は、最適化ツールボックスに投資する価値があります。

weights_correct = fminunc(@Moo, weights_vector);

または、すべてを 1 行で行うこともできます。

weights_correct = fminunc(@(w_v) w_v'*corr_matrix*w_v-tolerance*returns'*w_v, weights_vector);

ここで関数ハンドルを作成すると、MATLAB はこれらの配列の値を渡します。

最後に、max function evals の問題は、あなたがしていることの兆候です。25 個の変数は、fminsearch の妥当な時間内に収束することを期待するには多すぎます。もちろん、制限を変更することはできますが、最初は適切なツールを使用することをお勧めします。

于 2012-08-21T23:45:20.107 に答える
2

関数評価のデフォルト数を超えています。を使用してそれを変更できます

weights_correct = fminsearch(@Moo, weights_vector, optimset('MaxFunEvals', num);

num指定した数値です。デフォルトは です200*numberOfVariables

私は確かに専門家ではありません.誰かが私を訂正してください.

于 2012-08-21T22:50:34.017 に答える