余分な入力を持つ単一の関数を作成します。これを使用して、2つの呼び出しを区別します。これは、persistent
変数内のすべての必要な中間出力を保存し、基本的には目的関数と制約関数のラッパーです:
function varargout = my_obj_con_function(..., option)
persistent C, Ceq; % ... or any other data you might need
switch (option)
case 'obj'
% objective function
[varargout{1}, data] = objfun(...); % 'data' is an example
% constraint function
[C, Ceq] = confcn(data, ...);
case 'con'
% You've just computed this -- just return it
varargout{1} = C;
varargout{2} = Ceq;
return
end
end
は次のように使用します。
[...] = fmincon(@(x) my_obj_con_function(x, ..., 'obj'), ...
x0,...
Lb, Ub, ...
A, b,...
Aeq, beq, ...
@(x) my_obj_con_function(x, ..., 'con'), ...);
これは、明示的にfmincon
常にが制約を呼び出すことを前提としてい関数の後には、目的関数を呼び出します。正確には、は、決定変数に同じ値です。今、私はそれが保証できるかどうかはわかりません。そうでない時には、いくつかの保護や仕組みを構築したいかもしれません。
私は、最適化が条件を満たさず、ステップサイズがその許容値に達したと言っていることを途中で止めることを発見しました。質問で言われているように別々に実行すると、それは続行されます。何かが見当たりませんが、fminconアルゴリズムの調整が必要な場合は、 – qwerty123
@ qwerty123で、 'fmincon'は' objfcn'と 'confcn'の内部評価に' x'と同じ値を使用していることを確認しましたか?ラッパー? –
私は入力引数としてxを 'confcn'に渡していません。上の擬似コードの通り、私は制約計算に必要な 'confcn'に' data'を使っています。だから私は理解していないかもしれない "fminconによって' objfcn'と 'confcn'で同じxを使うかどうかを確認してください。 – qwerty123