* fichier : excel1.dgibi ************************************************************************ * Section : Mathematiques Fonctions ************************************************************************ 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 correct'; finsi; fin met; fin;