Bonjour à tous,

depuis peu, j'essaie de m'auto-initier au c++; je travaille avec le livre "Programmation, principes et pratiques avec c++" d'un certain Bjarne Stroustrup (pas très connu, n'est ce pas?).

J'ai voulu m'amuser à faire un programme relativement simple pour me familiariser avec la syntaxe afin de trouver la solution d'une équation non linéaire...Et j'obtiens un comportement des plus étranges qui n'a rien à voir avec la nature du problème que je veux résoudre.

Voici sans plus attendre le code (j'ai essayé de faire un pseudo exemple minimal)
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
 
#include <iostream>
#include <math.h>
 
using namespace std;
 
double f(double x){
  return pow(x,3)-cos(x);
}
 
double deriv_f(double x){
  return 3*pow(x,2)+sin(x);
}
 
int main() {
 
  int n_iter=100;
  double epsilon=1e-6;
  double delta =1e-6;
 
  double a=0;
  double b=2;
  double c0;
  double c1;
 
  double x=1;
  double y;
  double x0=1;
  double x1=2;
 
  int method=3;
 
  if (method==1){
    for (int i;i<n_iter;i++){
      c0=(a+b)/2;
      if (f(a)*f(c0)<0){
    	b=c0;
      }
      else {
    	a=c0;
      }
      c1=(a+b)/2;
      cout<<"f(x) = "<<f(c1)<<endl;
      cout<<"  Relative Error = "<<abs(c1-c0)/abs(c1)<<endl;
      if (abs(c1-c0)<epsilon*abs(c1) && f(c1)<delta){
    	cout<<"The solution found in "<<i+1<<" iterations is x= "<<c1<<endl;
    	break;
      }
    }
  }
 
  else if (method==2){
    for (int i;i<n_iter;i++){
      y=x-f(x)/deriv_f(x);
      cout<<"f(x) = "<<f(y)<<endl;
      cout<<"  Relative Error = "<<abs(y-x)/abs(y)<<endl;
      if (abs(y-x)<epsilon*abs(y) && abs(f(y))<delta){
    	cout<<"The solution found in "<<i+1<<" iterations is x= "<<y<<endl;
    	break;
      }
      x=y;   
    }
  }
 
 
  else if (method==3){
    for (int i;i<n_iter;i++){
      y=x1-f(x1)*(x1-x0)/(f(x1)-f(x0));
      cout<<"f(x) = "<<f(y)<<endl;
      cout<<"  Relative Error = "<<abs(y-x1)/abs(y)<<endl;
      if (abs(y-x1)<epsilon*abs(y) && abs(f(y))<delta){
    	cout<<"The solution found in "<<i+1<<" iterations is x= "<<y<<endl;
    	break;
      }
      x0=x1;
      x1=y;     
    }
  }
 
  else {
    cout<<"Nothing to do"<<endl;
    exit(0);
  }
 
  return 0;
}
A ce stade, je n'utilise absolument pas les possibilités qu'offrent le language, j'en suis conscient (ça viendra plus tard, je l'espère).

Voici le problème: je compile et exécute en ligne de commande avec
g++ -o nonlinear nonlinear.cc && ./nonlinear

Et il ne se passe...Rien du tout.
Par contre, si je mets le contenu d'un des if/else if en commentaires...les deux autres méthodes fonctionnent et le résultat obtenu est correct.

J'ai fini par corriger le problème en incluant les variables spécifiques à chacune des méthodes dans l'instruction if associée, de la manière suivante

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>
#include <math.h>
 
using namespace std;
 
double f(double x){
  return pow(x,3)-cos(x);
}
 
double deriv_f(double x){
  return 3*pow(x,2)+sin(x);
}
 
int main() {
 
  int n_iter=100;
  double epsilon=1e-6;
  double delta =1e-6;
 
  int method=3;
 
  if (method==1){
    double a=0;
    double b=2;
    double c0;
    double c1;
    for (int i;i<n_iter;i++){
      c0=(a+b)/2;
      if (f(a)*f(c0)<0){
    	b=c0;
      }
      else {
    	a=c0;
      }
      c1=(a+b)/2;
      cout<<"f(x) = "<<f(c1)<<endl;
      cout<<"  Relative Error = "<<abs(c1-c0)/abs(c1)<<endl;
      if (abs(c1-c0)<epsilon*abs(c1) && f(c1)<delta){
    	cout<<"The solution found in "<<i+1<<" iterations is x= "<<c1<<endl;
    	break;
      }
    }
  }
 
  else if (method==2){
    double x=1;
    double y;
    for (int i;i<n_iter;i++){
      y=x-f(x)/deriv_f(x);
      cout<<"f(x) = "<<f(y)<<endl;
      cout<<"  Relative Error = "<<abs(y-x)/abs(y)<<endl;
      if (abs(y-x)<epsilon*abs(y) && abs(f(y))<delta){
    	cout<<"The solution found in "<<i+1<<" iterations is x= "<<y<<endl;
    	break;
      }
      x=y;   
    }
  }
 
 
  else if (method==3){
    double x0=1;
    double x1=2;
    double y;
    for (int i;i<n_iter;i++){
      y=x1-f(x1)*(x1-x0)/(f(x1)-f(x0));
      cout<<"f(x) = "<<f(y)<<endl;
      cout<<"  Relative Error = "<<abs(y-x1)/abs(y)<<endl;
      if (abs(y-x1)<epsilon*abs(y) && abs(f(y))<delta){
    	cout<<"The solution found in "<<i+1<<" iterations is x= "<<y<<endl;
    	break;
      }
      x0=x1;
      x1=y;     
    }
  }
 
  else {
    cout<<"Nothing to do"<<endl;
    exit(0);
  }
 
  return 0;
}
Et ça marche...

Je passe donc d'un
"Mon code ne marche pas...Pourquoi?"
à
"Mon code marche...Pourquoi?"

Qu'est ce qui m'échappe?

D'avance merci pour votre aide.