2016-03-24 7 views
2

Ich schreibe ein C++ - Programm, um Lösungen für Differentialgleichungen erster Ordnung für eine College-Aufgabe zu finden. Das Programm startet und dann, sobald ich die Anzahl der Iterationen eingeben, bekomme ich die Fehlermeldung "Eulers Methode.exe funktioniert nicht mehr". Dies ist mein Code:C++ - Programm funktioniert nicht mehr - Lösen gewöhnlicher Differentialgleichungen

#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; 
 
}

Ich bin ziemlich sicher, dass das Problem liegt darin, wie ich meine Vektoren definiert habe, aber ich bin neu mit ihnen kann so nicht sehen, wo ich Ich bin falsch gelaufen. Ich würde sehr dankbar, wenn jemand die Fehler in meiner Methode

Dank

+0

Wie weit kommen Sie, wenn Sie dies in einem Debugger ausführen? – mah

+0

Sie können Elemente zum Vektor hinzufügen mit 'push_back()' – DimChtz

+0

'xsub [0] = xsub0;' dort beginnt Ihr Problem – DimChtz

Antwort

1

Hier ist eine aktualisierte Funktion. Sie müssen die Größen einstellen, nicht einen leeren Vektor nach seiner Größe fragen.

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; 

Sie instanziieren ein Paar von Vektoren hinweisen könnte. Sie sind anfangs leer.

Anschließend ordnen Sie dem Inhalt des Vektors Werte zu. Hier stürzt man ab, weil die Vektoren leer sind und keine Werte enthalten.

vector[x] verweist auf ein vorhandenes Element in einem Vektor. Der Vektor muss bereits mindestens x+1 Elemente enthalten, aber in keinem Ihrer Vektoren ist etwas enthalten. Sie haben weder Element 0 noch Element 1 noch irgendein Element.

Offenbar erwartet Ihr Code, dass jeder Vektor n+1 Elemente enthält. Daher sollten Sie die Methode resize() jedes Vektors entsprechend aufrufen, bevor Sie versuchen, jeden Vektor zu verwenden.

Verwandte Themen