2017-01-06 6 views
0

Dans mon programme, j'ai besoin de résoudre un problème de limite dans la routine d'optimisation qui a également des contraintes non linéaires. En utilisant fmincon pour le problème et j'ai besoin de la solution du BVP pour évaluer la fonction d'objectif et la fonction de contrainte non linéaire.Calcul simple pour la fonction objectif et la fonction de contraintes dans fmincon

Actuellement, je résous le BVP en fonction objectif et aussi en fonction de contrainte. Y a-t-il une manière plus efficace, après une évaluation du BVP en fonction objectif, de passer la solution à la fonction de contrainte afin de réduire une évaluation BVP de plus. Toutes les idées

Répondre

2

Créez une fonction unique avec une entrée supplémentaire que vous utilisez pour différencier les deux appels. Ceci est essentiellement une enveloppe autour de l'objectif et les fonctions de contrainte, économiser toutes les sorties intermédiaires nécessaires persistent variables:

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 

Utilisez comme ceci:

[...] = fmincon(@(x) my_obj_con_function(x, ..., 'obj'), ... 
       x0,... 
       Lb, Ub, ... 
       A, b,... 
       Aeq, beq, ... 
       @(x) my_obj_con_function(x, ..., 'con'), ...); 

Cela suppose explicitement que fmincontoujours appelle la contrainte fonction après appelant la fonction objectif, avec exactement les mêmes valeurs pour les variables de décision. Maintenant, je ne suis pas sûr que cela puisse être garanti - vous voudrez peut-être prévoir des protections et des mécanismes lorsque ce n'est pas le cas.

+0

J'ai implémenté et trouvé que l'optimisation s'arrête prématurément en disant que la contrainte n'est pas satisfaite et que la taille du pas atteint sa tolérance. Si je les exécute séparément (c'est-à-dire) comme indiqué dans la question, alors cela continue. Quelque chose manque, je ne suis pas sûr si c'est dans l'algorithme fmincon qui doit être modifié – qwerty123

+0

@ qwerty123 avez-vous vérifié que 'fmincon' utilise la même valeur pour' x' pour l'évaluation de 'objfcn' et' confcn' à l'intérieur l'emballage? –

+0

Je ne transmets pas x comme argument d'entrée à 'confcn'. Comme dans le pseudo code ci-dessus, j'utilise 'data' pour le' confcn' qui est nécessaire pour mes calculs de contraintes. Donc, je n'ai peut-être pas compris 'vérifier si utiliser x même dans 'objfcn' et' confcn' par fmincon' – qwerty123