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)
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).
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; }
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
Et ça marche...
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; }
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.
Partager