Probleme de minimisation multidimentionnel Gilles Texidor - Laurent Chignac 1999 - 2000 DESS MSRO #include <stdio.h> #include <iostream.h> #include <stdlib.h> #include <fstream.h> #include "mailleur.h" #include <math.h> //******************************************************************** float abs(float a){ if(a>0) return(a); else return(-a); } //******************************************************************** float CalculSurface(maillage xk,float lk,float dk[N-2][N-2]){ float s; maillage xtemp(2.0); xtemp.refresh(); for(int i=0;i<N-2;i++){ for(int j=0;j<N-2;j++){ xtemp.z[i+1][j+1]=xk.z[i+1][j+1]+lk*dk[i][j]; } } s=xtemp.surface(); return(s); } //********************************************************************** float minimisation1D(maillage xk,float dk[N-2][N-2]) { float lk; float A=0.; float B=5.; float a,b,c,d,e; float fc,fd,fe; float epsilon=0.01; a=A; b=B; c=0.5*(a+b); fc=CalculSurface(xk,c,dk); while ((b-a)>epsilon){ d=0.5*(a+c); e=0.5*(c+b); fd=CalculSurface(xk,d,dk); fe=CalculSurface(xk,e,dk); if(fc>fe){ a=c; c=e; fc=fe; } else { if(fd<fc){ b=c; c=d; fc=fd; } else { a=d; b=e; } } } return(c); } //******************************************************** //permet de calculer ||gradient||^2 //******************************************************** float norme2_grad(float gradient[N-2][N-2]){ float somme=0; for(int i=0;i<(N-2);i++){ for(int j=0;j<(N-2);j++){ somme+=gradient[i][j]*gradient[i][j]; } } return(somme); } //******************************************************** void Fletcher_Reeves(){ float lk; float s1,s2,ds=2.; float epsilon=0.001; float dk[N-2][N-2]; float bk; float norm2gk,norm2gkpun; int stop=0; maillage xk(2.0); xk.refresh_curv(); xk.calculer_gradient(); norm2gk=norme2_grad(xk.gradient); for(int i=0;i<N-2;i++){ for(int j=0;j<N-2;j++){ s1=xk.surface(); dk[i][j]=-xk.gradient[i][j]; } } s1=xk.surface(); while (stop<2){ lk=minimisation1D(xk,dk); for(int i=0;i<N-2;i++){ for(int j=0;j<N-2;j++){ xk.z[i+1][j+1]=xk.z[i+1][j+1]+lk*dk[i][j]; } } xk.calculer_gradient(); norm2gkpun=norme2_grad(xk.gradient); bk=norm2gkpun/norm2gk; if(stop>=1) bk=0.; norm2gk=norm2gkpun; for(int i=0;i<N-2;i++){ for(int j=0;j<N-2;j++){ dk[i][j]=-xk.gradient[i][j]+bk*dk[i][j]; } } s2=xk.surface(); ds=s1-s2; s1=s2; if (abs(ds)<epsilon) stop++; else stop=0; } xk.results(); } //******************************************************** //******************************************************** main(){ Fletcher_Reeves(); }