* fichier : excel1.dgibi
opti echo 0;
* excel1.dgibi
*
* deux methode sont proposees dans l'opérateur exce :
* la methode standard ( minimisation convexe) avec t0 = 0.6;
* la methode move limite;
* on trace aussi sur une grille la valeur de la fonction et la
* condition
*
* min de ((X1 - mx1)*(X1-mx1)/sx1/sx1 +
* (X2 - mx2)*(X2-mx2)/sx2/sx2)**0.5)
*
* sachant que X1 -X2/A =<0
*
mess ' fichier de donnees : excel1.dgibi';
graph = faux;
xx1 = 10.;
xx2 = 10.;
*
* donnée des constantes
*
mx1=272.72; sx1=16.36;
mx2=70.; sx2=15.;
A=0.42;
*
* petite procedur pour calculer les conditions et les derivees
* les inconnues X1 et X2 sont dans la table tvx0
debproc intmci tmci txv0;
tmci . 0 = txv0 . 1 - ( txv0 . 2 / A);
tmci . 1 = 1.;
tmci . 2 = -1./ A;
finproc;
*
* procedur pour calculer la fonction et ses derivees
* les inconnues X1 et X2 sont dans la table tvx0
*
debpro intvf tvf*table tvx0*table;
xx = ( tvx0 . 1 - mx1 )*( tvx0 . 1 - mx1 ) /sx1 /sx1
+( ( tvx0 . 2 - mx2 )*( tvx0 . 2 - mx2 ) /sx2 /sx2);
yy = 2. * ( tvx0 . 1 - mx1 )/ SX1/SX1;
zz = 2. * ( tvx0 . 2 - mx2 )/ SX2 / sx2;
tvf . 0 = xx ** 0.5;
tvf . 1 = 0.5 * yy / tvf . 0;
tvf. 2 = zz * 0.5 / tvf . 0;
finproc;
* traitement annexe
* calcul de la fonction,de la condition et visualisation
* on regarde dans un interval predefini xdep-(xdep + nx*ax)
* ydep-( ydep + ny*ay)
opti dime 2 elem qua4;
ax = 5 ; ay = 3;xdep = 220; ydep = 80;
nx = 12; ny=15;
li = (xdep (xdep *a)) droi 1 ((nx*ax + xdep) ((nx*ax + xdep)*a));
pa = xdep ydep; pb = (nx*ax + xdep) ydep;
liab = pa droi nx pb;
su = liab trans ny ( 0 (ny*ay));
mtot = 0;
repe ii (nx + 1);
x = xdep + ( (&ii - 1) * ax);
repe jj ( ny + 1);
y = ydep + ( (&jj - 1) * ay);
pp = x y;
pp = point su proche pp ;
f = ( x - mx1 )*( x - mx1 ) /sx1 /sx1
+( ( y - mx2 )*( y - mx2 ) /sx2 /sx2);
f = f ** 0.5;
mm = manu chpo pp 1 'FFF' f nature diffus;
si ( mtot ega 0) ; mtit = mm;mtot = 1;
sinon; mtit = mtit et mm; finsi;
fin jj;
fin ii;
ch = chain 'CAS 1 -- XDEP: '
xdep ' DX: ' ax ' YDEP: ' ydep ' DY: ' ay;
titre ch;
si graph;
trac ( su et li) mtit;
finsi;
*
* fin du dessin de la fonction et debut de l'optimisation
* boucle pour les 2 methodes
repeter met 2;
ta = table;
* definition d'un point de depart
tvx0 = table vecteur;
tvx0.1 = xx1;
tvx0 . 2 = xx2;
*
* tvf contiendra la valeur de la fonction et les derivees
* calculées au point de depart
*
tvf = table vecteur;
*
* tmci contient la ieme condition et les derivees calculees
* au point de départ
*
tmc = table ; tmci=table vecteur; tmc . 1 = tmci;
*
* def de la valeur min des variables dans tvxmin
*
tvxmin = table vecteur;
tvxmin . 1 =1.;
tvxmin . 2 = 1.;
*
* def de la valeur max des variables dans tvxmax
*
tvxmax = table vecteur;
tvxmax. 1 = 1000.;
tvxmax . 2 = 1000.;
*
* definition des valeurs au second membre des conditions
*
tvcmax= table vecteur; tvcmax . 1 = 0.;
*
* choix de la méthode et remplissage de la table argument de exce
*
ta . mc = tmc;
ta.vxmin = tvxmin; ta . vxmax = tvxmax;
ta.vcmax = tvcmax;
si (ega &met 1) ;
ta . methode = sta; ta . t0 = 0.6;
titi = mot 'cas 1 methode sta';
sinon;
ta.methode = mov;
titi = mot 'cas 1 methode mov';
finsi;
* calcul de la fonction et de ses derivees
intvf tvf tvx0;
* calcul des conditions et de leurs dérivées
intmci tmci tvx0;
*
* preparation des listreel pour stocker les résultats
* intermediaires de la fonction est des variables
ff = prog tvf.0; x1 = prog tvx0.1; x2 = prog tvx0.2;
*
* boucle d'optimisation
*
repeter bouc 30;
* on remplit la partie changeante de ta
ta . vx0 = tvx0;
ta. vf = tvf;
ta . mc . 1 = tmci;
*
* appel à exce
*
ta = exce ta;
*
* recuperation des variables dans ta.VX0
tvx0 = ta . vx0;
* calcul de la fonction et des dérivées
intvf tvf tvx0;
* calcul des conditions et de leurs dérivées
intmci tmci tvx0;
* remplissage des listreels pour visualition des itérations
ff = ff et ( prog tvf.0);
x1 = x1 et ( prog tvx0 . 1);
x2 = x2 et ( prog tvx0 . 2);
fin bouc;
*
* visualisation des résultats
*
aa = dime ff;
ll = prog 0 pas 1 (aa - 1) ;
titre titi 'fonction :' ( extr ff ( dime ff));
ev1 = evol manu iteration ll ffff ff;
titre titi ' x1 final :'( extr x1 ( dime x1));
ev2 = evol manu iteration ll xxx1 x1;
ch = chain titi ' x2 final :'( extr x2 ( dime x2));
titre ch;
ev3 = evol manu iteration ll xxx2 x2;
si graph;
titre titi 'fonction :'( extr ff ( dime ff)) ;
dess ev1;
titre titi ' x1 final :' ( extr x1 ( dime x1)); dess ev2;
titre titi ' x2 final :' ( extr x2 ( dime x2));dess ev3;
finsi;
aa = ( extr ff ( dime ff));
si ((( aa - 2.6997) / 2.6997 ) > 0.001 );
mess ' on trouve aa au lieu de 2.6997 STOP';
erreur 5;
sinon;
message ' le cas test est correcte';
finsi;
fin met;
fin;
© Cast3M 2003 - All rights reserved.
Disclaimer