J'ai décidé de modifier radicalement ma réponse en fonction de certains des commentaires.
Je n'ai pas utilisé TAO. D'après la documentation, il semble que le seul moyen pour TAO de gérer les problèmes d'optimisation contraints (à l'exception du cas spécial des seules contraintes de boîte) est de convertir le problème en une inégalité variationnelle en utilisant les conditions de Karush-Kuhn-Tucker (KKT) , qui sont nécessaires sous qualification de contrainte (le type que je vois habituellement est la condition du point de Slater ), et suffisants sous convexité de l'objectif et des contraintes (plus généralement, l'invexité de type 1). Si Fest non convexe, la formulation de l'inégalité variationnelle utilisant les conditions KKT N'EST PAS équivalente au problème d'optimisation d'origine, donc à proprement parler, si vous voulez un optimum global pour le problème d'optimisation, vous ne devez pas l'exprimer comme une inégalité variationnelle. Il serait difficile de trouver de toute façon un optimum global pour l'optimisation contrainte par PDE (voir ci-dessous), donc ignorer ce détail est peut-être bien. Étant donné ce que Wolfgang a dit, je serais sceptique quant à l'utilisation de TAO; Je suis déjà sceptique car il n'implémente pas de méthodes pour résoudre des programmes non linéaires (PNL) en tant que PNL, plutôt que des inégalités variationnelles.
Je ne suis pas un expert en optimisation contrainte PDE; mes collègues et associés travaillent sur des problèmes d'optimisation sous contrainte ODE. Je sais que pour les formulations intrusives, Larry Biegler (et d'autres) utilisera des méthodes de collocation pour discrétiser la PDE et en faire une très grande PNL éparse, puis il la résoudra en utilisant des méthodes de point intérieur. Pour vraiment résoudre le problème de l'optimalité globale, vous devez également générer des relaxations convexes, mais pour autant que je sache, cette approche n'est pas adoptée car les problèmes d'optimisation contraints par PDE conduisent à des PNL si importants qu'il serait difficile de les résoudre. optimalité globale. Je mentionne ces détails uniquement parce que la formulation du problème influence fortement le choix du package de solveur. Pour les formulations non intrusives, les résolutions PDE répétées produisent des informations de gradient pour les algorithmes d'optimisation.
Certaines personnes qui étudient les problèmes d'optimisation sous contrainte ODE utilisent une approche similaire pour discrétiser le problème à l'aide de la collocation et d'une méthode numérique, puis assouplir la PNL résultante pour produire une formulation convexe utilisée dans un algorithme d'optimisation globale. Une autre approche de l'optimisation contrainte par ODE consiste à détendre le problème, puis à discrétiser l'ODE, qui est l'approche adoptée dans mon laboratoire. Il pourrait être possible de détendre certaines classes de problèmes d'optimisation contraints par PDE, mais je ne connais aucun travail existant sur ce problème. (C'était un projet potentiel dans mon laboratoire à un moment donné.)
En fin de compte, ce qui importe n'est pas la différentiabilité de l'EDP d'origine, mais la différentiabilité de la discrétisation par rapport aux variables de décision.
Si le problème discrétisé est deux fois différentiable par rapport aux variables de décision, les packages suivants calculent une solution locale:
- IPOPT est un solveur de point intérieur open source développé par Andreas Wächter chez IBM. C'est un code de très haute qualité. En tant que solveur de point intérieur, il est préférable pour les fonctions objectives avec de grandes matrices jacobiennes clairsemées et serait utile pour l'optimisation contrainte par PDE
- SNOPT est un solveur de programmation quadratique séquentiel commercial qui est un autre code de haute qualité. Il est préférable pour les fonctions objectives avec de petites matrices jacobiennes denses, donc je ne m'attendrais pas à ce qu'il soit utile pour l'optimisation contrainte par PDE, mais vous pouvez l'essayer.
- NLopt est un petit code open source écrit par Steven Johnson au MIT qui contient des implémentations de base d'un certain nombre d'algorithmes d'optimisation non linéaires. Tous les algorithmes devraient être adéquats pour résoudre des problèmes à contraintes liées.
fmincon
dans Matlab implémente un certain nombre d'algorithmes (y compris le point intérieur et la programmation quadratique séquentielle) pour l'optimisation non linéaire
- GAMS et AMPL sont tous deux des langages de modélisation commerciaux utilisés pour formuler des problèmes d'optimisation et contiennent des interfaces avec un grand nombre de solveurs de programmation non linéaire. Je sais que GAMS a une version d'essai qui peut être utilisée pour des problèmes plus petits, et des instances de problème peuvent également être soumises au serveur NEOS pour une solution.
Cependant, il est possible que la discrétisation ne soit différenciable qu'une seule fois en ce qui concerne les variables de décision, auquel cas, vous devez utiliser la descente la plus abrupte projetée ou une autre méthode d'optimisation de premier ordre lors du calcul d'une solution locale. Étant donné que de nombreuses études se concentrent sur les problèmes où des méthodes de second ordre peuvent être utilisées (et lorsque vous pouvez les utiliser, leurs propriétés de convergence supérieures en font un meilleur choix), je n'ai pas pu trouver de nombreuses implémentations de descente la plus abrupte qui n'étaient pas des solutions aux problèmes de devoirs. La bibliothèque scientifique GNU a une implémentation, mais ce n'est qu'à des fins de démonstration. Vous auriez probablement besoin de coder votre propre implémentation.
Si le problème n'est que continu en ce qui concerne les variables de décision, vous pouvez utiliser des méthodes directes pour le résoudre localement. Il existe une excellente enquête sur les méthodes directes par Kolda, Lewis et Torczon . La plus connue de ces méthodes est l' algorithme simplex de Nelder-Mead . Il n'est pas garanti de converger vers un minimum local dans plusieurs dimensions, mais il a quand même trouvé une utilisation pratique considérable.
Le choix du package dépend vraiment de la langue que vous souhaitez utiliser pour résoudre le problème, si la résolution du problème lié à la limite n'est qu'une partie d'un algorithme que vous souhaitez implémenter (ou si c'est la seule étape de votre algorithme, auquel cas les langages de modélisation devenir plus viable pour le code de production), le type et la taille du problème, et si vous avez besoin de parallélisme.