-1

次の単純な最適化問題から始めました。

F=@(L) max(-[log(L(1)/(L(1)+1)) log(L(2)/(L(2)+1))+log(1-L(1)) log(L(3)/(L(3)+1))+log(1-L(1))+log(1-L(2))]); [L,fval]=fmincon(F,[0.5 0.5 0.5],[],[],[],[],[0;0;0],[1;1;1])

これにより答えが得られます:L = 0.2554 0.3759 0.7785そしてfval = 1.5925

Objただし、 in には可変数の入力関数が必要ですmax(-[Obj])。上記の例では、次の 3 つの関数があります。

Obj=log(L(1)/(L(1)+1)) log(L(2)/(L(2)+1))+log(1-L(1)) log(L(3)/(L(3)+1))+log(1-L(1))+log(1-L(2))

次のコードを使用Objして、関数の数が依存する生成を行いましたM

M = 3;
for i = 1:M
    L(i) = sym(['L(' num2str(i) ')'])
end

tempL = log(1-L);
for m=1:M 
Obj(1,m) =  log((L(m))/(1+L(m))) + sum(tempL(1:m-1));
end
Obj

Objこれは上記の例とまったく同じですが、これObjを次の最適化関数に渡すと、サポートされません。

F=@(L) max(-[Obj]);
[L,fval]=fmincon(F,[0.5 0.5 0.5],[],[],[],[],[0;0;0],[1;1;1])

誰かがこの問題を解決するのを手伝ってくれますか? Mすべての機能を手動で入力するのは困難です 。

4

1 に答える 1

0

次のような関数を書きたいと思います。

代わりに、ベクトルを受け取ってスカラーを返す MATLAB 関数を作成する必要があります。返されるスカラーの値は関数の値です。別の matlab ファイル (例: myfunction.m) を作成し、次のようにします。

function result = myfunction(L)

M = length(L);

log_one_minus_L = log(1 - L);
log_L           = log(L);
log_one_plus_L  = log(1 + L);


sumsum_templ    = (M-1:-1:1) * log_one_minus_L(1:end-1);
result = sum(log_L - log_one_plus_L) + sumsum_templ;

さまざまな値でテストして、関数 myfunction が機能することを確認します。例えば。myfunction([0; 1])正しい値が返されるかどうかを確認します。

最適化するには、fmincon を呼び出しfmincon(myfunction, ...)て、ベクトルを取り、スカラーを返す関数へのポインターが必要です。

于 2015-11-20T20:12:49.493 に答える