Introduction au logiciel GAMS
Transcription
Introduction au logiciel GAMS
Introduction au logiciel GAMS Nouakchott 2003 I. Introduction Le logiciel GAMS (General Algebraic Modeling System) a été à l’origine développé par un groupe d’économistes de la Banque Mondiale avec pour objectif de faciliter la résolution de grands modèles complexes et souvent non-linéaires à partir d’un ordinateur personnel. GAMS permet donc de résoudre un système d’équation simultanées non-linéaires avec ou sans fonction objectif à optimiser. (i) Simplicité (dans l’implémentation) (ii) Facilité des mises à jour technique (grâce à de nouveaux alogorithmes régulièrement) Î grands avantages du logiciel GAMS. Dans le logiciel initial, le programme devait être crée en format ASCII dans un éditeur de texte traditionnel et tournait avec une commande dos. Le développement récent de l’interface GAMS-IDE rend le logiciel d’utilisation plus facile. GAMS-IDE possède son propre éditeur de texte (compatible avec windows 95) avec la possibilité de lancer et de suivre la compilation et l’exécution du programme à l’écran. Un sous-module GAMS a récemment été développé pour faciliter les transferts avec Excel ou d’autres tableurs. II. Architecture de la programmation dans GAMS 1. Structure du code GAMS Un MEGC programmé dans GAMS peut se décomposer en 3 modules : – Entrée des données (Étape 1), – Spécification du modèle (Étape 2) – Procédure de résolution (Étape 3). Le graphique suivant donne une illustration d’ensemble de la structure du logiciel GAMS (les mots-clés sont indiqués en gras). Etape 3 : Résolution ¾Solve : résolution ¾présentation des résultats Etape 2 : Modèle ¾Variables : déclaration des variables ¾Equations : définition et déclaration des équations ¾Model : definitiondu modèle Etape 1 : données ¾set : déclaration et définitions des ensembles ¾Parameter : declaration et définition des paramètres ¾Assignation des données ¾ display : présente les données intermédiares Quelques règles générales doivent être respectées dans la programmation GAMS : z Il faut toujours déclarer chaque élément avant de les utiliser. Les ensembles et les paramètres doivent toujours être déclarés au tout début du programme. z Même si ce n’est pas toujours nécessaire, une bonne habitude est de toujours mettre un « ; » à la fin d’une commande afin d’éviter des erreurs de compilation. GAMS permets de mettre sur la même ligne plusieurs commande ou de mettre une commande sur chaque ligne. Cette procédure peut aider à réduire la longueur du code ou faciliter l’impression. GAMS ne distingue pas les lettres minuscules des lettres capitales. Les noms donnés à Set, Parameters, Variable, Equation ou Model doivent commencer par une lettre et ne doivent pas avoir plus de 9 caractères. Les mots-clésne doivent pas être utilisés pour déclarer un élément.. Les principales fonctions mathématiques sont les suivantes : Multiplication * Égalité dans une opération Soustraction - Sommation Addition + Produit PROD(set domain, element) Division Puissance / ** Valeur absolue Exponentielle ABS(.) EXP(.) = Logarithme SUM(set domain, element) Maximum Minimum LOG(.) MAX(.,.) MIN(.,.) 2. Procédure de résolution et présentation des résultats Après avoir écrit le code GAMS, il sera sauvegarder avec l’extention‘.gms’. Le nom du fichier doit respecter les contraintes dos standards (8 caractères max sans symbole). La commande RUN dans le menu de GAMS-IDE (F9) peut être utilisée. Le fichier de résultat créé par cette procédure a le même nom que le programme initial mais avec l’extention ‘.lst’. Ce fichier contient soit le programme initial avec l’identification des erreurs compilées s’il y en a, soit les résultats par défaut décrits ci-après : Output dans le fichier ‘nom.lst’ ¾rappel du programme initial ¾liste des équations ¾la liste des colonnes ¾les statistiques du modèle ¾le résumé de la résolution ¾les résultats III. Ecrire un programme GAMS 1.La calibration La première étape du processus de modélisation consiste à entrer les données, définies comme de référence et évaluer les paramètres cohérents avec les données. Il s’agit du processus de calibration. Dans le cas de la modélisation en EGC, les données de référence sont généralement tirées de la MCS. Les paramètres pouvant être calibrés seront déterminés avec ces données. i) Option Title Sans être nécessaire, cette option permet d’obtenir des résultats compréhensibles. Le texte à la suite de la commande $TITLE apparaitra en t^te de page sur chaque nouvelle page de l’output. Un sous-titre peut être également ajouté avec la commande $STITLE. $TITLE Modèle théorique $STITLE Capital immobile entre les secteurs *Modèle d’une économie fermée produisant 2 biens avec 2 facteurs *Nouakchott - Janvier 2003 GAMS ne lit pas les lignes précédées d’une astérisque (*). Une autre manière est de mettre le texte entre les commandes suivantes : $ONTEXT et $OFFTEXT. ii) Définition des ensembles Ceci est très utile pour les variables multidimentionnelles. Ceci correspond à l’indexe dans les représentations mathématiques des modèles. SET I secteurs /BIEN SER agriculture et industrie services/ LA commande SET définit l’ensemble des secteurs I, dont les éléments sont BIEN et SER. Après chaque symbole (I, GOOD and SER) il est possible de rajouter une légende. iii) Définition des paramètres Les paramètres sont les éléments du modèle qui ne changent pas après simulation telles les élasticités, les taux de taxe, les paramètres d’échelle,…. An plus de ces paramètres, les variables de référence sont définis avec leur valeur à l’année de base et resteront invariables après simulation. Une manière pratique de définir ces variables est d’ajouter un "O" après le nom de la variable pour ne pas la confondre avec la vraie variable. La définition des paramètres et des variables de référence commence avec le mot-clé PARAMETER et se termine par un “;”. PARAMETER A(I) alpha(I) delta sigma Coefficient d’échelle (fonction de production Cobb-Dougla parts (fonction de production Cobb-Douglas) parts (fonction d’utilité CES) Elasticité de substitution (fonction d’utilité CES) *Prix wo ro(I) PO(I) Taux de salaire Taux de rendement du capital dans le secteur I Prix du bien I *Production XSO(I) Production du secteur I *Facteurs KDO(I) LSO LDO(I) demande de capital du Sector I Offre totale de travail Demande de travail du secteur I *Demande CO(I) Consommation de bien I *Revenu YHO ; Revenu du ménage iv) Les données A présent, il faut entrer les données. Ceci se fait avec la commande TABLE command très utile pour les variables multidimentionnelle. Le syntaxe est la suivante : TABLE nom(ensemble en ligne, ensemble en colonne) description. description Exemple: TABLE DP(*,I) Données par secteur XSO LDO KDO CO PO ro ; BIEN 26100.0 13320.0 12780.0 26100.0 1.0 1.25 SER 21260.0 15540.0 5720.0 21260.0 0.85 1.25 Les valeurs associées aux variables et paramètres avec ne seule dimension peuvent être entrées avec la commande SCALAR : SCALAR YHO wo sigma ; / 47360.0/ / 0.75/ / 0.8 / Exemple de déclaration de matrice : TABLE DID(I,J) Consommation intermédiaire par secteur AGR IND SER AGR 120.0 2526.9 275.5 IND 1544.0 21709.1 5815.5 SER 136.0 11264.0 3349.0 Lorsque les données sont entrées avec un tableau, il est nécessaire de faire un lien entre le tableau et la variable. Dans l’exemple ci-dessous, la valeur de XSO(I) sera trouvée dans le tableau DP à l’intersection de la ligne ayant le nom XSO et de la colonne I. XSO(I) LDO(I) KDO(I) CO(I) PO(I) ro(I) = = = = = = DP("XSO",I); DP("LDO",I); DP("KDO",I); DP("CO",I); DP("PO",I); DP("ro",I); v) Calcul de variables et calibration D’autres variables et paramètres peuvent être calculés ou calibrés à partir d’autres variables ou paramètres entrés précédemment. A la fin de chaque calcul, il faut mettre un “;”. L’ordre dans lequel ces variables et paramètres sont calculés est très important car GAMS utilisera la dernière valeur assignée à cette variable ou ce paramètre. *Calcul des Volumes LDO(I) = LDO(I)/wo; KDO(I) = KDO(I)/ro(I); XSO(I) = XSO(I)/PO(I); LSO = SUM(I,LDO(I)); CO(I) = CO(I)/PO(I) ; *Production (Cobb-Douglas) alpha(I) = wo*LDO(I)/(PO(I)*XSO(I)); A(I) = XSO(I)/((LDO(I)**alpha(I))*(KDO(I)**(1-alpha(I)))); vi) Présentation des paramètres et variables Dans la feuille de résultats, les valeurs des paramètres ne sont pas automatiquement données. L’option DISPLAY va permettre de présenter ces variables. Le nom des paramètres et des variables de référence sera entré sans dimension. DISPLAY sigma,delta,alpha,A; 2. Le modèle i) Déclaration des variables Toutes les variables qui apparaitront dans les équations doivent être déclarées au préalable. La commande VARIABLES commence cette procédure qui se termine par un “;”. VARIABLES *Prix w r(I) P(I) Taux de salaire Taux de rendement du capital dans le secteur I Prix du bien I *Production XS(I) Production du secteur I *Facteurs KD(I) LD(I) LS ; demande de capital du Secteur I demande de travail du secteur I Offre totale de travail ii) Déclaration des équations Cette étape commence avec la commande EQUATIONS suivie nom et de la description (optionnelle). Quand toutes les équations sont déclarées, un “;” indique la fin. EQUATIONS *Production SUPPLY(I) LDEM(I) *Revenu INCH *Demande DGOOD DSERV *Prix RETK(I) ; Fonction de production pour le secteur I demande de travail pour le secteur I Revenu du ménage Demande de biens Demande de services remuneration du capital du secteur I iii) Assignement des équations La ligne commence par le nom et la dimension suivis par “..”. .. Ensuite l’équation est définie et se termine par un “;” Le terme =E= entre les termes de gauche et de droite de l’équation signifie “égal à” à l’opposé de =G= or =L= SUPPLY(I).. XS(I) =E= A(I)*LD(I)**alpha(I)*KD(I)**(1-alpha(I)) LDEM(I).. LD(I) =E= P(I)*alpha(I)*XS(I)/w; INCH.. YH =E= SUM(I,w*LD(I))+SUM(I,r(I)*KD(I)); DGOOD.. C("SER")=E= YH/(P("SER")+P("GOOD")*(P("SER")/ P("GOOD")*delta/(1-delta))**sigma); DSERV.. C("GOOD")=E= YH/(P("GOOD")+P("SER")*(P("GOOD")/ P("SER")*(1-delta)/delta)**sigma); RETK(I).. ; r(I ) =E= (P(I)*XS(I)-w*LD(I))/KD(I); iv) Procédure d’initialisation Pour toutes les variables déclarées précédemment, une valeur doit etre assignée. Pour résoudre les équation GAMS commence à partir des valeurs de référence. Pour les variables endogènes (celles don’t la valeur changera après simulation) le suffixe .L (pour level) est utilisé : XS.L(I) LD.L(I) KD.L(I) w.L P.L(I) r.L(I) YH.L C.L(I) = = = = = = = = XSO(I); LDO(I); KDO(I); wo; PO(I); ro(I); YHO; CO(I); Pour les variables exogènes le suffixe .FX (pour fixed) est utilisé : *P(GOOD) est le numeraire, le capital est suppose immobile entre les secteurs * L’offre total de travail est exogène P.FX("GOOD") = PO("GOOD"); LS.FX = LSO; KD.FX("GOOD") =KDO("GOOD"); KD.FX("SER")=KDO("SER"); Dans les deux cas, la syntaxe est : le nom de la variable, le suffixe, la dimension de la variable, le signe égal (=), la valeur de référence définie dans le processus de calibration et le “:”. Finalement deux lignes doivent être ajoutée pour la résolution du système. La première pour définir le modèle commençant par la commande MODEL suivie par un nom (THEORY dans l’exemple), une brève description (MODELE THEORIQUE), la liste des équations qui doivent être résolues entre slashes et un “;”. Quand toutes les équations déclarées sont à résoudre, le motclé est ALL à la place de le liste complète des équations. MODEL THEORY MODELE THEORIQUE /ALL/; SOLVE THEORY USING MCP; IV. Lecture du fichier d’output GAMS 1. Echo print S’il y a des erreurs dans le programme, seule cette partie sera présentée. Exemple : Il y a une parenthèse manquante à la fin du calcul du paramètre alpha. alpha Dans le echo print du programme initial, GAMS mettra 4 astérisques (****) **** sous la ligne ayant l’erreur suivis d’un signe dollar ($) et d’un nombre correspondant à une erreur spécifique. 95 alpha(I) = wo*LDO(I)/(PO(I)*XSO(I); $8 **** 96 A(I) = XSO(I)/((LDO(I)**alpha(I))*(KDO(I)**(1-alpha(I)))); A cause de cette erreur GAMS est incapable de résoudre le modèle d’où la présence de l’erreur suivante dans les dernières lignes du programme : 230 231 232 **** MODEL THEORY THEORITICAL MODEL /ALL/; SOLVE THEORY USING MCP; $257 A la fin de l’echo print une description des codes des erreur est donnée dans l’ordre de manière à facilliter la correction : Error Messages 8 ')' expected 257 Solve statement not checked because of previous errors 2. Présentation des paramètres Dans le procéssus de calibration, la commande DISPLAY est utilisée pour présenter la valeur de certains paramètres dans l’output. Les valeurs apparaissent à la fin de l’echo print : ---105 PARAMETER SIGMA function) PARAMETER DELTA ---- 105 PARAMETER ALPHA Bien 0.510, SER 0.731 = 0.800 Elasticité de Substitution (CES uti = 0.554 Part (CES utility function) Part (Cobb-Douglas production function) 3. Listes des équations Cette section présente pour chaque équation sa forme spécifique prenant en considération les valeurs des paramètres et les ensembles. A la fin de chaque équation le terme à gauche de l’équation est calculé et présenté par LHS= " ". Lorsque la valeur a gauche diffère de celle à droite, GAMS ajoute 3 astérisques (***). *** ---- SUPPLY =E= Production function for sector I SUPPLY(GOOD).. XS(GOOD) - (1.25)*KD(GOOD) - (0.75)*LD(GOOD) =E= 0 ; (LHS = 0) SUPPLY(SER).. XS(SER) - (1.4706)*KD(SER) - (0.8824)*LD(SER) =E= 0 ; (LHS = 0) 4. Liste des colonnes GAMS imprime pour chaque variable, les bornes inférieures et supérieures (lower) and (upper), le niveau calculé par le solveur et la valeur du coefficient affectant la variable actuelledans chaque équation. Si le coefficient est nonlinéaire, il est mis entre parenthèses. Ainsi dans l’exemple, la variable apparait dans 5 équations LDEM(I), INCH and RETK(I) et est non-linéaire et donc la valeur du coefficient affectant w est mise entre parenthèses. Column Listing ---- W W SOLVE THEORY USING MCP FROM LINE 231 Taux de salaire (.LO, .L, .UP = -INF, 0.75, +INF) (23680) LDEM(BIENS) (27626.6667) LDEM(SER) (-38480) INCH (1.7371) RETK(BIENS) (4.528) RETK(SER) 5. Modèle Statistiques Cette section donne de l’information sur la taille et la non-linéarité du modèle. BLOCK donne le nombre d’équations et de variables dans le modèle. SINGLE donne le nombre de lignes et de colonnes générées par le solveurs. NON-ZERO ELEMENTS fait référence au nombre de coefficients non nuls. NON LINEAR N-Z indique le nombre de matrices non-linéaires dans le modèle. CODE LENGH et CONSTANT POOL donnent le niveau de la complexité sur la nonlinéarité. GENERATION TIME indique le temps mis pour générer la solution du modèle. MODEL STATISTICS BLOCKS OF EQUATIONS BLOCKS OF VARIABLES NON ZERO ELEMENTS DERIVATIVE POOL CODE LENGTH GENERATION TIME = 9 10 50 10 530 SINGLE EQUATIONS SINGLE VARIABLES NON LINEAR N-Z CONSTANT POOL 0.000 SECONDS 1.4 Mb WIN-18-100 12 16 33 17 6. Résumé du « solve » S O L V E MODEL TYPE SOLVER S U M M A R Y THEORY MCP MILES **** SOLVER STATUS **** MODEL STATUS FROM LINE 231 1 NORMAL COMPLETION 1 OPTIMAL RESOURCE USAGE, LIMIT ITERATION COUNT, LIMIT EVALUATION ERRORS 0.000 0 0 1000.000 10000 0 7. Solution Dans cette section, GAMS donne la solution trouvée par le solveur ligne par ligne et colonne par colonne. Pour chaque équation et chque variable, GAMS nous donne les bornes (lower et upper), upper) le niveau (level) level et la marge (marginal). marginal Le point "." signifie 0. ---- EQU SUPPLY Production function for sector I LOWER LEVEL UPPER MARGINAL . . . . . . . . GOOD SER And here is an example of the variable listing: LOWER ---- VAR W W -INF Wage rate LEVEL 0.750 UPPER MARGINAL +INF . 8. Résumé du rapport Cette section indique le nobre de lignes ou colonnes que GAMS a considéré ainsi que le nombre d’erreurs : **** REPORT SUMMARY : 0 NONOPT 0 INFEASIBLE 0 UNBOUNDED 0 REDEFINED 0 ERRORS 9. Résumé du fichier Cette dernière section indique le nom des fichiers input et output. Dans notre exemple : le fichier d’input est 0KIMM.GMS et celui d’output 0KIMM.LST avec leur localisation. **** FILE SUMMARY INPUT OUTPUT C:\MY DOCUMENTS\MIMAP\FORMATION Dakar\0KIMM.GMS C:\WINDOWS\GAMSDIR\0KIMM.LST http://www.gams.com