2016-03-24 3 views
2

Je suis en train d'écrire un programme C++ pour trouver des solutions pour les équations différentielles de premier ordre pour une affectation collégiale. Le programme démarre et une fois que j'entre le nombre d'itérations à faire, j'obtiens le message d'erreur "Euler's method.exe a cessé de fonctionner". Ceci est mon code:Le programme C++ a cessé de fonctionner- Résolution d'équations différentielles ordinaires

#include <functional> 
 
#include <vector> 
 

 
using namespace std; 
 

 
    
 
double f_r(double x, double r) { 
 
    return r; 
 
    } 
 

 
double f_s(double x, double s) { 
 
    return -x/s; 
 
    } 
 
    
 

 
double eulerstep(const function<double(double,double)>& f, double xsub0, double ysub0, double h) { 
 
    double ysub1 = ysub0+ h * f(xsub0,ysub0); 
 
    return ysub1; 
 
    } 
 

 

 
double euler(const function<double(double,double)>& f, double xsub0, double ysub0, double h, int n) { 
 
    vector<double> xsub; 
 
    vector<double> ysub; 
 
    xsub[0] = xsub0; 
 
    ysub[0] = ysub0; 
 
    n = ysub.size(); 
 
    for (int i=1; i<n; i++){ 
 
    \t xsub[i+1] = xsub[i] + h; 
 
    \t ysub[i+1] = ysub[i] + h * f(xsub[i],ysub[i]); 
 
    \t cout << xsub[i] << " , " << ysub[i] << endl; 
 
    } 
 
    return ysub[n]; 
 
    } 
 
    
 
int main() { 
 
    int nsteps = 0; 
 
    cout << "Number of steps?" << endl; 
 
    cin >> nsteps; 
 
    double h = 1.0/nsteps; 
 

 
    double r = euler(f_r,0,1,h,nsteps); 
 
    
 

 
    double s = euler(f_s,0,1,h,nsteps); 
 
    
 
    return 0; 
 
}

Je suis assez sûr que le problème réside dans la façon dont je l'ai défini mes vecteurs mais je suis nouveau à les utiliser peut pas voir où je J'ai mal tourné. Je serais très reconnaissant si quelqu'un pourrait signaler les erreurs dans ma méthode

Merci

+0

Jusqu'où obtenez-vous lorsque vous exécutez ceci dans un débogueur? – mah

+0

Vous pouvez ajouter des éléments au vecteur en utilisant 'push_back()' – DimChtz

+0

'xsub [0] = xsub0;' commence votre problème – DimChtz

Répondre

1

Voici une fonction mise à jour. Vous devez définir les tailles, ne demandez pas un vecteur vide pour sa taille.

double euler(const function<double(double, double)>& f, double xsub0, double ysub0, double h, int n) 
{ 
    vector<double> xsub; 
    vector<double> ysub; 
    xsub.resize(n+1); // so we can access [n], it must be size n+1 
    ysub.resize(n+1); 
    xsub[0] = xsub0; 
    ysub[0] = ysub0; 
    for (int i = 1; i<n; i++) { 
     xsub[i + 1] = xsub[i] + h; 
     ysub[i + 1] = ysub[i] + h * f(xsub[i], ysub[i]); 
     cout << xsub[i] << " , " << ysub[i] << endl; 
    } 
    return ysub[n]; 
} 
0
vector<double> xsub; 
vector<double> ysub; 

Vous instanciation d'une paire de vecteurs. Ils sont initialement vides.

xsub[0] = xsub0; 
ysub[0] = ysub0; 

Vous allez ensuite attribuer des valeurs au contenu du vecteur. C'est ici que vous vous plantez, car les vecteurs sont vides et ne contiennent aucune valeur.

vector[x] fait référence à un élément existant dans un vecteur. Le vecteur doit déjà contenir au moins x+1 éléments, mais aucun de vos vecteurs ne contient quoi que ce soit. Ils n'ont pas l'élément 0, ni l'élément 1, ni aucun élément.

Votre code s'attend à ce que chaque vecteur contienne n+1 éléments. Par conséquent, vous devez appeler explicitement la méthode resize() de chaque vecteur avant d'utiliser chaque vecteur.