IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Résolution méthode de Jakob


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 38
    Par défaut Résolution méthode de Jakob
    Bonjour,
    je programme le systeme qui doit etre resolu en utilisant le methode de Jakob.

    Pour m'indiquer ma faute ou conclure que mon compilateur ne fonction pas bien, il ne faut pas savoir le methode de Jakob.

    Dans ce fragment de mon code j' essais d'obtenir la difference entre des nouvelles valeurs et des valeurs précédentes(je fais la sustraction).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       for(i=1;i<4;i++){
     
           if(i==1){
    	 X1=K2[i]-K1[i]; K1[i]=K2[i]; }
     
           if(i==2){
    	 X2=K2[i]-K1[i];  K1[i]=K2[i];}
     
           if(i==3){
     
             X3=K2[i]-K1[i];  K1[i]=K2[i];}
        }

    D'après le methode cette difference doit etre inferieur à un nombre donné(par ex. e=0.001).
    Voilà les valeurs initialles(que je passe en argument):
    3.000
    1.000
    -0.5000
    Les resultats du premiere itération:
    3.2500
    -3.2500
    2.0000
    et c'est correcte, j'ai verifié plusieure fois en calculant sur le feuille.
    Les differences entre ces valeurs(vous aussi pouvez verifier) respectivement sont:
    0.2500 -4.2500 2.500

    Mais la machine n'affiche que:
    2.0000 -4.2500 1.7500

    Le test d'arret est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     } while(X1>=e && X2>=e &&  X3>=e);   /*e=0.001*/
    Donc le programme ne doit pas s'arreter apres la premiere iteration comme à ce moment
    (soit que ces valeurs sont fausses et je comprends pas pourquoi)
    X1=2.0000; X2=-4.2500; X3=1.7500;
    J'outilise "&&" donc ET logique.
    Voilà le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    #include<stdio.h>
    #include<math.h>
    main () {
      float K1[3], K2[3], X1=0.0000, X2=0.0000, X3=0.0000;
      float e=0.001;
      int i=0, j=0;
     
     for(i=1;i<4;i++){
        scanf("%f", &K1[i]);}
                                                 /*la boucle commence ici*/
    do                                             
      {
        for(i=1;i<4;i++){
     
          if(i==1){ 
    	K2[i]=0.5*(6-K1[2]-3*K1[3]);}
     
          if(i==2){ 
            K2[i]=0.5*(2-3*K1[1]-K1[3]);}
     
          if(i==3){ 
            K2[i]=-0.5*(1-K1[1]-2*K1[2]);}
     
        }
     
     
        for(i=1;i<4;i++){      /* ici je recoupere la difference entre les valeurs nouveaux et enciennes*/
     
           if(i==1){
    	 X1=K2[i]-K1[i]; K1[i]=K2[i]; }
     
           if(i==2){
    	 X2=K2[i]-K1[i];  K1[i]=K2[i];}
     
           if(i==3){
     
             X3=K2[i]-K1[i];  K1[i]=K2[i];}
        }      
        j++;
      } while(X1>=e && X2>=e && X3>=e);                    /*le test d'arret*/
     
     
          for(i=1;i<4;i++)
          printf("%.4f\n", K1[i]);
     
     
          printf("%.4f %.4f %.4f\n",X1,X2,X3);
          printf("%d",j);
    return 0;
    }
    Merci pour votre attention.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    d'abord en C les indices de tableaux commencent à 0 et finissent à (N-1) ....

    Dans la boucle que tu montres, tu ne prends pas la première valeur (tu démarrres à 1), et par contre du dépasses le tableau (tu vas jusqu'à 3, alors que ton tableau est dimensionné à 3)...

    Le C n'est pas du Fortran !!!!!!!!!


    Lire la documentation avant de se lancer dans des programmes svp...

    Donc tes boucles doivent être de 0 à < 3...

  3. #3
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 38
    Par défaut
    Citation Envoyé par souviron34
    d'abord en C les indices de tableaux commencent à 0 et finissent à (N-1) ....

    Dans la boucle que tu montres, tu ne prends pas la première valeur (tu démarrres à 1), et par contre du dépasses le tableau (tu vas jusqu'à 3, alors que ton tableau est dimensionné à 3)...

    Donc tes boucles doivent être de 0 à < 3...
    Tout d'abord merci pour l'attention.
    Maintenant les resultat sont correctes mais toujours la meme chose avec le test d'arret.

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Mia,
    Citation Envoyé par otari
    Tout d'abord merci pour l'attention.
    Maintenant les resultat sont correctes mais toujours la meme chose avec le test d'arret.
    As-tu lu ma réponse ?

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Mio,
    Citation Envoyé par otari
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       for(i=1;i<4;i++){
     
           if(i==1){
    	 X1=K2[i]-K1[i]; K1[i]=K2[i]; }
     
           if(i==2){
    	 X2=K2[i]-K1[i];  K1[i]=K2[i];}
     
           if(i==3){
     
             X3=K2[i]-K1[i];  K1[i]=K2[i];}
        }
    Pourquoi avoir fait une telle boucle ?

    Citation Envoyé par otari
    Le test d'arret est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     } while(X1>=e && X2>=e &&  X3>=e);   /*e=0.001*/
    Eh oui, e est > 0, et une de tes valeurs est < 0, donc bingo, sortie de la boucle.

  6. #6
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Citation Envoyé par otari
    Pour m'indiquer ma faute ou conclure que mon compilateur ne fonction pas bien,

    En règle générale, la probabilité qu'une erreur vienne du compilateur est infime par rapport à la probabilité qu'une erreur vienne de nous. D'autant plus pour un débutant

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    pour 15 lignes de code effectif ça fait pas mal...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 12
    Dernier message: 07/06/2007, 21h23
  2. Réponses: 4
    Dernier message: 10/03/2007, 17h45
  3. Résolution système tridiagonal - Méthode de Thomas
    Par Francisby dans le forum Fortran
    Réponses: 1
    Dernier message: 02/03/2007, 16h09
  4. Réponses: 5
    Dernier message: 05/12/2006, 18h40
  5. Méthodes de résolution sudoku
    Par keumlebarbare dans le forum Prolog
    Réponses: 2
    Dernier message: 18/06/2006, 08h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo