2017-01-06 26 views
0

私のプログラムでは、線形制約もない最適化ルーチンで境界値問題を解決する必要があります。この問題にはfminconを使用し、目的関数と非線形制約関数を評価するにはBVPの解が必要です。fminconの目的関数と制約関数の単一計算

現在、私は目的関数と制約関数でBVPを解いています。目的関数内のBVPを1回評価した後、もう1つのBVP評価を減らすために、その関数を制約関数に渡すことができる、より効率的な方法がありますか?任意のアイデア

答えて

2

余分な入力を持つ単一の関数を作成します。これを使用して、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常にが制約を呼び出すことを前提としてい関数の後には、目的関数を呼び出します。正確には、は、決定変数に同じ値です。今、私はそれが保証できるかどうかはわかりません。そうでない時には、いくつかの保護や仕組みを構築したいかもしれません。

+0

私は、最適化が条件を満たさず、ステップサイズがその許容値に達したと言っていることを途中で止めることを発見しました。質問で言われているように別々に実行すると、それは続行されます。何かが見当たりませんが、fminconアルゴリズムの調整が必要な場合は、 – qwerty123

+0

@ qwerty123で、 'fmincon'は' objfcn'と 'confcn'の内部評価に' x'と同じ値を使用していることを確認しましたか?ラッパー? –

+0

私は入力引数としてxを 'confcn'に渡していません。上の擬似コードの通り、私は制約計算に必要な 'confcn'に' data'を使っています。だから私は理解していないかもしれない "fminconによって' objfcn'と 'confcn'で同じxを使うかどうかを確認してください。 – qwerty123