vtit | Bonjour,
je dois écrire un programme qui calcule l'inverse d'une matrice à partir de la resolution d'un systeme linéaire.
Mon code ne marche pas, je ne sais pas ou est le probleme.
Voici mon code:
Code :
- #include <stdio.h>
- #include <stdlib.h>
- int n,k,drapeau;
- float *A,*x;int c,y;
- float *z,*m,*l;
- int *b;
- int num(int i,int j)
- {
- return (i-1)*n+j-1;
- }
- //saisie de la matrice
- void* saisie(int n,float *A)
- { int i,j;
- printf("Donner A ligne/ligne\n" );
- for(i=1;i<=n;i++)
- {
- for(j=1;j<=n;j++)
- {
- scanf("%f",&A[num(i,j)]);
- }
- }
- }
- //determination de la matrice identité
- void matr_id(int n)
- {
- int i,j;
- for(i=1;i<=n;i++)
- {
- b[num(i,i)]=1;
- }
- }
- //Recherche du pivot
- int recherche_pivot(int k,float *A)
- {
- int i,i0;
- i=k;
- i0=-1;
- do
- {
- if(A[num(i,k)]==0)
- i=i+1;
- }while((A[num(i,k)]==0)&&(i!=n+1));
- if(i!=n+1)
- i0=i;
- return i0;
- }
- //Permutation
- void permutation(int k,int i0,float *A,int *b)
- {
- int j;float tampon;
- for(j=1;j<=n;j++)
- {
- tampon=A[num(k,j)];
- A[num(k,j)]=A[num(i0,j)];
- A[num(i0,j)]=tampon;
- }
- matr_id(n);
- for(j=1;j<=n;j++)
- {
- tampon=b[num(k,j)];
- b[num(k,j)]=b[num(i0,j)];
- b[num(i0,j)]=tampon;
- }
- }
- //Elimination
- void elimination(int k,float *A,int *b)
- {
- float r;int i,j;
- for(i=k+1;i<=n;i++)
- {
- r=A[num(i,k)]/A[num(k,k)];
- for(j=k;j<=n;j++)
- {
- A[num(i,j)]=A[num(i,j)]-r*A[num(k,j)];
- b[num(i,j)]=b[num(i,j)]-r*b[num(k,j)];
-
- }
-
- }
- }
- //remontée
- void remontee(float *A,int *b,float *x)
- {
- int i,j;float g;
- x[num(n,n)]=b[num(n,n)]/A[num(n,n)];
- i=n-1;
- j=i+1;
- while(i>=1)
- {
- x[num(i,j)]=b[num(i,j)];
- g=x[num(i,j)];
- while(j<=n)
- {
- g=g-A[num(i,j)]*x[num(i,j)];
- g=g/A[num(i,i)];
- j++;
- }
- i=i-1;
- }
- }
- //affichage du vecteur x
- void affiche_vecteur(float *x)
- {
- int i,j;
- for(i=1;i<=n;i++)
- {
- for(j=1;j<=n;j++)
- {
- printf("%f\n",x[num(i,j)]);
- }
- printf("\n" );
- }
- }
- int main()
- {
- int i,j;
- printf("Donner n\n" );
- scanf("%d",&n);
- y=n*n;
- A=malloc(y*sizeof(float));
- b=calloc(y,sizeof(int));
-
- x=malloc(y*sizeof(float));
- drapeau=0;
- saisie(n,A);
- k=1;
- do
- {
- c=recherche_pivot(k,A);
- if(c==k)
- {
- elimination(k,A,b);
- k=k+1;
- }
- else
- {
- if(c!=-1)
- {
- permutation(k,c,A,b);
- elimination(k,A,b);
- k=k+1;
- }
- else
- drapeau=1;
- }
- }while((k!=n)&&(drapeau!=1));
- if((k==n)&&(A[num(n,n)]!=0))
- {
- remontee(A,b,&x);
- printf("La matrice est inversible\n" );
- affiche_vecteur(&x);
- }
- else
- {
-
- printf("La matrice n'est pas inversible\n" );
- }
- if(drapeau==1)
- printf("La matrice n'est pas inversible." );
- return 0;
- }
- Merci d'avance!
|
|