/home/ann2.ext/paccaulf/projsem2/ContourActif/resollu.cpp

Aller à la documentation de ce fichier.
00001 //
00002 // resollu.h : resolution LU 
00003 //
00004 
00005 #include "resollu.h"
00006 #include <math.h>
00007 
00008 #define TINY 1.0e-20
00009 
00010 /* ********************************************************************* */
00011 /* Les deux fonctions suivantes ont ete empruntees a Numerical Recipes.  */
00012 /*                                                                       */
00013 /* Elles permettent la decomposition LU d'une matrice et la resoultion   */
00014 /* d'un systeme d'equation matricielle du type A.x = B                   */
00015 /* ********************************************************************* */
00016 bool ludcmp(double a[][MAT_SIZE], int l, int indx[])
00017 { // Decomposition L.U de la matrice A
00018   // A est modifiee par la procedure
00019   int i,imax=0,j,k;
00020   double big,dum,sum,temp;
00021   double *vv;
00022   bool Inversible = true;
00023 
00024   vv = new double[l];     // Allocation dynamique d'un tableau
00025 
00026 
00027   for (i=0;i<l;i++) {
00028     big=0.0;
00029     for (j=0;j<l;j++)
00030       if ((temp=fabs(a[i][j]))>big)
00031         big=temp;
00032     if (big==0)
00033       Inversible= false;  //Erreur: inversion de matrice singuliere
00034     else
00035       vv[i]=1.0/big;
00036   }
00037 
00038   if (Inversible)
00039     {
00040       for (j=0;j<l;j++) {
00041         for (i=0;i<j;i++) {
00042           sum=a[i][j];
00043           for (k=0;k<i;k++)
00044             sum-=a[i][k]*a[k][j];
00045           a[i][j]=sum;
00046         }
00047         big=0.0;
00048         for (i=j;i<l;i++) {
00049           sum=a[i][j];
00050           for (k=0;k<j;k++)
00051             sum-=a[i][k]*a[k][j];
00052           a[i][j]=sum;
00053           if ((dum=vv[i]*fabs(sum))>=big) {
00054             big=dum;
00055             imax=i;
00056           }
00057         }
00058         if (j!=imax) {
00059           for (k=0;k<l;k++) {
00060             dum=a[imax][k];
00061             a[imax][k]=a[j][k];
00062             a[j][k]=dum;
00063           }
00064 
00065           vv[imax]=vv[j];
00066         }
00067         indx[j]=imax;
00068         if (a[j][j]==0.0)
00069           a[j][j]= TINY;
00070         if (j!=l-1) {
00071           dum=1.0/(a[j][j]);
00072           for (i=j+1;i<l;i++)
00073             a[i][j]*=dum;
00074         }
00075       }
00076     }  // if (Inversible)
00077   delete [] vv;  // Libere l'espace memoire attribue dynamiquement
00078   return (Inversible);
00079 
00080 }
00081 
00082 void lubksb(double a[][MAT_SIZE],int l,int indx[],double b[])
00083 {
00084   // Remontee de substitution apres decomposition
00085   int i,ii=-1,ip,j;
00086   double sum;
00087 
00088   for (i=0;i<l;i++) {
00089     ip=indx[i];
00090     sum=b[ip];
00091     b[ip]=b[i];
00092     if (ii>=0)
00093       for (j=ii;j<=i-1;j++)
00094         sum-=a[i][j]*b[j];
00095     else if (sum)
00096       ii=i;
00097     b[i]=sum;
00098   }
00099   for (i=l-1;i>=0;i--) {
00100     sum=b[i];
00101     for (j=i+1;j<l;j++)
00102       sum-=a[i][j]*b[j];
00103     b[i]=sum/a[i][i];
00104   }
00105 }
00106 
00107 
00108 
00109 /*---------------------------------------------------------------------*/
00110 /* DESCRIPTION: ResoudreSysteme()                                      */
00111 /*              Cette fonction resoud un systeme d'equations matri-    */
00112 /*              cielles de la forme K*B=U                              */
00113 /*              par valeur                                             */
00114 /* PARAMETRES:       K (IN): matrice carree de krigeage                */
00115 /*                   U (IN): vecteur des observations                  */
00116 /*                   B (OUT): vecteur des coefficients recherches      */
00117 /*                   Dimension (IN): dimension de la matrice et des    */
00118 /*                                   des vecteurs                      */
00119 /* VALEUR DE RETOUR: true si le systeme a une solution                 */
00120 /*                   false autrement.                                  */
00121 /* REMARQUE:         Resolution par une methode classique de diagona-  */
00122 /*                   lisation du systeme en descente suivi d'une       */
00123 /*                   remonte pour determiner les coefficients.         */
00124 /*---------------------------------------------------------------------*/
00125 bool ResoudreSysteme(double K[][MAT_SIZE], double U[], double B[], int Dimension)
00126 {
00127   /* Creation de la Matrice des coefficients B*/
00128   int MatTampon[MAT_SIZE];
00129   int Indice;
00130   bool SolutionExiste;
00131 
00132 
00133   /* Inversion de K -> K originale est ecrasee */
00134   SolutionExiste = ludcmp(K,  Dimension, MatTampon);
00135 
00136   if (SolutionExiste) // S'il y a une solution au systeme matriciel
00137     {
00138       for (Indice=0;Indice<Dimension;Indice++)
00139         B[Indice]= U[Indice];
00140 
00141       lubksb(K, Dimension, MatTampon,B);
00142     }
00143   return (SolutionExiste);
00144 }

Généré le Thu Jun 15 18:48:52 2006 pour Projet Image 2006 - Vincent Vidal, Florent Paccault - par  doxygen 1.4.7