next up previous contents
suivant: mailleur.h monter: Code du source précédent: Code du source   Table des matières

Surface Minimum.cpp

                      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();
}



2003-06-22