Programme qui tombe en marche sans modification particulière
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:
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:
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.