Introduction au logiciel GAMS
Introduction au logiciel GAMS
GAMS
(General A
Algebraic
braic Modeling System)
M. Hervé GUENE
Ingénieur Statisticien-Economiste
conomiste
hguene@[Link]
Juin 2009
Support de Cours GAMS 2009
AVANT – PROPOS
Voici une compilation d’astuces qui permettent de balayer un peu les fonctionnalités de GAMS avec en
marge le langage de programmation de ce logiciel. Ce support, qui est le premier tom d’une trilogie
comprenant trois volumes a pour but de familiariser les utilisateurs à l’environnement du logiciel et à
appliquer tout ce qui est programmation statique sous GAMS. C’est le tom 1 de trois supports techniques
destinés à enseigner aux cadres de la prévision et des analyses macroéconomiques, la modélisation en
Equilibre général calculable.
Ici on adopte une approche thématique qui dit qu’avec GAMS on peut faire ceci, on peut faire cela.
L’accent n’a pas été fortement mis sur les MEGC ou les programmes d’optimisation en finance ou
scientifique, mais plutôt sur les paramètres de programmation. Et ce car très souvent, le modélisateur a
déjà son modèle théorique (variables, équations, paramètres, fonctions, types de bouclage…) et ce qu’il
lui reste c’est de trouver un environnement numérique qui lui permettra d’implémenter son travail et
quantifier les impacts de scénarios, …
On veut juste expliquer que GAMS est un outil très puissant qui permet de résoudre beaucoup de
problèmes que nous rencontrons dans notre quotidien professionnel et/ou didactique. Ce document est
accompagné d’un support sur les modélisations dynamique et stochastique en GAMS, et d’un support
consacré' à la modélisation en Equilibre Général Calculable et de plusieurs codes GAMS qui permettent
d’appliquer concrètement ce dont il s’agit quand ces codes ne sont pas directement insérés dans le support.
Il balaie graduellement les résolutions de problèmes en allant des plus simples aux plus complexes. La
dynamique n’a pas été profondément exposée ici, un autre document s’y consacre exclusivement.
Loin de toute prétention, nous voulons indiquer au lecteur où se trouve telle commande de GAMS qui
permet de faire ceci ou cela. Consulter les codes sources accompagnants nous permettrons d’accroitre le
niveau d’apprentissage. Il existe bien sûr une bibliographie très variée avec en marge une petite barrière
linguistique car tous les documents ci référencés sont d’obédience scientifique certes, mais rédigés en
anglais, et c’est ce qui fait l’originalité du présent support.
C’est le lieu pour nous de remercier tous les cadres statisticiens de l’Institut National de la Statistique et de
la Démographie du Burkina-Faso qui ont bien voulu lire et apporter des remarques sur le contenu de ce
travail qui, nous l’espérons connaitra des améliorations significatives dans le futur.
Compléments nécessaires
PRESENTATION DU LOGICIEL
I-1 STRUCTURE
L’installation,
ion, l’utilisation des licences et les dossiers systèmes
Sur le haut de cette page, on peut donc lire la version démo à jour et gratuitement téléchargeable de
GAMS du moment. Ici, référence est faite à la version 22.9, disponible depuisuis le 1er décembre 2008, avec
juste en dessous des offres de téléchargement compatibles aux systèmes d’exploitation dont dispose le
futur utilisateur. Sur le bas de cette page on peut constater le petit cadran ci-dessous :
1
Réunis dans le GAMS development corporation
Page 6 sur 86 M. Hervé GUENE, Ingénieur Statisticien
Statisticien-Economiste; E-mail: hguene@[Link]
Support de Cours GAMS 2009
Il nous présente
nte les caractéristiques de la dernière version démo de GAMS. En l’occurrence, la présente
version peut accepter compiler un modèle
m contenant jusqu’à:
300 contraintes et variables
2000 éléments (paramètres
paramètres, scalaires, vecteurs…) non nuls
50 variables discrètes (y compris les variables
v semi-continues,
continues, les variables binaires et les variables
définies sur des ensembles) ;
Le solveur global quant à lui ne peut excéder une contrainte de 10 variables et contraintes. Les versions
antérieures de la démo offrent des possibilités inferieures à la version récente.
récente Tout utilisateur disposant
d’une version démo et qui modélise au-delà delà d’une des contraintes sus exposées, verra s’afficher à la
compilation de son modèle,, le message suivant: « License error ».
La version complète de GAMS offre quant à elle des capacitésités incomparablement supplémentaires à celles
de la version démo (de l’ordre de 10000 itérations pour une compilation). Et pour obtenir une version
complète, il faut télécharger la version démo puis s’acheter une License à utiliser avec la démo.
Après avoir téléchargé le logiciel, GAMS peut être installé dans n’importe quel répertoire de votre choix.
Il suffit tout simplement de double cliquer sur l’icône du fichier téléchargé et suivre les instructions
d’installation jusqu’à obtenir lee message suivant : « do You have a License file? », si vous avez une
License2, alors copiez la dans le répertoire d’installation de GAMS qui est par défaut C:\Program
Files\GAMS23.0,, puis indiquez le chemin d’accès à cette License dans
ans la boite de dialogue qui se présente
à vous. Au cas où vous ne disposez pas de License, cliquer sur « no » et sur « continue unregistred ».
Mais, au cours de l’installation, GAMS crée automatiquement plusieurs dossiers dont le dossier
« gamsdir » dans « mes documents ». Ce dossier enregistre par défaut tous les programmes et codes
GAMS qui seront exécutés.
Le design de GAMS
GAMS présente une fenêtre majeure pour tout travail. Elle est nommée gamside (gams Integrated
Development
velopment environment, pour dire l’environnement de développement Intégré de GAMS). Elle contient
2
Une License GAMS est un fichier texte (format Txt) léger dont la taille n’excède généralement pas 10 ko
Page 7 sur 86 M. Hervé GUENE, Ingénieur Statisticien
Statisticien-Economiste; E-mail: hguene@[Link]
Support de Cours GAMS 2009
une seule barre contenant 7 menus : File, Edit, Search, Windows, Utilities, Model libraries, et Help ; en
français : Fichier, Edition, Recherche, Utilitaires, Bibliothèque de modèles et Aide.
La bibliothèque de modèles est en fait un dossier contenant une gamme variée de modèles compilés par
les concepteurs et contributeurs de GAMS et qui pourraient éventuellement servir de guide à l’utilisateur.
Cette gamme de modèles couvre tous les champs d’application des sciences décisionnelles (de la finance à
la recherche mathématique pure, aux modèles microéconomiques, les problèmes de suivi de réactions
nucléaire en chimie, en physique en électronique,…).
3
Ça peut être un code gms, gdx, opt, txt, gch, pas ou autre
Page 8 sur 86 M. Hervé GUENE, Ingénieur Statisticien-Economiste; E-mail: hguene@[Link]
Support de Cours GAMS 2009
Project permet d’accéder aux projets déjà existants (en cliquant sur open Project), de créer de nouveaux
projets (en cliquant sur new Project) et aussi d’accéder aux projets récemment ouverts.
Un projet GAMS peut être défini comme un programme ou un ensemble de programmes écrits en langage
GAMS pour réaliser un objectif bien précis. L’onglet project permet donc de mieux organiser les projets
dans le dossier gamsdir/projdir.
La proposition la plus importante est option du point de vue de la configuration. Un clic sur cette offre
présente la fenêtre suivante :
Il est important de préciser au passage que GAMS n’est pas un logiciel économétrique. Il ne faudrait donc en
attendre des modélisations de séries temporelles ou des modélisations économétriques semblables au
fonctionnement des logiciels comme E-views, STATA... En revanche il utilise les résultats d’estimations
économétriques pour des travaux qui s’inscrivent dans un cadre plus large incluant à la fois modélisation
économétrique, cohérence comptable et combinaison de pouvoirs explicatif et prédictif.
Main window /input window (Ecrire un code .gms : les différentes extensions)
Active process windows
Log windows
Output window (fichier lst, gdx: lecture des résultats)
Comment lire les résultats ? Comment interpréter ? Détails sur les fenêtres de lecture des résultats (à faire
oralement).
Lorsqu’on exécute un modèle (à partir du [Link]), ‘la fenêtre no active process ‘ apparait. En double-
cliquant sur n’importe quelle ligne cela renvoie au résultat du programme (i-e le fichier .lst). Les lignes
rouges indiquent les erreurs, et un double clique sur une ligne rouge nous renvoie à l’endroit du code où se
trouve le code. Les lignes deviennent lorsqu’il n’ya pas d’erreur de compilation. Par contre il peut
persister des erreurs d’exécution. Lorsqu’on exécute un programme (en tapant la touche f9 du clavier ou
en cliquant sur le bouton run (matérialisé par une flèche horizontale rouge dans le gamside), le logiciel
compile d’abord le programme pour voir s’il n’ya pas d’erreur ni dans la syntaxe, ni dans l’écriture du
code. Ensuite il exécute le programme, c'est-à-dire il effectue les calculs et commandes exigées dans le
programme. Donc c’est à cette étape qu’il calcule les valeurs des variables, des paramètres, qu’il appelle
tel ou tel fichier en input ou en output,… si bien qu’à l’exécution on peut avoir des erreurs de ‘division par
zéro’ pour dire que GAMS en effectuant les calculs s’est rendu compte qu’il doit diviser une valeur par
zéro, ce qui n’est pas permis. Cette erreur sera donc marquée en bleu plutôt qu’en rouge. Un autre type
d’erreur de compilation est celui de licence non adaptée. Il arrive souvent que les calculs l’on demande à
GAMS sont si nombreux et exigent un nombre si important d’itérations que la License est incapable
d’exécuter. Ces erreurs d’exécution ne sont pas marquées au rouge.
Les caractères
De a à z Alphabet De A à Z Alphabet De 0 à 9 numérique & ampersand ’’ guillemets
# Signe du pound * Multiplier = Egal ? Pt interro @ A
> Supérieur ou égal < Inférieur à ‘ Apostrophe : Deux points - moins
/ Slash , Virgule ( ) Parenthèse Espace $ Dollar
[ ] Crochet _ Underscore . Point {} Accolades ! exclamation
+ Plus % Pourcent ^ exposant
Les symboles
Operateur Exemple Signification mathématique
** x**y (x>0) ࢞࢟
* x*y ࢞x ࢟
࢞
/ x/y
࢟
+ x+y ࢞+ ࢟
- x-y ࢞− ࢟
- Une ligne qui commence par le symbole * sera traitée comme un commentaire; exemple:
- Une portion de texte ou une section/paragraphe de code comprise entre les commandes $ontext et $offtext
sera considérée comme commentaire et non come un programme de calcul ; exemple :
$ontext
Après avoir importé les données, il faut maintenant calibrer le modèle. Celles provenant de la douane seront
considérées ad valorem, tandis que celles provenant des enquêtes ménage sera normalisées çà l’indice des prix à la
consommation. C’est pourquoi vous verrez l’équation normal apparaitre dans la suite.
$offtext
I-2 Utilité
On ne peut dresser de manière exhaustive tous les types de travaux qui pourraient être effectués avec
GAMS; on peut dire qu’il résous tout ce qui est programme numérique d’optimisation depuis le control
optimal au calcul des variations, les problèmes quadratiques les problèmes coniques, les programmes
d’optimisation linéaire… bref divers types de problème qui couvrent pratiquement tous les champs des
sciences contemporaines (changement climatiques, chimie, sciences environnementales, économie,
mathématiques…). C’est un logiciel qui évolue par contributions de ses utilisateurs.
* multiplication
3 ݔ+ 2 ݕ+ = ݖ15 3 ∗ ݔ+ 2 ∗ ݕ+ = ݁ = ݖ15 -, / et + représentent respectivement les signes
de la soustraction, la division et l’addition
2 ݔ+ ݕ− = ݖ4 2 ∗ ݔ+ ݕ− =݁ =ݖ4
** est utilisé pour exprimer l’élévation à une
ݔ− 6 ݕ+ 20 = ݖ0 ݔ− 6 ∗ ݕ+ 20 ∗ = ݁ = ݖ0 puissance réelle ; par exemple ݔଶ s’écrit x**2
variable
equation
Ecriture d’équations
eq3.. x-6*y+20*z=e=0 ;
a11x1 +a12x2+………+a1n xn = b1
a21x1 +a22x2+………+a2n xn = b2
……………………………………
an1x1 +an2x2+………+ann xn = bn
Où x1, x2, …, xn sont des inconnues que l’on appellera désormais variables d’état. Ici, l’on cherche pour bi
(i=1,…, n) les valeurs des Xi (i=1,n) qui vérifient les conditions imposées par les équations ci-dessus.
Voici la méthode générale de résolution des systèmes de ce genre sous GAMS :
De même, GAMS peut résoudre tout ce qui est système d’équations ou d’inéquations simple, pourvu que
le système soit carré (i-e x équations/inéquations pour x inconnues) et que l’on utilise les notations
spécifiées dans les deux dernières colonnes de droite. Mais pour ce qui est des inéquations GAMS ne peut
pas sortir de résultat sous forme d’ensembles. Alors il ne peut que maximiser ou minimiser une fonction
objectif avec des contraintes d’égalité ou d’inégalité comme suit.
Exemple 1
Exemple 2
Ceci est un exemple fictif créé à partir du programme de gestion de savonnerie ci-dessus.
Minimiser
z = 4 x1 +2 x2+3 x3
sous
x1 1000
x2 = 500
x3 1500
3 x1 +6 x2+2 x3 6750
Il existe une panoplie de fonctions programmées sous GAMS et pouvant être directement appelées dans
nos différents codes. Le tableau suivant n’est qu’une présentation non exhaustive de ces dites fonctions.
ArcCos (x) Arc cosinus de l’argument x où x doit être en radians nécessite des solveurs pouvant gérer des
fonctions non linéaires
ArcSin (x) Arc sinus de l’argument x où x doit être en radians nécessite des solveurs pouvant gérer des
fonctions non linéaires
ArcTan (x) Arc tangente de l’argument x où x doit être en radians nécessite des solveurs pouvant gérer des
Sigmoid(x) Sigmoid (x) = 1/ (1+exp(-x)) nécessite des solveurs pouvant gérer des
fonctions non linéaires
Smax C’est une fonction qui calcule le plus grand élément d’un
ensemble d’expressions ou de termes indexés sur un
ensemble
Tan(x) Tangente de l’argument x où x doit être en radians nécessite des solveurs pouvant gérer des
fonctions non linéaires dynamiques ou
des fonctions discontinues
Tanh(x) Tangente Hyperbolique de l’argument x où x doit être en nécessite des solveurs pouvant gérer des
radians fonctions non linéaires
Trunc(x) Troncature de x (i-e trunc(x)=sign(x)*floor(abs(x))) Disponible
Uniform(x,y) Nombre aléatoire réel compris entre x et y généré selon une Disponible
loi de probabilité uniforme
Uniformint(x,y) Nombre aléatoire entier compris entre x et y généré selon Disponible
une loi de probabilité uniforme
Operateur
GAMS Eq ou = Ne ou <> GT ou > GE ou >= LT ou < LE ou <=
expression a=b a ne b ou a<>b a gt b ou a>b a ge b ou a>=b a lt b ou a<b a le b ou a<=b
explication terme a = terme b terme a ≠ terme b terme a > terme b terme a > terme b terme a < terme b terme a < terme b
Pour effectuer des opérations sur les premier, deuxième, troisième, intermédiaire, …,
dernier élément d’un ensemble ordonné, on peut utiliser un code du genre
PREMIERBAL(period)$(ord(period) eq 1).
DERNIERBAL(PERIOD)$(ORD(period) eq CARD(period))
Ou bien
Z=z+1;);
Quand on veut effectuer une action lorsqu’une condition n’est pas vérifiée, il faut la préfixer d’un
opérateur not. Cela fait appel à une syntaxe du type :
not
Action$(not condition logique1) ou bien If (not condition logique1, Action); ou encore While
(not condition logique1), Action);
Quand on effectue une action et qu’on veut que une ou plusieurs conditions soient simultanément
satisfaites, il faut les joindre (lier) avec un opérateur and. Cela se fait à l’aide d’une syntaxe de
type:
and
Action$(condition logique1 and condition logique2 and condition logique3) ou encore If
((condition logique 1 and condition logique2 and condition logique3), Action); ou bien While
((condition logique1 and condition logique2 and condition logique3), Action);
Quand on effectue une action et conditionnée par au moins une ou 2 ou plusieurs conditions, il
faut les joindre (lier) avec un opérateur or. Cette commande invoque l’inclusion; C’est un ou
inclusif. Cela se fait à l’aide d’une syntaxe de type:
or
Action$(condition logique1 or condition logique2 or condition logique3) ou bien If
((condition logique 1 or condition logique2 or condition logique3), Action); ou encore
While((condition logique1 or condition logique2 or condition logique3),Action);
Quand on veut effectuer une action si et seulement si une seule et condition est vérifiée parmi 2
ou plusieurs conditions, il faut les joindre (lier) avec un opérateur xor. C’est la matérialisation du
ou exclusif, et donc la différence symétrique au sens ensembliste(ܣ. ܤത + )ܤ ̅ܣ. X appartient à A ou
B mais nullement à aux deux à la fois. Cela se fait à l’aide d’une syntaxe de type:
xor
Action$(condition logique1 xor condition logique2 xor condition logique3) ou bien If
((condition logique 1 xor condition logique2 xor condition logique3), Action); ou encore
While((condition logique1 xor condition logique2 xor condition logique3),Action);
Présentation des limites des différentes versions de GAMS (oralement). GAMS sur internet (comment
obtenir le logiciel? Présentation de la page [Link] et importance de gamsworld, le forum en ligne
des utilisateurs de GAMS).
PROGRAMMATION CONIQUE
II-1 Introduction
La programmation conique peut être conçue comme étant une généralisation de la programmation linéaire
avec pour contrainte additionnelle ܥ߳ݔ, où C est un cône convexe. La classe de problème
problèmes qui en résulte
est connue sous le label de programmation conique et s’exprime en général sous la forme suivante:
Minimiser ்ܿݔ
ݎ ≤ ݔܣ
Sous la contrainte ൝݈[߳ݔ௫, ݑ௫]
ܥ߳ݔ
A présent partitionnons le vecteur de décision en plusieurs ensembles ܵ௧, = ݐ1, … , ݇, de sorte que
chaque variable de décision xi soit membre d’un et un seul ensemble ܵ௧. Par exemple on peut avoir :
ݔ
ݔଵ
ݔହ
ܵଵ = ݔସ൩ ݁ܵݐଶ = ൦ ݔ൪ (1)
ଷ
ݔ
ݔଶ
(2)
ܥ௧ = ቊ߳ݔℝ : ݔଵ ≥ ට∑ୀଶ ݔଶቋ (3)
ܥ௧ = ቊ߳ݔℝ : 2ݔଵݔଶ ≥ ට∑ୀଶ ݔଶ , ݔଵ, ݔଶ ≥ 0ቋ (4)
Ces deux types de cônes sont utilisés pour formuler les problèmes quadratiques, les problèmes
quadratiquement contraints ainsi que d’autres classes de problèmes d’optimisation convexe non linéaire.
Cône quadratique:
(5)
(6)
Cône quadratique:
(7)
(8)
Exemple de programmation
ogrammation conique
ௗ ܽ௧ܾ ≤ ݔ
Le problème original est: minimiser ∑ sous la contrainte: ൜
௫ ݔ߳[݈, ݑ], ݈ > 0,
0 ݀ ≥ 0, ݅= 1,2, … , ݊
(9)
On peut écrire une formulation NLP, en remplaçant la fonction objectif et en ajoutant une autre contrainte:
ܽ௧ܾ ≤ ݔ
2ݖ ≥ ݔ ݐଶ, ݅= 1, … , ݊
minimiser ∑݀ݐ sous la contrainte ൞ (10)
݈[߳ݔ, ]ݑ, ݈ > 0, ݀ ≥ 0
Où ߳ݐℝ est une nouvelle variable de décision. La formulation GAMS de ce NLP (model cnlp) est:
defobjc.. sum(n, d(n)*t(n)) =E= obj;
e1.. sum(n, a(n)*x(n)) =L= b;
conenlp(n).. 2*t(n)*x(n) =G= 2;
On peut transformer l’égalité en une inégalité parce que le paramètre ݀ ≥ 0 et nous sommes en présence
d’un problème de minimisation. Aussi, la contrainte conenlp(n) est une forme de cône quadratique
orienté. Si l’on introduit la variable ߳ݔℝ , ݖ = √2, alors on peut reformuler le problème en utilisant une
contrainte conique:
⎧ܽ௧ܾ ≤ ݔ
⎪ݖ = √2
Minimiser ∑݀ݐ Sous la contrainte (11)
ଶ
2ݐ
⎨ ݔ ≥ ݖ , ݅= 1, … , ݊
⎪݈[߳ݔ, ]ݑ, ݈ > 0, ݀ ≥ 0
⎩
Cette formulation est un programme linéaire GAMS, tel que les contraintes cone(n)... représentent la
contrainte conique non linéaire orientée.
Set n / n1*n10 /;
Parameter d(n), a(n), l(n), u(n);
Scalar b;
d(n) = uniform(1,2);
a(n) = uniform (10,50);
Page 24 sur 86 M. Hervé GUENE, Ingénieur Statisticien-Economiste; E-mail: hguene@[Link]
Support de Cours GAMS 2009
l(n) = uniform(0.1,10);
u(n) = l(n) + uniform(0,12-l(n));
uniform(0,12
Variables x(n);
x.l(n) = uniform(l(n), u(n));
b = sum(n, x.l(n)*a(n));
Variables
ariables t(n), z(n), obj;
Equations defobjc, defobj, e1, e2(n), cone(n), conenlp(n);
[Link](n) = l(n);
[Link](n) = u(n);
Il est souvent préférable de modéliser les programmes convexes dans une forme séparée dans la mesure du
possible. Considérons
ons le problème suivant de minimisation d’une fonction objectif.
Où ܽ߳ℝ est un paramètre et ߳ ݔℝ est la variable de décision. L’équation entraine une contrainte
implicite a' ∗ > ݔ0. Malheureusement des erreurs de types domain violations peuvent apparaitre parce
qu’on n’a pas mis de restriction sur a' ∗ ݔ.. Une approche meilleure consisterait à introduire une variable
intermédiaire y :
݂( = )ݔlog()ݕ
= ݕaᇱ ∗ ݔ
≥ݕ0
Cela permet de gérer deux choses. ça permet de borner implicitement , et donc de réduire le risque
d’occurrence de domain violations. Secundo, ça accélère la compilation puisque le calcul des gradients et
hessiens dans la première forme est expansive. Finalement cela n’occupe pas une grande mémoire.
Exemple 1 :
$ontext
Dans ce modèle je veux résoudre un problème de programmation quadratique :
s.c Ax <= b
où Q et A son t des matrices et x, c et b sont des vecteurs de ℝ . Si Q est semi définie positive, alors on a
une solution au problème s’il existe deux vecteurs u et x satisfaisants les conditions suivantes:
/ Q A’ \ / x \ = -c
\ -A / \ u / >= -b
$offtext
Alias (I,J);
PARAMETER
Q(I,J) matrice des contraintes
C(J) vecteur de cout
A(K,J) matrice de contraintes
B(K) coefficients rhs;
C(J) = 0;
table Q(I,J)
1 2
1 2
2 2;
table A(K,J)
1 2
1 1 1
2 3 -4;
VARIABLE
x(J) variables primales
u(K) variables duales;
EQUATION
ps(J)
ds(K);
Exemple 2
ݔ( = ݕ ݊݅ ܯଵ − 1)ଶ + (ݔଵ − ݔଶ)ଶ + (ݔଶ − ݔଷ)ଷ + (ݔଷ − ݔସ)ସ + (ݔସ − ݔହ)ସ
ݔଵ + ݔଶଶ + ݔଷଷ = 2 + 3√2
Sous la contrainte ቐݔଶ − ݔଷଶ + ݔଵ = 2√2 − 2
ݔଵ. ݔହ = 2
Ici on cherche les valeurs de x1, x2, x3, x4 et x5 qui vérifient les conditions et minimisent y. Voici le code
GAMS de ce problème:
equation
le nom du code GAMS est quadratique_gdxxrw15.gms, et voici comment il se présente sous GAMS
Page 27 sur 86 M. Hervé GUENE, Ingénieur Statisticien-Economiste; E-mail: hguene@[Link]
Support de Cours GAMS 2009
La structure générale d’un fichier input GAMS contient les éléments suivants:
SET
{Pour exprimer et déclarer les ensembles et sous ensembles que l’on va utiliser dans le modèle}
VARIABLES
{Indique les variables qui seront calculées par le modèle}
SCALAR
PARAMETERS
{Exprime les données et quelquefois les constantes calculées par le modèle; ces valeurs sont fixées}
TABLE
{pour insérer les matrices de données, les tableaux de type input output, les MCS, …}
EQUATIONS
{D’abord on déclare les équations, c’est à dire on les nomme; ensuite on les définit, c’est à dire on écrit
leur forme mathématique en langage GAMS}
MODEL
{on donne un nom au modèle}
SOLVE
{le mode de résolution est spécifié si l’optimande doit être maximisé ou minimisé et on précise le type de
modèle dont il s’agit (nlp, mcp,…)}
DISPLAY
{Ici on choisit de présenter les variables qu’on souhaite mettre en exergue, celles dont on veut voir
l’évolution}
Chacun de ces éléments sont des mots réservés qui peuvent apparaitre plusieurs dans un code GAMS; ils
constituent l’ossature d’un GAMS.
Ici l’ensemble factors désigne les facteurs de production. Il, est constitué de deux éléments labour et
capital. Les textes (le travail et le capital) sont des commentaires qui expliquent respectivement ce que
signifient labour et capital.
Exemple2 :
Ici ac, a, c, ins, insd, insdng, h, cp, insp, ap et insdngp sont des ensembles, certains étant inclus dans
d’autres ( ⊂ , ⊂ , ࡵࡺ ࡿ ⊂ , ࡵࡺ ࡿࡰ ⊂ ࡵࡺ ࡿ, ࡵࡺ ࡿࡰࡺ ࡳ ⊂ ࡵࡺ ࡿࡰ , ࡴ ⊂ ࡵࡺ ࡿࡰࡺ ࡳ). Mais cp, insp,
ap et insdngp ont été crées par la commande alias. L’ensemble ap contient exactement les mêmes
éléments que a ; de même cp contient exactement les mêmes éléments que c, insp contient exactement les
mêmes éléments que ins,…
VARIABLE
Les variables représentent ce sui nous intéresse réellement dans le modèle. Leurs valeurs sont
déterminées de manière endogène par le modèle. Elles doivent être déclarées en utilisant la commande
variable. Le code GAMS de déclaration et calcul des variables est:
VARIABLE
X1 commentaire en une ligne pour expliquer la signification de X1
X2 commentaire en une ligne pour expliquer la signification de X2
Y commentaire en une ligne pour expliquer la signification de Y
On écrit donc le nom de la variable, ensuite on écrit en une ligne un commentaire pour expliquer ce
qu’elle désigne. On réplique la même chose pour toutes les autres variables. Et lorsqu’on a finit de définir
un type de données (VARIABLES, PARAMETER, EQUATION, MODEL, SOLVE, DISPLAY), le
passage au type suivant de donnée se fait par un point virgule.
Exemple :
Les variables objectifs ainsi que celles à minimiser et/ou maximiser ne doivent pas contenir de restriction.
Elles doivent être des free variable.
A présent voyons comment insérer des données dans notre code GAMS:
Les données sont des constantes, des vecteurs, ou des matrices/tableaux.
Pour déclarer une donnée in utilise :
SCALAR (pour les constantes: dimension zéro)
PARAMETER (pour les vecteurs: dimension 1)
TABLE (pour les matrices, les tableaux (du genre TES, MCS) : multidimensionnel)
Page 33 sur 86 M. Hervé GUENE, Ingénieur Statisticien-Economiste; E-mail: hguene@[Link]
Support de Cours GAMS 2009
SCALAR
La constante n’a aucun lien avec un ensemble quelconque. Elle ne contient donc pas d’indice. Dès qu’on
défini une constante on doit écrire sa valeur juste en face. Cette valeur est exogène au modèle.
Voici comment on déclare une constante :
SCALAR
nomdelaconstante commentaire explicatif en une ligne /valeur numérique de la constante/
Exemple :
PARAMETER
Supposons que j’ai un paramètre A dont la valeur est 3. Alors le code GAMS est
PARAMETERS
A commentaire sur une ligne pour expliquer la signification de A;
A = 3;
Ou alors on pouvait procéder comme suit:
PARAMETERS
A commentaire sur une ligne pour expliquer la signification de A /3/;
et cela apparait comme suit:
Les constantes peuvent aussi être spécifiées comme étant des scalaires (SCALAR). GAMS est indifférent
en ce qui concerne la manière dont les paramètres et constantes sont définis (que ce soit à l’aide de
SCALAR ou PARAMETER). Pour la commande paramètre, lorsqu’on définit un paramètre, très souvent
les paramètres ont des liens avec les ensembles, et on écrit une formule pour calculer la valeur du
paramètre dans la suite du code. Si aucune valeur n’a été assignée au paramètre et aucune formule ne
permet de le calculer, alors GAMS lui donne la valeur zéro par défaut.
TABLE
Les tableaux de données concernant les paramètres ou tout autre type de données peuvent être déclarés
séparément par la commande table. En réalité ce sont des paramètres sauf qu’ils sont multidimensionnels.
Pour ce faire, il faut d’abord écrire table et déclarer. Ils sont le croisement de deux ensembles au moins, u
n dont les éléments sont en lignes et un ensemble dont les ensembles sont en colonnes. Par défaut il donne
la valeur zéro aux différentes intersections ligne/colonne. Par exemple: la déclaration d’une matrice de
comptabilité sociale en abrégé MCS ou encore SAM en anglais.
EQUATIONS
DECLARATION
La gestion des équations est un peu plus complexe que celle des autres types en GAMS, parce qu’après
avoir déclaré les équations exactement comme on le fait avec les variables et les paramètres, on définit les
équations c’est à dire on écrit leur forme mathématique en langage GAMS.
EQUATIONS
QX1 Explanatory text on the meaning of the equation for X1
QX2 Explanatory text on the meaning of the equation for X2
QY Explanatory text on the meaning of the equation for Y;
DEFINITION
Mais pendant la définition des équations, chaque équation est séparée de l’autre par un point virgule.
QX1.. X1 =L= A;
QX2.. X2 =E= 5;
QY.. Y =E= X1 + X2;
Dans l’exemple ci dessus, la première équation détermine la valeur de X1. Elle est nommée QX1, et nous
dit que la valeur de x1 est inférieure ou égale à A. La seconde équation nous dit que X2 est égal à 5. Dans
la troisième équation, on lit que y est la somme de X1 et X2.
MODEL
Pour déclarer un modèle, on écrit MODEL nom que je veux donner à mon modèle /liste
des équations définissant mon modèle séparées les unes des autres par
une virgule/ ;
Si les équations préalablement écrites déterminent toutes mon modèle, alors j’écris
Exemple:
SOLVE
le SOLVE permet de dire à GAMS de résoudre le modèle. Les modèles sont des objets que GAMS résout.
Ils sont des concentrés d’équations, de variables, de conditions logiques comportant des attributs. On écrit
donc SOLVE ensuite le nom du modèle puis le mode de solution de l’optimande (i-e si c’est une
maximisation ou une minimisation ou un problème mixte) nom de l’opérande using type de modèle.
Procédure Description
LP Linear programming. Le modèle ne doit pas contenir des variables/équations non linéaires ou
discrètes (binary et integer).
NLP Nonlinear programming. Dans le modèle, les formes non linéaires doivent être des fonctions
continues et le modèle ne doit pas comporter de variable discrète.
MIP Mixed integer programming. Similaire à RMIP, mais il doit rigoureusement contenir des variables et
équations discrètes. Les variables discrètes doivent prendre des valeurs discrètes bornées.
MINLP Mixed integer nonlinear programming. Les mêmes caractéristiques que MINLP, mais rigueur est faite
sur le fait qu’il doive contenir des variables et équations discrètes.
DNLP Pour les programmes non linéaires avec des dérivées discontinues
*--------------------------------------------------------------------------------------------
*--------------------------------------------------------------------------------------------
$ontext
Dans cette section, tous les ensembles sont déclarés. Ils sont divisés en 4 sous ensembles:
a. les ensembles du modèle (ceux qui apparaissent dans les équations du modèle)
b. les ensembles de calibration (utilisés pour initialiser les variables et définir les paramètres du modèle)
Toutes les * que vous voyez au début de chaque ligne permettent de faire des commentaires. Ces lignes ne seront
pas lues lorsque GAMS va compiler et exécuter le modèle
$offtext
SETS
*--------------------------------------------------------------------------------------------
*--------------------------------------------------------------------------------------------
On peut appeler la MCS ou tout ce qui est donnée comptable à partir d’un fichier externe pour ne pas que le
modèle soit long ou encore pour ne pas s’encombrer, ou alors l’écrire simplement ici.
Page 38 sur 86 M. Hervé GUENE, Ingénieur Statisticien-Economiste; E-mail: hguene@[Link]
Support de Cours GAMS 2009
Par exemple:
$INCLUDE [Link]
DISPLAY
Utiliser la commande display pour faire apparaitre certaines valeurs qu’on pourrait calculer à partir de la MCS
pour vérifier la cohérence de base (le PIB par exemple, les exportations, certains rapports, …, à noter que dans une
MCS on ne peut pas calculer de prix. La MCS représente les échanges qui ont eu lieu entre les acteurs d’une
économie durant une année).
*--------------------------------------------------------------------------------------------
*--------------------------------------------------------------------------------------------
$ontext
a. les ensembles du modèle (ceux qui apparaissent dans les équations du modèle)
b. les ensembles de calibration (utilisés pour initialiser les variables et définir les paramètres du modèle)
Dans chaque groupe, les paramètres sont déclarés par ordre alphabétique. Ici il s’agit seulement d’écrire le nom
de chaque paramètre et d’écrire en face un commentaire qui nous dit à quoi sert le paramètre. On n’écrit donc
pas de formule de calcul ici.
$offtext
*--------------------------------------------------------------------------------------------
*--------------------------------------------------------------------------------------------
* Ici on va écrire les relations et formules qui permettent de calibrer et calculer chacun des *paramètres. Tous les
paramètres sont définis et listés, en les scindant selon la typologie suivante:
*-----------------------------------------------------
*--------------------------------------------------------------------------------------------
*cette section concerne uniquement les variables qui appariassent dans le modèle.
*--------------------------------------------------------------------------------------------
*--------------------------------------------------------------------------------------------
*On peut le faire directement dans notre code GAMS, ou alors le faire séparément dans un autre *fichier gms, txt
ou inc puis l’inclure comme suit:
$INCLUDE [Link]
*$INCLUDE [Link]
*--------------------------------------------------------------------------------------------
*--------------------------------------------------------------------------------------------
EQUATIONS
*--------------------------------------------------------------------------------------------
*--------------------------------------------------------------------------------------------
*--------------------------------------------------------------------------------------------
*--------------------------------------------------------------------------------------------
*--------------------------------------------------------------------------------------------
*10. ANNULATION DES VALEURS DES VARIABLES QUI NE SONT PAS DANS LE MODELE---------
*--------------------------------------------------------------------------------------------
*--------------------------------------------------------------------------------------------
*--------------------------------------------------------------------------------------------
$ontext
Dans le fichier de simulation, [Link], l’utilisateur choisit antre plusieurs types de bouclages. Les conditions de
bouclage portent sur:
$offtext
* facteurs Désagrégés:
* facteurs Agrégés:
* [Link] = GSAV0;
*balance épargne-investissement------
*--------------------------------------------------------------------------------------------
*--------------------------------------------------------------------------------------------
a- L’instruction LOOP
La commande Loop permet d’exécuter un certain nombre d’actions pour chaque élément d’un ensemble.
En fait c’est une boucle comme on en connait dans le langage informatique; du genre ‘faire tant que’. La
syntaxe du Loop est du type:
Le Loop permet à GAMS d’exécuter les actions pour chaque élément de l’ensemble concerné.
Exemples de loop
Page 42 sur 86 M. Hervé GUENE, Ingénieur Statisticien-Economiste; E-mail: hguene@[Link]
Support de Cours GAMS 2009
Exemple1: Le loop suivant est tiré de notre modèle 221. Il permet de compiler des scénarios. Pour chaque
scénario, il nous maximise la variable util et présente les résultats que sont les valeurs de pk, pd, pl, k, l,
xd, c, y et alphaF. Et les scénarios simulent une augmentation du paramètre var (sc) de 0,6.
loop(sc,
alphaF("sec1")=0.6 + Var(sc) ;
Solve le221 using NLP maximizing util ;
Display
PK.L, PL.L, PD.L, K.L, L.L, XD.L, C.L, Y.L
alphaF
) ;
Cela signifie en symboles mathématique que :
Résoudre le modèle le221 en maximisant la variable util (qui est l’utilité du consommateur) pour toutes les valeurs
de sc., ߙி,௦ଵ = 0,6 + ݎܽݒ௦ . Après avoir résolu le modèle pour chacune des valeurs de sc, présenter les valeurs de
PK (le prix du capital) PL(le prix du travail), PD (le prix de la demande des biens consommés), XD (la demande des
biens), K (la quantité de capital), L(la quantité de capital), C (la consommation), et Y(le revenu)
Exemple2 : A partir du taux de croissance de la population chaque année (de 1985 à 1990) et connaissant la taille
de la population en 1985, on va insérer une boucle qui permettra de calculer la taille de la population annuelle sur
l’horizon 1985-1990 de manière récursive.
Exemple3 :
,ଶ
C'est-à-dire si ≤ݐ21, ݁݀௧ = 1,4 − ቀ ቁ(ݐ− 1); >ݐ݅ݏ21, ݁݀௧=0.
ଷ
b- L’instruction PUT
put item;
où item peut être n’importe quel type d’output, tel que du texte explicatif, un label, un paramètre, les
attributs d’une variable, les attributs d’une équation ou les attributs d’un modèle. Cependant, pour que
GAMS mette l’output dans le chemin approprié, l’utilisateur doit d’abord spécifier le nom du fichier et le
chemin, puis écrire une commande pour activer ce fichier.
put identifiantfichierlocal ;
put item1;
put item2;
put item3;
Exemple de put
Ici, on a un graphique nommé [Link] ; il est bon de préciser au passage que les graphiques crées par
GAMS portent l’extension ’.gch’. Et dans notre cas, ce graphique est créé à partir du fichier [Link],
il est de type multi line, il est titré stockData et l’ensemble de données dont il présente l’évolution est
nommé StockData.
Pour l’obtenir, il suffit de cliquer sur la ligne bleue putfile: f C:\Documents and Settings\GUENE\Mes
documents\gamsdir\projdir\[Link] de la fenêtre ‘no actve process’
$onput
[CHART]
GDXFILE=[Link]
TITLE=StockData
[SERIES1]
SYMBOL=StockData
TYPE=multi-linex
$offput
c- Le while
Cette commande permet de répéter un ensemble d’actions tant qu’une certaine condition logique est
satisfaite.
Exemple1
Exemple2
ou bien
d- Le if… else…
e- Le for
Il permet de répéter un certain nombre d’actions pour les valeurs successives d’une constante. Voici la
syntaxe générale du for :
Exemple1
Ou encore
Exemple2
f- Le if-elseif-else
Cette commande utilisée pour transférer des des conditions d’un opérateur à un autre. Dans
certain cas il peut faire intervenir des conditions utilisant $. En voici la syntaxe usuelle:
If (condition, actions à effectuer ;
Elseif (condition), actions à effectuer ;
Else actions à effectuer ;
);
exemple
g- Le repeat
IL est utilisé pour exécuter un ensemble d’actions sur une condition logique et tant que cette
condition est satisfaite. La syntaxe générale du repeat est : repeat (actions a effectuer ; until condition
logique est vraie) ;
Exemple
C’est la première chose à faire dans un modèle qu’on veut dynamique, qu’il soit d’EGC ou autre. Ici on
voulait mettre en relief les effets transitoires à chaque décennie, donc un autre sous ensemble a été défini
sur les décennies. L’horizon temporel va de 1990 à 2060 et les conditions qui définissent les années
initiales et finales sont effectuées par l’usage des dollars (symboles). GAMS ne travaille pas avec les
valeurs des constituants de l’ensemble même si cet ensemble est ordonné et sensé. Ce que GAMS utilise,
c’est l’ordre de précédence. Donc pour lui, l’année initiale est celle qui correspond au premier élément de
l’ensemble t (ce qui s’écrit donc tinit (t) est l’élément pour lequel ordre de t
est égale à 1). Ensuite, l’année finale, c'est-à-dire la dernière année est celle qui correspond au dernier
élément de l’ensemble t, c’est à dire l’élément dont l’ordre est égal au cardinal de t additionné de 1990,
car on commence par 1990 (ce qui s’écrit , donc tfinal est égal au nombre
d’éléments de t additionné de 1990 car on commence à compter à partir de 1990. Si on commençait à
partir de zéro, par exemple si on avait set /0*60/, alors tfinal serait égal à (cardinal de t)-1). Dans notre
exemple, card(t)=71 c'est-à-dire 2060-1990+1 ; or le dernier élément de set n’est pas 70; c’est plutôt
Page 47 sur 86 M. Hervé GUENE, Ingénieur Statisticien-Economiste; E-mail: hguene@[Link]
Support de Cours GAMS 2009
Pour une introduction réussie, voir le fichier [Link], ou le tome 2 spécifiquement consacré à la
programmation dynamique et les codes GAMS rattachés.
a- Le SAMEAS
Il arrive souvent qu’on veuille effectuer des calculs conditionnés par des ensemblistes, souvent pour des
relations particulières (exemple ∑ஷ ݔs’écrit sum (i $[not sameas (i,’j’)], x(i,j)). La syntaxe générale de
sameas est du type suivant : sameas (élément considéré de l’ensemble, autre élément de l’ensemble) ou
alors sameas(élément considéré de l’ensemble, ’texte’). Et cette expression renvoie une valeur qui est
vraie si le texte d’écriture de élément considéré de l’ensemble est identique à celui de autre élément de
l’ensemble et fausse sinon.
4
Equation qui ne peut être obtenue par une combinaison linéaire des autres
Page 48 sur 86 M. Hervé GUENE, Ingénieur Statisticien-Economiste; E-mail: hguene@[Link]
Support de Cours GAMS 2009
Exemple
b- Le DIAG
Exemple
En français ces operateurs sont appelés respectivement opérateurs retard et avance. Ils sont utilisés
pour lier chaque élément d’un ensemble ordonné avec celui qui le précède ou celui qui le devance.
GAMS a deux variantes d’opérateurs avance et retard :
La différence entre ces deux types de retard et avance réside dans la procédure d’étapes initiale et
finale. Dans le cas des opérateurs lag et lead circulaires, après le dernier le dernier élément de
l’ensemble alors suit le premier élément, et le comptage recommence, il est infini ; alors qu’avec
l’opérateur lag/lead linéaire, après le dernier, le comptage est fini, il s’arrête donc.
Ce qui suit est un ramassis d’équations quelque complexes, tout juste pour établir une analogie entre la
transcription d’écritures des équations mathématiques et le langage GAMS. Les caractères entre
parenthèses sont des indices. Par exemple la consommation du ménage qu’on peut noter Ci s’écrit c(i) où
l’ensemble i a été précédemment spécifié dans le code GAMS.
p i 1 cgi c ih
i I gGS
ph h H
p i 1
qgi c ih
i I gGS
GAMS: P(H) =E= SUM(I, P(I) * ( 1 + SUM(GS, TAUC(GS,I) ) ) * CH(I,H) ) / SUM(I, P0(I) * ( 1 +
SUM(GS, TAUQ(GS,I) ) ) * CH(I,H) );
Description: Les indices de prix à la consommation pour chaque type de ménage (l’ensemble H qui
contient le ménage h) sont calculés en prenant la valeur 100 pour l’année de base. H et
l’ensemble des ménages.
hf a w
y h= h
y f 1
h
gf h H
Ff hf a wh
gGF
hH
GAMS: Y(H) =E= SUM(F, A(H,F) * HW(H) / SUM(H1, A(H1,F) * HW(H1) ) * Y(F) * ( 1 - SUM(G,
TAUFH(G,F) ) ) );
Description: le revenu global du ménage est fonction de la rémunération des facteurs (la force de travail
offerte par chaque groupe de ménage) repartie aux ménages selon une distribution tenant
compte des types de ménages, c'est-à-dire les groupes socio-économiques.
y dh =y h t gh a wh ghh a h w hg a nh pchg h H
gG gG gG
GAMS: YD(H) =E= Y(H) - SUM(GI, PIT(GI,H) ) * HW(H) - SUM(G, TAUH(G,H) * HH(H) ) + SUM(G,
TP(H,G) * HN(H) * TPC(H,G) );
Description: Le revenu disponible des ménages est fonction du revenue global net des impôts et taxes et
des transferts reçus.
yd p
ih
p i 1 cgi
gGS
c ih c ih hd h
yh ph
i I,h H
i I
p i 1 qgi
gGS
GAMS: CH(I,H) =E= CH0(I,H) * ( ( YD(H) / YD0(H) ) / ( CPI(H) / CPI0(H) ) ) ** BETA(I,H) * PROD(J,
( ( P(J) * ( 1 + SUM(GS, TAUC(GS,J) ) ) ) / ( P0(J) * ( 1 + SUM(GS, TAUQ(GS,J) ) ) ) ) **
LAMBDA(J,I) );
Description: Cette fonction de demande est dérivée des fonctions de types AIDS (Almost Ideal Demand
System) qui est une forme fonctionnelle complète. Le seul inconvénient est que bon
nombre de paramètres sont difficiles à calculer. On assigne donc des valeurs arbitraires à
ces paramètres en fonction d’un jugement basé sur l’expérience. Très souvent on attribue
des élasticités revenu unitaires, on donne la valeur zéro aux élasticités prix croisé de la
demande et aux autres élasticités de la demande.
s h y dh c ih p i 1 cgi h H
i I gGS
GAMS: S(H) =E= YD(H) - SUM(I, P(I) * CH(I,H) * ( 1 + SUM(GS, TAUC(GS,I) ) ));
Description: c’est une fonction très simple d’épargne qu’on présente ici. Pour chaque ménage, l’épargne
est égale à la différence entre le revenu disponible et les dépenses du ménage. De ce fait il
n’existe aucune motivation à l’épargne pour les ménages, car le taux d’intérêt bancaire (qui
rémunère l’épargne) n’intervient pas dans cette fonction. Certains économistes préfèrent
intégrer la consommation inter temporelle dans la fonction d’épargne. Cette configuration
est appropriée pour un modèle national surtout si l’on veut ignorer les effets de
rémunération du capital et établir une relation entre l’épargne et l’investissement (et
Page 51 sur 86 M. Hervé GUENE, Ingénieur Statisticien-Economiste; E-mail: hguene@[Link]
Support de Cours GAMS 2009
p iva p di ii p i 1 giv i I
i I g GS
GAMS: PVA(I) =E= PD(I) - SUM(J, AD(J,I) * P(J) * ( 1 + SUM(GS, TAUV(GS,J) ) ) );
Description: cette équation et son membre de gauche est un calcul commode. Le prix domestique de la
valeur ajoutée, considéré comme rémunération des facteurs est calculé comme étant la
différence entre le prix de vente des outputs net des prix des consommations intermédiaires
(y compris les taxes à la vente et les taxes prélevées sur ces consommations
intermédiaires). Cela permet de simplifier la forme des équations de demande des facteurs.
Même si les consommations intermédiaires sont des parts fixes de l’output, leur cout
respectif n’entre pas directement dans le calcul du profit. Les consommations
intermédiaires ne sont pas substituables. De même elles ne sont pas substituables aux
facteurs.
Fonction de production
-1
i
i
q i i i u dfi i I
f F
GAMS: DS(I) =E= GAMMA(I) * SUM(F, ALPHA(F,I) * FD(F,I) ** ( - RHO(I) ) ) ** ( -1 / RHO(I) DS(I)
=E= GAMMA(I) * SUM(F, ALPHA(F,I) * FD(F,I) ** ( - RHO(I) ) ) ** ( -1 / RHO(I) );
Description: une fonction de production à élasticité de substitution constante est utilisée pour chaque
branche industrielle. Dans cette fonction, la quantité utilisée de chaque facteur et élevée à
une puissance et multipliée par un paramètre d’échelle. L’ensemble F est l’ensemble des
facteurs de productions ‘f’ est un membre de cet ensemble qui peut prendre la valeur ‘L’
pour le travail, ou ‘K’ pour le capital. Le total de ces produits est élevé à l’inverse de
l’exposant de substitution. Le premier paramètre est l’échelle de production. Très souvent
les valeurs de ces paramètres d’échelle sont imposées à partir d’informations sur la
littérature
Demande de facteurs
rfi rfa 1+
xfgi u dfi p iva q i if t i
i I, f F
gGF
vi= ii q i i I
i I
IV-3 COMMERCE
Demande d’exportation
ei
e i e i p di p iw 1
m
gi
i I
gG
domestique et mondiaux, il existe toujours un niveau d’exportation non nul qu’on pourrait
qualifier d’autonome.
Demande d’importation
mi 1 d i xi i I
GAMS: M(I) =E= ( 1 - D(I) ) * DD(I);
Description: Les Importations sont une proportion (1-di) de la consommation domestique et représentent
dans cette consommation domestique la part qui n’est pas produite par les entreprises
domestiques.
IV-4 INVESTISSEMENT
Investissement global brut par secteur de destination
i
rKi 1
gG
xKgi u Ki t i
n i ni i I
rKi 1
gG
Kgi u Ki t i
GAMS: N(I) =E= N0(I) * ( ( R('K',I) * ( 1 - SUM(GK, TAUFX(GK,'K',I) ) ) * KS(I) + SUM(G,
FITC('K',G) * ITC(I) ) ) / ( R0('K',I) * ( 1 - SUM(GK, TAUF(GK,'K',I) ) ) * KS(I) + SUM(G,
FITC('K',G) * ITC0(I) ) ) ) ** ETAIX ;
Description: les décisions d’investissement se prennent secteur par secteur en fonction des changements
nominaux, après les rémunérations de la taxe sur le capital dans chaque secteur.
p i 1
n
gi c
in ij n i i I
gGS jI
STOCK DE CAPITAL
u sKi u sKi 1 i +n i i I
GAMS: KS(I) =E= KS0(I) * ( 1 - DEPR ) + N(I) ;
Description: le stock de Capital est égal au stock courant de capital déprécié, plus l’investissement brut.
in'i
ti n i i 'i 1 i I
i 'I gin'
gGS
L’offre de travail
wh
h
PIT w h g
LS
t gh
aw aw ra gG p h
h
h
h La gGI h H
w hg
ah a h rL
t gh
gGI
gG p h
GAMS: HW(H) / HH(H) =E= HW0(H) / HH0(H) * ( ( RA('L') / RA0('L') ) / ( CPI(H) / CPI0(H) ) ) **
ETARA(H) * ( SUM(GI, PIT(GI,H) ) / SUM(GI, PIT0(GI,H) ) ) ** ETAPIT(H) * ( SUM(G,
TP(H,G) / CPI(H) ) / SUM(G, TP0(H,G) / CPI0(H) ) ) ** ETATP(H);
Description: L’offre de travail est exprimée en termes de taux de participation: le nombre de ménages
travailleurs divisé par le nombre total de ménages dans une classe de ménages possédant un certain
revenu. C’est une fonction du taux de participation initial multiplié par trois facteurs: la variation
du taux de salaire, la variation du revenu moyen des ménages et les variations du transfert moyen
reçus par les ménages non travailleurs. On suppose que chaque ménage est lié à un ensemble
d’élasticités constantes qui varie d’un ménage à l’autre. Les ménages qui possèdent de grands
revenus ont des élasticités plus grandes relativement aux salaires et aux taxes, mais faibles en
termes de transferts reçus (car ces ménages reçoivent très peu ou pas de transferts). Les ménages à
faibles revenus ont des élasticités plus faibles relativement aux salaires et aux taxes, mais élevées
en termes de transferts reçus (car ces ménages reçoivent beaucoup de transferts).
a nh a h a w
h h H
GAMS: HN(H) =E= HH(H) - HW(H);
Description: Le nombre de ménages sans emploi est simplement égale au nombre total de ménages dans la
population moins celui de ménages travailleurs.
IV-6 TAXATION
Taxes sur les ménages
y
b i m c
t gh gh wh dgh sgh ogh
a h
gg
gh gh gh gh g GI, h H
t
g'
IV-7 ETAT
Revenu de l’état
yg= qgi
x
vi pi gi
m
mi piw qgi
x
cih pi qgi
x
cin pi + qgi
x
cig pi
iI iI i I h H i I i I g G
gi
x
rfi rfa udfi gi
x
rfg rfa udfg + hf yf
iI f F g G f F h H
hhga h t gha wh gn - t i g G
h H h H iI CABAC
GAMS: Y(G) =E= SUM(I, TAUV(G,I) * V(I) * P(I) ) + SUM(I, TAUM(G,I) * M(I) * PW0(I) ) +
SUM((H,I), TAUC(G,I) * CH(I,H) * P(I) ) + SUM(I, TAUN(G,I) * CN(I) * P(I) ) + SUM((G1,I),
TAUG(G,I) * CG(I,G1) * P(I) ) + SUM((F,I), TAUFX(G,F,I) * RA(F) * R(F,I) * FD(F,I) ) +
SUM((F,G1), TAUFX(G,F,G1) * RA(F) * R(F,G1) * FD(F,G1) ) + SUM(F, TAUFH(G,F) * Y(F) )
+ SUM(H, PIT(G,H) * HW(H) ) + SUM(H, TAUH(G,H) * HH(H) ) + SAM(G,'INVES') -
SUM((I,F), FITC(F,G) * ITC(I) );
Description: le revenu de l’état est la somme des taxes sur les ventes collectées sur la consommation domestique
(intermédiaires, importations, consommation des ménages, investissement), plus les taxes sur la
rémunération des facteurs, plus les taxes collectées sur les ménages (taxes sur le revenu,
domaniales), moins les taux de crédit à l’investissement.
Épargne de l’état
sg yg cig pi 1 gig u dfg rfg rfa 1 xfgi whg ahg hg bg'g + bgg'
n pc
g G
iI gGS f F gGF hH g 'G g 'G
GAMS: S(G) =E= Y(G) - SUM(I, CG(I,G) * P(I) * ( 1 + SUM(GS, TAUG(GS,I) ) ) ) - SUM(F, FD(F,G) *
R(F,G) * RA(F) * ( 1 + SUM(GF, TAUFX(GF,F,G))) ) - SUM(H, TP(H,G) * HN(H) * TPC(H,G) )
- SUM(G1, IGT(G1,G) ) + SUM(G1, IGT(G,G1) );
c ig c ig i I,g GX
u dfg u fg
d
f F,g GX
rfa rfa f F
GAMS: [Link]('K') = RA0('K');
Description: Comme les entreprises prennent leurs décisions d’investissement sur la base des variations de la
rentabilité du capital, alors l’on va fixer la valeur de cette rentabilité du capital pour l’économie
entière.
exogeneisation du montant des transferts
w hg w hg h H,g GWX
Sous GAMS, il ce qu’on appelle l’appel des fichiers externes et la sortie de fichiers externes en d’autres
formats (xls, mdb,…) qui se fiat avec les commandes $include, $batinclude, $sysinclude, $call, gdxi, gdxo
… que nous n’exposerons pas ici. On va se limiter à l’utilisation de la puissante commande gdx qui est
largement suffisante, car les autres commandes précédemment citées sont bonnes pour des étapes
supérieures ; et comme nous sommes en intro, allons donc à l’essentiel.
Execute_unload ‘nom que je veux donner à mon fichier [Link]’ variables à mettre en relief séparées
d’une virgule et point virgule à la fin.
Gdx= nom que je veux [Link] et on tape F9 ou entrée, exemple : Gdx= [Link]
Le fichier gdx de mon modèle est ainsi créé automatique dans gamsdir/projdir et je peux le récupérer
pour le convertir en d’autres formats (Excel, Access, html, sql,…) ou faire des graphiques directement
sous GAMS pour comparer des scénarios, des effets de politique, l’évolution des variables dynamiques,…
Après avoir crée le fichier gdx, on peut lister les variables dans le gdxviewer, i-e le visualiseur de fichiers
gdx, en tapant toujours dans le code GAMS à la fin execute '= nom que je veux [Link] ' ;
Pour faire un graphique sous gams, il suffit de charger les résultats dans un fichier gdx en écrivant la
commande execute_unload et créer le fichier gdx qu’on veut.
Ensuite, ouvrir le fichier gdx créé dans le Gmasdir/projdir puis faire un clic droit sur l’item que l’on veut
représenter graphiquement. Ensuite faire un cliquer sur ‘chart’ + ‘one dimension’ + ‘line chart’. (Pour une
application concrète évoquer et présenter les codes [Link], dyn1_mcp.gms, [Link],
[Link] et ressource_renouvelables.gms)
Question: je voudrais créer un fichier gdx qui fasse apparaitre tous les ensembles, les paramètres et
scalaires de mon modèle, mais je ne veux voir apparaitre aucune équation ni variable dans ce fichier gdx.
Si vous avez tapé 'execute_unload “nom que je choisis de [Link]”;' comme étant la dernière ligne de
votre programme, GAMS va tout exporter (y compris les variables et les équations) dans le fichier gdx
nom que je choisis de [Link] (exactement comme la ligne de commande parameter
'gdx=…').
Alors pour éviter les variables/équations, ajoutez l’option 'option clear=var1, clear=var2, …, clear=equ1,
clear=equ2,…;' comme dernière ligne de votre programme. C’est concis et précis.
Pour exporter des données au format des autres logiciels, créez d’abord votre fichier gdx (qui signifie
GAMS data exchange pour échange de données GAMS; on peut l’utiliser pour échanger des données
entre GAMS et les autres logiciels et langages tels que Access, Excel, SQL,…). Après avoir crée le fichier
on peut l’ouvrir à partir de GAMS. La seule infirmation utile est qu’il porte l’extension .gdx et non .gms.
En ouvrant le fichier. gdx on peut faire des graphiques directement sous GAMS pour comparer des
scénarios précédemment écrits dans le code gms et transcrits en format gdx, ou observer l’évolution des
variables dans le temps. Ces graphiques sont crées sous GAMS. Mais avec le gdxviewer, c'est-à-dire si
vous avez tapé la commande concernant le gdxviewer dans votre code GAMS, le gdxviewer apparait
automatiquement, et on peut faire les observations et comparaisons directement. Par exemple pour ce qui
est du fichier [Link], pour visualiser l’évolution du stock de capital dans le temps et observer l’écart
entre la solution analytique et la solution numérique, ouvrir le fichier gdx associé (en l’occurrence
[Link]) ensuite faire un clique droit sur compare qui est un paramètre défini dans le code GAMS pour
comparer les solutions analytique et numérique d’évolution de la consommation (c) et du stock de
Page 58 sur 86 M. Hervé GUENE, Ingénieur Statisticien-Economiste; E-mail: hguene@[Link]
Support de Cours GAMS 2009
capital (k); puis clique gauche sur chart, puis sur 2dimnesions, puis sur 2d chart et enfin sur multi line et
on obtient le graphique suivant :
Pour utiliser ces résultats avec d’autres logiciels on utilisera toujours le fichier gdx créé. Pour ceux qui ont
utilisé le gdxviewer, cliquer droit sur l’item que l’on veut exporter (ça peut être un paramètre, une
variable, un ensemble, un ensemble de variables, d’ensembles…) puis sur export, puis choisissez le format
de sortie du fichier comme le montre la figure suivante :
Au stade actuel, le seul logiciel statistique formel avec lequel GAMS interface sans moins de difficultés
est Matlab et un peu STATA. Pour interfacer GAMS avec SPSS ou SAS, il faut exporter les données en
format Excel et ensuite les envoyer sous SPSS, SAS ou STATA, ou même Matlab pourquoi pas.
V-2 Importer des données dans GAMS depuis les autres logiciels
C’est ce qu’on appelle l’appel des fichiers externes. Très souvent on doit manipuler de grands ensembles
de données, par exemple des données contenues dans des feuilles calcul Excel ou dans de grosses bases de
données. Avec GAMS, il est possible d’utiliser ces fichiers sans les coller dans le code GAMS. Il suffit
d’écrire une commande simple dans le code pour appeler ces fichiers et GAMS fera le travail en arrière
plan. L’objectif de cette astuce est de simplifier le code qu’on écrit pour qu’il soit très facile à comprendre
et lisible. Faire des présentations guidées à l’aide d’exemples concrets : on ne peut pas tout écrire.
Détailler l’utilisation du dollar ($).
Autrement, on peut aussi taper la commande suivante dans notre code GAMS pour appeler directement
xls2gms directement dans GAMS plutôt que de double cliquer sur [Link]. Dans ce cas on spécifiera
tous les paramètres (input file sera écrit i=, range s’écrit r= et output s’écrit o=) en une ligne de commande
comme suit : $call = xls2gms I=“C:\[Link]” R=feuil1!B1:E10 O=“C:\[Link]” .
Autre exemple: $call =xls2gms r=a3:a4 i=[Link] o=[Link]. Ensuite, après avoir converti donc le
fichier externe en un format exploitable par GAMS il faut l’inclure comme partie intégrante du code en
écrivant simplement : $include [Link]
On peut donc utiliser tous les ensembles, sous ensembles et éléments de [Link].
Récapitulons donc a travers le graphique suivant :
- Importer seulement certaines colonnes d’une feuille de calcul Excel dans GAMS
Quelques fois l’on a besoin d’importer certaines colonnes d’une feuille de calcul dans GAMS. Pour cela il
faut écrire un code GAMS pour le faire. En voici un exemple:
- Le moyen le plus simple d’importer des données sous GAMS est de l’importer de manière brute et
de faire tout le reste du travail dans GAMS.
- set p /'p=1'*'p=50'/;
- parameter rawdata(p,*) 'la feuille de calcul entière'
- $call"=gdxxrw i=testdaten_GAMS.xls o=[Link] par=A rng=Tabelle1!a2"
- $gdxin data
- $load rawdata=A
- display rawdata
b- De Matlab à GAMS
D’abord vous devez avoir déjà installé GAMS et MATLAB sur votre ordinateur. On suppose que les
répertoires d’installation des deux logiciels sont respectivement C:\MATLAB et C\GAMS.
Il vous faut ensuite une application (c’est un petit dossier contenant des fichiers, me rappeler pour que
je vous le donne). Il se nomme [Link].
1. Copier [Link] dans C : \ gams\inclib\[Link]
2. Copier [Link] dans C : \ matlab\toolbox\local\[Link]
3. Fixer le chemin d’accès à gamside
Pour vérifier que vous avez réussi l’installation, effectuer les étapes suivantes:
1. lancer matlab
2. dans la fenêtre de commande matlab, envoyer les répertoires dans le répertoire des exemples
fournis par matlab. Ce dernier répertoire contient deux fichiers testint.m et [Link] qui requis
pour ce test
3. lancer le ‘testint’ que vous verrez dans le répertoire des exemples de la distribution (i-e c’est déjà
incorporé dans matlab). Pour ce faire, saisir seulement dans matlab :
Remarque
Pour lancer le même modèle dans matlab et renvoyer les valeurs du vecteur solution x(i) et du paramètre
d(i,j) dans l’environnement de travail de matlab, l’on doit opérer un changement dans le fichier GAMS,
consistant à ajouter les lignes ci-dessous en dessous du solve:
Cette dernière commande permet juste d’écrire la valeur de la solution dans un fichier que matlab peut
lire. Ensuite dans Matlab on exécute simplement la ligne suivante :
[x d]=gams(‘nom du fichier gams’) ;
a- Définition Basique
Pour crée une macro, voici l’approche basique à faire dans GAMS
$macro nom (arg1, arg3, arg2,..) corps de la macro et ce que c’est que arg1,..
Le nom de la macro doit être unique, de façon similaire aux autres types de données GAMS telles que set
et parameter. Exemple:
On peut appeler cette macro doublement en l’utilisant avec deux arguments différents.
z = 1/x1 +1/x2;
Puisque GAMS reconnait unsur(x1) comme étant une macro et remplace x1 (l’argument dans
unsur(x1)) pour y (dans la définition originale de la macro unsur (y)) et fais la même chose pour x2.
En rappel l’argument utilise dans la macro(y) n’est qu’un symbole et peut dupliquer le nom pour d’autres
items dans le code. Par exemple la macro pourrait être définie comme suit :
Même si x1 est un scalaire, c'est-à-dire nommé dans la commande scalar dans le code.
Les macros peuvent avoir plusieurs arguments. Dans ces cas, il faut séparer ces arguments par des
virgules. Par exemple créons une macro qu’on nommera ‘ratio’ qui calcule le rapport entre deux nombres.
Cela se fait comme suit :
La macro ratio précédemment définie a été écrite sur une seule ligne. Mais on peut concevoir une macro
sur plusieurs lignes. Exemple :
Qui peut être appelée avec z = addition(j,a1,x1); et qui signifie que: z = sum(j,a1(j)*x1);
Les multiples paires de parenthèses et les guillemets peuvent être utilisés librement de sorte à protéger la
virgule séparatrice.
D’une manière générale voici comment on peut écrire une macro multi line
$macro myMacro
if (a = 1) then
faire ce que je veux;
else
faire autre chose;
endif;
La reconnaissance des macros et l’expansion des arguments peuvent être encore mieux contrôlées par
l’utilisation des ampersands (&) dans le corps de la macro. Ordinairement La macro va seulement
substituer les mots entiers
equh(f(i))
ce qui va s’épandre pour devenir equation equ_q(i); equ_q(i).. sum(j, x(i,j)) =e= 0;
Cela contient q dans un nombre d’autres positions. Celui qui veut remplacer certains d’entre eux pourrait
le faire.
equ2(1,(i),f2(x,i))
equ2(2,(k),f2(r,k))
d('"(zz"')
z=ss('sum(j,a1(j)');
z=ss('prod(j,a1(j)');
où les expressions d contiennent des guillemets, des espaces et virgules et l’expression ss a des
parenthèses non closes entre les guillemets.
Lorsqu’on développe, on obtient
display "(zz";
z=sum(j,a1(j));
z=prod(j,a1(j));
Le résultat de Nested macro peut être étendu jusqu’à longueur infinie. Par exemple:
$ macro a b,a
display a;
display b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,……
GAMS éventuellement refusera de faire plus de substitutions que possible et présentera une erreur de
compilation.
Une autre astuce des macros est l’utilisation implicite du suffixe .L dans l’écriture d’un rapport ainsi que
les autres types de déclarations de manipulation des données. Cela permet d’utiliser la même algèbre dans
la définition des modèles et la déclaration des variables, des ensembles et paramètres. Le code suivant en
est une illustration ([Link])
$onDotL
tsupply(i)=sumit(j, x(i,j));
tdemand(j)=sumit(i, x(i,j));
ce qui deviendra:
tsupply(i)=sum(j,x.L(i,j));
tdemand(j)=sum(i,x.L(i,j));
Le $ondotl choisit implicitement le suffixe .L pour les variables. Cette astuce a été introduite pour rendre
les macros utiles et ne se limite pas à être utilisée dans le corps de la macro. Comme c’est une nouvelle
balise, elle doit être activée. Le $offdotl permet de la désactiver.
Autres notes
L’on peut utiliser les opérateurs avance et retard (lag and lead operator du chapitre 13.4 dans le GAMS
User's Guide) comme suit:
display iconseq;
variable x(i);
equation e(i);
e(i).. sum(iconseq(i,j), x(i)) =l= 10;
Si vous voulez faire une somme circulaire dans le terme “consécutif” de la contrainte, il faudra remplacer
le + qui est dans l’expression loop par ++.
Ce genre de gymnastique arrive souvent lorsqu’on écrit un MEGC. Je suis en train d’implémenter un modèle .gms
de sorte que :
- Etape1 : une variable x est endogène. J’exécute le modèle et j’obtiens la valeur optimale de x
- Etape2: la valeur optimale de x est exogène de sorte à ce que je puisse l’utiliser pour calculer la valeur
optimale d’un variable y.
Donc après le solve qui permet de calculer la valeur optimale de la variable X, on ajoute la ligne suivante:
[Link] = X.l ;
et x est donc fixé à sa valeur d’optimum. On peut l’utiliser pour faire ce qu’on veut. C’est le suffixe .fx qui permet
de l’exogénéiser. Et le .l qui signifie level permet de fixer cette valeur de x à sa valeur calculée. Si je veux la libérer
encore, je dois ramener les bornes supérieures et inférieures à leurs valeurs de départ.
Par exemple :
[Link]=-inf ; [Link]=+inf;
Q: je voudrais diviser mon modèle en trois parties indépendantes sans toutefois écrire chaque variable et
chaque équation trois fois.
La Section 9 du GAMS User's Guide explique la syntaxe de déclaration d’un model. Si vous voulez
déclarer plusieurs modèles indépendants vous pouvez aussi utiliser la syntaxe étendue suivante:
Maintenant on déclare un modèle basique qui ne contient que les équations communes:
Pour chaque modèle Independent, on déclare tout juste un nom différent, et qui contient le modèle basique
et le(s) équation(s) additionnelle(s):
set i / i1*i10 /,
j / j1*j10 /,
i_u_j / set.i, set.j /;
display i_u_j;
Le problème est que i et j doivent être disjoints. Autrement on aura une erreur de compilation de type
redefined element si on définit i_u_j. De plus, i et j ne sont pas des sous ensembles de i_u_j. le code
suivant va rencontrer une compilation error:
set i / i1*i10 /,
j / j1*j10, i5 /,
i_u_j / set.i, set.j /;
display i_u_j;
Comment spécifier une condition de sorte à éviter une 'division by zero' error ou encore
erreur de division par zéro?
Il y a des subtilités à gérer lorsqu’on utilise EPS (epsilon) et zéro tolérance, mais une syntaxe comme celle
ci devrait marcher
c(i) = 0;
c(i)$a(i) = b(i)/a(i);
c(i)$[not a(i)] = 0;
il serait plus clair d’annuler c d’abord. Ensuite, en fonction de la manière dont c est déclare, ce serait plus
rapide aussi, si vous faites
Cette dernière méthode ressemble un peu à celle d’en haut à l’excepté là où a(i) a la valeur epsilon (EPS).
EPS est une valeur insérée (donc $a(i) est vraie) mais a la valeur 0, si bien qu’on aura une erreur de
division par zéro si on n’explicite pas que c’est pour a(i) <> 0.
GAMS, n’insère pas votre dans une base de données interne, mais plutôt en tant que fichier ASCII ou
binaire par défaut. Ce fichier peu être protégé en utilisant les options de sécurité offertes par votre système
d’exploitation.
Supposons que plusieurs utilisateurs aient accès à une même machine, et donc à votre modèle, et font des
compilations et en utilisent les résultats. Si vous ne voulez pas que ces derniers puissant observer ou
modifier la structure ou l’algèbre du modèle, vous pouvez le faire avec les commandes “Save et Restart”.
L’information la plus importante à savoir est que ce modèle sera précompilé et ne sera ré exécuté qu’à
partir de sa forme précompilée.
Voici un exemple, qui explique comment on peut appliquer cela. On a deux modèles privé.gms et
[Link], où [Link] contient la partie secrète de votre modèle et [Link] contient les données
qu’on peut accepter aux autre de voir:
* [Link]
$phantom foo
$onempty
set i / foo /;
parameter c(i) / foo 0 /, w(i) / foo 0 /;
scalar rhs /0/;
model kn /all/;
set s / foo /;
loop(s,
c(i) = uniform(0.9,1.1)*c(i);
solve kn max z using mip;
);
* [Link]
$onmulti
set i / i1*i5 /;
parameter c(i) / i1 1, i2 2, i3 3, i4 4, i5 5 /
w(i) / i1 5, i2 4, i3 3, i4 2, i5 1 /
scalar rhs /8/;
set s /s1*s2/;
à present exécutez [Link] comme suit: gams [Link] a=c s=0. L’output sera un fichier
précompilé 0.g00, humainement illisible. A présent on peut supprimer [Link] (revenir en arrière
d’abord) et exécuter [Link] ensemble avec 0.g00 en utilisant: gams public r=0.
Jetez un coup d’œil dans l’annexe F (The Save and Restart Feature) du GAMS User's Guide pour de plus
amples informations.
Les versions de GAMS à partir de la 22.4 permettent de faire cela. Jetez un coup d’œil dans l’annexe I
(Compressed and Encrypted Input Files) du GAMS User's Guide pour de plus amples informations.
Seul l’opérateur Ord() permet de travailler sur les ensembles ordonnés. Les ensembles introduits bien
avant l’avènement de cette commande ne sont pas ordonnés. Voici un exemple qui permet d’obtenir un
ensemble ordonne a partir d’un ensemble non ordonné.
Note: les fonctions sameas, .pos, et .val seront aussi utiles si l’ensemble n’est pas ordonné.
* j n'est pas ordonné puisque UEL (unique élément) '0' qui est le premier élément de
* ça ça ne fonctionne pas
* ordj(j) = ord(j);
premier_j(j) = ordj(j) = 1;
alias (*,u);
* Au cas où vous voulez obtenir l'ordre actuel, la syntaxe suivante vous le donne
premier_j(j) = ordj(j) = 1;
Output:
...
---- 21 SET premier_j premier element de j
Q: pendant une programmation non linéaire, on a besoin du multiplicateur de Lagrange des Contraintes.
Il est possible d’obtenir la valeur de ce multiplicateur.
Le multiplicateur de Lagrange, connu souvent sous le nom de marginals dans GAMS, peut être obtenu
après un solve de la manière suivante: Supposons que la contrainte d’intérêt est CON(j,k) et on veut fixer
lamda(j,k)à sa valeur marginale après le solve. Donc, écrire quelque part après le solve:
lamda(j,k) = CON.M(j,k) ;
J’ai rencontré un problème d’indice sur un paramètre. Je voudrais calculer B(m)= A(i,j,k) + C(i,j,k) où
m = i+4*(j-1)+ 8*(k-1) donne une valeur unique pour chaque (i,j,k) à m.
si i,j,k, et m sont des ensembles ordonnés de sorte que l’opérateur ord() puisse être utilisé, une
possibilité de 'linéarisation' des matrices A et C peut être formulée à l’aide d’une somme (SUM) pour
contrôler les ensembles i,j,k. Le SUM est effectué sur un seul opérande. Voici les détails:
sets i /1*5/
j /1*4/
k /1*8/
m /1*160/;
parameter
A(i,j,k)
B(m)
C(i,j,k);
B(m) = sum((i,j,k)$(ord(m)=(ord(i)+4*(ord(j)-1)+8*(ord(k)-1))),
A(i,j,k) + C(i,j,k));
display A,C,B;
* Exemple qui nous montre comment énumérer tous les sous ensembles possibles d’un
* ensemble
sets
I / i1 * i3 /,
J / j1 * j2/,
IJ(I,J),
cnt / 1 * 9999 /;
scalars M, N, pMN, k, l;
M = card(I);
N = card(J);
pMN = power(2,(M*N));
abort$(card(cnt) lt pMN) "cnt set is too small";
1. Explorer le GAMS mailing list archive; il contient beaucoup d’astuces utiles (y compris celles que nous
exposerons ci-bas): [Link] fournit un résumé des
principaux thèmes abordés, et le fichier complet peut être visité et/ou téléchargé à l’adresse suivante :
[Link]
2. GAMS est fourni avec une bibliothèque de plus de 160 modèles comme précédemment spécifié; jeter un
coup d’œil dans cette bibliothèque lorsque vous écrivez votre propre modèle (pour accéder à la
bibliothèque, cliquer sur l’onglet model libraries du gamside ou dans dossier MODLIB ou encore sur la
page d’accueil de GAMS).
3. D’abord résolvez un modèle qui ne fait aucune itération dans le but de savoir si le paquet (i.e. la base de
données que vous avez inséré) est répliqué par le modèle. Cela permet de s’assurer qu’on n’a pas d’erreur
de compilation/calibrage dans le modèle.
<nom du modèle>.iterlim = 0;
4. Utilisez l’instruction abort si votre spécification du modèle est incorrecte; ce genre de situation apparait
lorsqu’on finit avec une solution qui ne satisfait pas indument certaines conditions; par exemple, si la
référence ne se réplique pas, l’on peut utiliser:
Ou alors au cas où l’on sait (par la loi de Walras) que la valeur de la variable C2 doit égaler celle de X2:
5. S’assurer toujours que votre modèle a été normalement compilé et a pu calculer une solution optimale:
Page 75 sur 86 M. Hervé GUENE, Ingénieur Statisticien-Economiste; E-mail: hguene@[Link]
Support de Cours GAMS 2009
Les deux prendront la valeur 1 si le modèle est linéaire; et solvestat prendra la valeur 2 pour les
modèles non linéaires. On peut utiliser l’instruction abort si une ou deux des deux propositions est
incorrecte:
6. Donner des valeurs arbitraires de départ si vous avez des indices sur les ‘bonnes’ ou vraies valeurs d’une
variable. Entrez donc ces valeurs dans le programme GAMS. Cela permettra d’éviter des often-found
‘zero-solution’, ce qui signifie qu’un optimum est obtenu lorsque toutes les variables ont une valeur nulle.
Mieux, cela évite des infeasibilities, souvent abrégées sous GAMS (INFEAS ou INFEASIBLE).
Pour donner des valeurs initiales aux variables, écrire le nom de la variable, ajouter le suffixe ".L" et
ensuite spécifier les indices de cette variable (en rappel, ".L" doit être écrit avant ces indices5!):
VARIABLE X(J);
X.L(J) = 1;
X.L("1") = 2;
7. Si l’on veut insérer dans le code des commentaires qui prendront plusieurs lignes, utiliser les commandes
$ontext et $offtext. Il faut avoir pour habitude de résumer ce dont il est question dans notre code dès
le début de l’écriture du code comme suit:
$ontext
version: xx
date: dd-mm-yy
5
Ces indices peuvent être le temps t ou tout autre ensemble, exemple ct s’écrit c(t) et le niveau de consommation en l’an t s’écrira c.l(t)
Page 76 sur 86 M. Hervé GUENE, Ingénieur Statisticien-Economiste; E-mail: hguene@[Link]
Support de Cours GAMS 2009
caractéristiques: …
probleme1: aucun?!
$offtext
$ontext
En résumé
Ici on construit un MEGC 2x2x1 sous GAMS pour une économie simple avec les
caractéristiques suivantes:
-travail et capital sont mobiles entre les secteurs et sont fixés de manière exogène
-pas de gouvernement
-économie fermée
Notation conventionnelle:
-VARIABLES (et leur valeur initiale) et les noms des équations sont en lettre
majuscules
-les initiations des valeurs des variables et des paramètres sont indiqués par zéro
en plus de leurs noms
$offtext
8. On peut limiter la taille du listing (fichier .lst) en insérant les instructions suivantes:
$offsymxref
$offlisting
option limcol = 0;
option limrow = 0;
9. Lorsque vous fixez la valeur d’une variable ([Link] = …), n’oubliez pas de la libérer à nouveau:
[Link] = -inf;
[Link] = inf;
10. Lorsqu’on débogue un modèle, si on tape $exit sur une ligne, alors toutes les lignes en dessous
de ligne où $exit est tapé sont ignorées pendant les phases de compilation et d’exécution du modèle
11. En cas d’infeasibilities, il ya (au moins) trios choses que vous pouvez faire pour y pallier:
[Link] toutes les bornes supérieures (.up) et inferieures (.lo) et fixations (.fx) encombrantes du code;
2.Vérifier les valeurs de départ assignées aux variables et leur donner de meilleures valeurs;
[Link] les égalités en inégalités (il est toujours bon d’utiliser des inégalités au lieu d’égalités).
12. Apprendre à utiliser la notation vector au lieu de scalar; cela rend les modèles encore plus
compact:
Au lieu de:
VARIABLES Y1 Producer 1
Y2 Producer 2;
Pour deux secteurs, la différence n’est pas nette. Mais imaginons qu’on ait 60 secteurs ou plus. Il
est encore plus facile d’utiliser la notation vector dès le début, plutôt que scalar, car plus le nombre
d’écritures du modèle est petit, moins on a à écrire si l’on veut l’agrandir.
13. On peut utiliser des identifiants d’ensembles dans une instruction put:
set label de l’élément: <nom de l’ensemble>.tl (très utile dans les loop)
set texte de l’élément associé: <nom de l’ensemble>.te(index)
set texte associé: t: <nom de l’ensemble>.ts
Exemple:
set i commentaire sur l’ensemble i/i1 premier element, i2 second element, i3/;
put [Link] /;
i1 premier élément
i2 second élément
i3 I3
14. Pour avoir un bon aperçu des impacts des valeurs d’un paramètre sur les résultats du modèle (i.e.
une analyse de sensitivité), construire un loop de solves pour des valeurs différentes du paramètre; par
exemple:
SCALAR
Compte
faible /0.1/
forte /0.9/;
LOOP(CHAINE,
COMPTE = (ORD(CHAINE)-1)/(CARD(CHAINE)-1);
RESULTS(CHAINE) = …;
); DISPLAY RESULTS;
15. Comment obtenir des informations périodiques sur l’état d’avancement du travail et les valeurs
des paramètres/variables en temps réel sur votre écran pendant que GAMS exécute un modèle? Si vous
exécutez plusieurs simulations (ce qui signifie que vous faites un loop de plusieurs solves) vous pouvez:
display "%[Link]%/";
LOOP(t,
);
NB: ceci ne fonctionne pas correctement sur une plateforme Unix ou Windows NT.
Si vous utilisez le GAMS-IDE, rassurez vous que la fenêtre DOS est visible (en faisant d’abord
File / Options / Execute et choisir ‘Normal’ pour DOS window).
16. Si vous voulez présenter graphiquement les résultats d’un modèle tout juste après l’avoir résolu,
jetez un coup d’œil sur l’utilitaire gnuplot qui est disponible sur internet (on peut y accéder à partir de la
page d’accueil de GAMS) ; vous aurez à installer séparément cet utilitaire libre.
17. Bon nombre d’utilisateurs de GAMS connaissent la commande $include pour insérer des
morceaux de code GAMS, mais si l’on veut mettre un paramètre dans le fichier à inclure, utiliser la
commande $batinclude.
Et [Link] ressemblera à:
Pendant l’exécution du programme, "%1" sera automatiquement substitué par la "versionX". Dans
cet exemple un sous-répertoire ‘versionx’ sera crée et l’output en direction du fichier results sera
écrit dans le fichier ‘[Link]’ de ce sous-répertoire; finalement un ensemble contenant un seul
élément "versionx" est déclaré.
18. Si vous avez un model dont le calcul prend beaucoup de temps, alors songez à utiliser les
commandes save et restart. C’est très pratique quand on a résolu le modèle et qu’on cherche à bien
organiser l’output. Vous pouvez exécuter votre modèle, ensuite enregistrer (commande save) les fichiers
de travail puis relancer (commande restart) des simulations à partir de ces fichiers de travaux pour
manipuler les résultats plus facilement. Par exemple, si vous avez un fichier GAMS (nommé,
[Link]) dans lequel les données sont lues, les variables et équations sont spécifiées et votre
modèle est résolu, alors enregistrer les fichiers sous le nom model1. Pour ce faire, taper dans la ligne de
commande s=model1 puis entrée pendant que le fichier [Link] est ouvert. Ensuite, écrire le
code de manipulation du fichier output dans un autre fichier (disons, [Link]), en utilisant l’option
restart. Pour effectuer tout type de changement dans [Link], on n’a plus besoin de résoudre le
modèle à nouveau, il suffit d’inclure les fichiers de travail. Ceci peut être enregistré plusieurs fois (surtout
pour les grands modèles) et l’on peut simuler tout ce qu’on veut. Ces commandes de save et restart
peuvent être aussi utilisées dans d’autres circonstances, telles que l’enregistrement des résultats d’un
scenario de base, et l’enregistrement de plusieurs autres scénarios distincts dans d’autres fichiers output,
pourvu qu’à chaque fois on tape dans la ligne de commande r=model1 puis entrée pendant que le
fichier scénario_x.gms est ouvert; pour chaque fichier scénario_x.gms relatif à un scénario x
précis. Le code de l’exemple ci dessus ressemble à quelque chose du genre:
19. Depuis la version GAMS 2.50, on peut directement écrire dans un fichier Excel via les routines
XLimport, XLexport et XLdump; voir [Link] pour de plus
amples détails. Alternativement, l’on peut utiliser la commande put pour créer manuellement un fichier
output (voir le GAMS user guide pour de plus amples détails).
20. Quand on utilise les ensembles de données multidimensionnels dont un nombre restreints
d’éléments sont autorisés, on peut utiliser les ensembles dynamiques (dynamic set) ou cartographier les
ensembles (set mapping) pour limiter les éléments de l’ensemble. Le code suivant est un programme
GAMS complet qui présente le dynamic sets and mapping.
$offtext
sets
x /x1*x3/
y /y1*y4/
xx(x)
yy(y)
xy(x,y);
parameter
a(x,y) la base à partir de laquelle on récupère les éléments non nuls;
*Supposons qu’on connaisse les valeurs de a
a(x,y) = 1;
a('x1',y) = 0;
a('x2','y2') = 0;
a('x2','y3') = 0;
a('x2','y4') = 0;
a('x3','y2') = 0;
*Determination des ensembles dynamiques
xx(x) = yes$(sum(y, a(x,y)) ne 0);
yy(y) = yes$(sum(x, a(x,y)) ne 0);
xy(x,y) = yes$(a(x,y) ne 0);
* Le même ensemble dont les seuls éléments non nuls seront récupérés à travers
*le mapping
set yx(x,y) /x2.y1, x3.(y1,y3*y4)/;
display x,y,a,xx,yy,xy,yx;
parameter
b(x,y) l’ensemble entier y compris les zéros de a
c(x,y) paramètre b corrigé des éléments non-existants dans x
d(x,y) paramètre b corrigé des éléments non-existants dans y
Page 82 sur 86 M. Hervé GUENE, Ingénieur Statisticien-Economiste; E-mail: hguene@[Link]
Support de Cours GAMS 2009
21. Si l’on veut écrire une équation dans laquelle on divise le membre de droite par une autre
variable, on peut rencontrer des ‘division by zero’ errors. Par exemple, pour l’équation
Notons que la deuxième équation peut être seulement conditionnée par le paramètre a et non la
variable v1.
Dans ce cas ci, l’on peut résoudre cette erreur comme suit:
22. Si l’on veut construire un modèle multisectoriel d’Equilibre General Calculable, il faut penser à
utiliser le sous-système MPSGE de GAMS. Pour de plus amples détails consulter la page d’accueil de
GAMS, ou la page du ‘gourou de MPSGE’ Tom Rutherford, ou contacter Rob Dellink.
23. Un utilisateur de GAMS n’a pas correctement spécifié l’équation du capital le modèle néo-classique de
croissance comme suit :
Quelle est la différence entre ces deux scripts? L’impact est énorme. J’ai été surpris que la
première spécification n’ait pas donné un message d’erreur. La leçon à apprendre: faire toujours
attention aux parenthèses. Je les aime parce qu’elles obligent le modélisateur à penser de manière
précise à ce qu’il veut modéliser réellement.
24. Lorsqu’on modélise une équation contenant des opérateurs avance et retard par exemple
EQ1(t).. A(t+1) =E= A(t)+B(t);, et qu’on ne restreint pas cette équation, on calculera aussi
A(t+1) pour la dernière période t. Dès lors, la période suivant la dernière t n’est plus dans l’horizon du
modèle, et sa valeur ne nous intéresse guère. Pour donner donc la condition terminale de cette équation,
pour ne pas qu’elle nous calcule les valeurs au-delà de l’horizon temporel, il suffit de taper:
EQ1(t)$(ord(t) le card(t)-1).. A(t+1) =E= A(t)+B(t);
Ce type de notation est pertinent, surtout lorsque le modèle contient beaucoup d’item (ensembles,
equations, parameters,…) et les équations sont difficiles à écrire.
Utiliser l’approximation
L’erreur err(x) dans l’approximation ci-dessus est maximisée à 0 (le point de non différentiabilité), où
err(0) = epsilon. Comme x va de -∞ à +∞, alors, err(x) devient 0. On peut aussi reduire l’erreur maximale
à epsilon/2 en utilisant l’approximation ci-dessous. Elle fournit une meilleure approximation même si
l’égalité n’est plus juste au voisinage du point.
Comme min(x,0) = -max(-x,0), on peut utiliser l’approximation ci-dessus pour approximer min(x,0).
Epsilon est une petite constante positive.
6
En rappel, avec GAMS, il faut d’abord définir une équation, i-e lui donner un nom avant de la déclarer, i-e transcrire son expression
mathématique en langage GAMS. Voir exemple1 page 10
Page 84 sur 86 M. Hervé GUENE, Ingénieur Statisticien-Economiste; E-mail: hguene@[Link]
Support de Cours GAMS 2009
BIBLIOGRAPHIE
Arrow, K. J., et al. “Capital-Labor Substitution and Economic Efficiency.” Review of Economics and Statistics
63(1961): 225-250.
Berndt, E., and D. Wood. “Technology, prices and the Derived Demand for Energy.” Review of Economics and
Statistics 57(1975): 655-676.
Chung, J. “On the Estimation of Factor Substitution in the Translog Model.” Review of Economics and Statistics 64,
no. 3(1987): 409-417.
Dhrymes, P., and P. Zarembka. “Elasticities of Substitution for Two-Digit Manufacturing Industries: A
Correction.” Review of Economics and Statistics 52, no. 1(1970): 115-117.
Field, B. C., and C. Grebenstein. “Capital-Energy Substitution in U.S. Manufacturing.” Review of Economics and
Statistics 62(1980): 207-212.
Fishelson, G. “The Elasticity of Factor Substitution in Cross-Section Production Functions.” Review of Economics
and Statistics 61, no. 3(1979): 432-436.
Griliches, Z. (1967) Production Functions in Manufacturing: Some Preliminary Results, in The Theory of Empirical
Analysis of Production, ed. M. Brown. New York, National Bureau of Economic Research and
Columbia University Press.
Hazilla, M., and R. Kopp. “Industrial Energy Substitution: Econometric Analysis of U.S. Data, 1958-1974.” Final
Report. Electric Power Research Institute, Palo Alto, CA, 1984.
Rob Dellink Juan-Carlos Altamirano-Cabrera, Kelly de Bruin, Ekko van Ierland, Carol Phua, Arjan Ruijs,
Erik Schmieman, Judit Szõnyi, Frank Vöhringer and Xueqin Zhu GAMS for
environmental-economic modelling (2009)
Rutherford Thomas and Laurent Cretegny(2004) Worked exammples with dynamic optimization:
Analytic and Numeric method
Zarembka, P. “On the Empirical Relevance of the CES Production Function.” Review of Economics and Statistics
52, no. 1(1970): 47-53.