Probleme dans l'algorithme de jacobi

mino1001 Messages postés 12 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 17 avril 2007 - 17 avril 2007 à 00:33
cs_brahim08 Messages postés 3 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 12 janvier 2009 - 10 mai 2008 à 15:32
voila mon programme
,et je ne c pas pourquoi il ne calcule pas les solutions 
du systeme Ax=b telles que:
       5   -1 -1 -1                  -4                                                     1
       -1 10 -1 -1                  12                                                     2
A    -1 -1  5  -1              b   8                    solution a trouver:  x    3
       -1 -1 -1 10                   34                                                    4
on commence par Xi egale 0,0,0,0 

#include<stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])


 


 


{


    int i,j,k;
    float a,A[4][4],b[4],x[4],g[4],some;
   
   
   
   
   
   
    /*saisie de la matrice A */
   
   
    printf(" donner les composantes de la matrice A \n");
    for(i=0;i<4;i++)
    {
   
    for(j=0;j<4;j++)
  
    scanf("%f",&A[i][j]);
 
    getchar();
   
    }
    printf(" A egale : \n");
    for(i=0;i<4;i++)
    {
    {for(j=0;j<4;j++)
    printf(" %f ",A[i][j]);
    }
    printf("\n");
    }
   
   
    /*saisie de la matrice b*/
   
  printf(" donner les composantes du vecteur b \n");
     for(i=0;i<=3;i++)
     scanf(" %f \n",&b[i]);
    
     printf(" b egale : \n"); 
    
     for(i=0;i<4;i++)
     {
     printf(" %f \n ",b[i]);
      }
    
    /* saisie de la matrice x */
    
     printf(" donner les composantes du vecteur x \n");
     for(i=0;i<4;i++)
     scanf(" %f \n",&x[i]);
    
     printf(" x egale : \n"); 
    
     for(i=0;i<4;i++)
     {
     printf(" %f ",x[i]);
     printf("\n");
     }
    
    /* calcule des solutions*/
    
     do
     {
     for(i=0;i<4;i++)
     {
    
     for(j=0;j<4;j++)
     {some=0;
     if(i==j)
     continue;
     some=some+A[i][j]*x[j];
     }
     g[i]=(b[i]-some)/A[i][i];
     }
     for(k=0;k<4;k++)
     x[k]=g[k];
     }
     while(g[1]-x[1]<0.0001);
    
     /* affichage des solutions */
    
     for(k=0;k<4;k++)
     {
     printf(" %f ",x[k]);
     printf("\n");
     }


    
    
    system("PAUSE"); 
  return 0;
}


 

5 réponses

simafst Messages postés 37 Date d'inscription dimanche 20 mai 2007 Statut Membre Dernière intervention 11 juin 2010 1
20 mai 2007 à 02:17
salut je sai pa exactement ton probléme mais je vai te donner un code qui marche.


/*Algorithme de JACOBI*/


#include<stdio.h>
#include<math.h>
#define DIM 200
#include<conio.h>
#include<stdlib.h>


void affiche_matrice_vecteur(double A[DIM][DIM],double B[DIM],int n)/*fonction pour l'affichage d'une matrice m de dimention n*/
{
    int i,j;
             
    printf("la matrice\n");
    for(i=0;i<n;i++)/*boucle for sur les lignes*/
    {
       printf("|");
       for(j=0;j<n;j++)/*boucle for sur les colonnes*/
       printf(" %6.2lf ",A[i][j]);
       printf("|\n");
    }
   
    printf("\n");        
    printf("le vecteur\n");
    for(i=0;i<n;i++)
        printf( "%6.2lf\n",B[i]);
           
}
void init_matrice(double m[DIM][DIM],int n)/*fonction pour l'initialisation d'une matrice m de dimention n*/
{
 int i,j;
 for(i=0;i<n;i++)/*boucle for sur les lignes*/
 {
 for(j=0;jeps)
       return(0);/*si le critére d'arret n'est pas verifié on retourne 0*/
       return(1);/*si le critére d'arret est verifié on retourne 1*/
}
void init_vect(double X[DIM],int n,double a)/*fonction pour l'initialisation d'un vecteur*/
{
    int i;
    for(i=0;i<n;i++)
       X[i]=a;/*On initialise la solution à a*/
}          
int main()
{
 double a[DIM][DIM],b[DIM],x[DIM],j[DIM][DIM],x0[DIM];
  int n;
  int nit_AJ=0;/*on init le compteur du nombre d'itération pour obtenir le résultat*/
  double eps=0.00;/* on init eps(pour le critére d'arret)*/
  printf("\n-DEBUT de l'algorithme de JACOBI-\n");
  printf("donner la dimention du systeme : ");
  scanf("%d",&n);
  init_matrice(a,n);
  init_vecteur(a,b,n);
  affiche_matrice_vecteur(a,b,n);
  printf("donner saisir epsilon:\n");
  while(eps<=0)
      scanf("%lf",&eps);
    init_vect(x0,n,2);/*partant de x0=2*/
    init_vect(x,n,0);
    while(!converge(x,x0,eps,n))/*tant que la convergence est vérifier*/
    {                          
    calcul_vecteur(a,b,x,x0,n);
    nit_AJ++;
  }
 affiche_sys(a,b,x,n);
 printf("Le nombre d'itérations est:%d\n",nit_AJ);
 system("pause");
}
1
emmatopiak Messages postés 149 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 17 mai 2007 2
6 mai 2007 à 10:45
Salut,

Je suis pas sûre de connaitre l'algo de jacobi mais voilà deux problèmes de ton programme :

1. Tu fais à un moment x[k] = g[k] et juste en dessous tu fais ton while (g[1]-x[1]<0.0001)
--et bien si x[k]=g[k], g[1]-x[1] vaut 0 et donc la boucle s'arrête au premier tour.
Donc y'a problème dans ta boucle :p

2. Quand tu testes x[1] et g[1], tu es conscient que c'est le deuxième élément n'est ce pas ? C'est étrange de tester le deuxième élément je trouve, pourquoi pas x[0] et g[0] ? ou pourquoi pas tous ?
--et puis c'est étonnant de se comparer à la solution x vu que cette solution est inconnue
= @++

Une autruche ne se cuit pas aux petits lardons.
0
emmatopiak Messages postés 149 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 17 mai 2007 2
6 mai 2007 à 10:47
Salut,

Je suis pas sûre de connaitre l'algo de jacobi mais voilà deux problèmes de ton programme :

1. Tu fais à un moment x[k] = g[k] et juste en dessous tu fais ton while (g[1]-x[1]<0.0001)
--et bien si x[k]=g[k], g[1]-x[1] vaut 0 et donc la boucle s'arrête au premier tour.
Donc y'a problème dans ta boucle :p

2. Quand tu testes x[1] et g[1], tu es conscient que c'est le deuxième élément n'est ce pas ? C'est étrange de tester le deuxième élément je trouve, pourquoi pas x[0] et g[0] ? ou pourquoi pas tous ?
--et puis c'est étonnant de se comparer à la solution x vu que cette solution est inconnue
= @++

Une autruche ne se cuit pas aux petits lardons.
0
cs_brahim08 Messages postés 3 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 12 janvier 2009
10 mai 2008 à 15:27
je cherche de l'aide sur la source executable de jacobi pour calculer les valeurs propres en c++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_brahim08 Messages postés 3 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 12 janvier 2009
10 mai 2008 à 15:32
je cherche de l'aide sur la source executable de jacobi pour calculer les valeurs propres en c++
mon émail    [mailto:raahime@hotmail.com raahime@hotmail.com]  merci
0
Rejoignez-nous