Vous êtes sur la page 1sur 3

#include <stdio.

h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause")
or input loop */

/* Méthode d'élimination de Gauss */


void gauss(float **A, float *b, float *x, int n)
{
int i, j, k ;
int imin ;
float p ;
float sum, valmin, tump1, tump2 ;

for(k = 0 ; k < n-1 ; k++)


{
/* Dans un premier temps, on cherche l'élément minimum (non */
/* nul) en valeur absolue dans la colonne k et d'indice i */
/* supérieur ou égal à k. */

valmin = A[k][k] ; imin = k ;


for(i = k+1 ; i < n ; i++)
{
if (valmin != 0)
{
if (abs(A[i][k]) < abs(valmin) && A[i][k] != 0)
{
valmin = A[i][k] ;
imin = i ;
}
}
else
{
valmin = A[i][k] ;
imin = i ;
}
}

/* Si l'élément minimum est nul, on peut en déduire */


/* que la matrice est singulière. Le pogramme est */
/* alors interrompu. */

if (valmin == 0.)
{
printf("\n\n\nAttention! Matrice singuliere!\n\n\n") ;
exit( EXIT_FAILURE ) ;
}

/* Si la matrice n'est pas singulière, on inverse */


/* les éléments de la ligne imax avec les éléments */
/* de la ligne k. On fait de même avec le vecteur b. */

for(j = 0 ; j < n ; j++)


{
tump1 = A[imin][j] ;
A[imin][j] = A[k][j] ;
A[k][j] = tump1 ;
}
tump2 = b[imin] ;
b[imin] = b[k] ;
b[k] = tump2 ;

/* On procède à la réduction de la matrice par la */


/* méthode d'élimination de Gauss. */

for(i = k+1 ; i < n ; i++)


{
p = A[i][k]/A[k][k] ;

for(j = 0 ; j < n ; j++)


{
A[i][j] = A[i][j] - p*A[k][j] ;
}

b[i] = b[i] - p*b[k] ;


}
}

/* On vérifie que la matrice n'est toujours pas singulière. */


/* Si c'est le cas, on interrompt le programme. */

if (A[n-1][n-1] == 0)
{
printf("\n\n\nAttention! Matrice singuliere!\n\n\n") ;
exit( EXIT_FAILURE ) ;
}

/* Une fois le système réduit, on obtient une matrice triangulaire */


/* supérieure et la résolution du système se fait très simplement. */

x[n-1] = b[n-1]/A[n-1][n-1] ;

for(i = n-2 ; i > -1 ; i--)


{
sum = 0 ;

for(j = n-1 ; j > i ; j--)


{
sum = sum + A[i][j]*x[j] ;
}
x[i] = (b[i] - sum)/A[i][i] ;
}
}

int main(int argc, char *argv[]) {

float **A,*b,*x;
int n;

printf("taper a: et b et x et n");
scanf("%f%f%f%d",&A,&b,&x,&n);
gauss(A,b,x,n);
return 0;
}

Vous aimerez peut-être aussi