2016-03-24 7 views
2

Я пишу программу на C++ для поиска решений дифференциальных уравнений первого порядка для задания колледжа. Программа запускается, а затем после ввода количества итераций я получаю сообщение об ошибке «Метод method.exe от Euler перестает работать». Это мой код:Программа C++ перестала работать. Решение обычных дифференциальных уравнений

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

Я совершенно уверен, что проблема заключается в том, как я определил свои векторы, но я новичок в их использовании, так не может видеть, где я все пошло не так. Я был бы очень признателен, если кто-то может указать на ошибки в моем методе

Благодарности

+0

Как далеко вы получаете, когда запускаете это в отладчике? – mah

+0

Вы можете добавить элементы в вектор, используя 'push_back()' – DimChtz

+0

'xsub [0] = xsub0;' там запущена ваша проблема – DimChtz

ответ

1

Вот обновленная функция. Вы должны установить размеры, а не задавать пустой вектор для его размера.

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; 

Вы инстанцировании пару векторов. Они изначально пусты.

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

Затем вы переходите к назначению значений содержимому вектора. Здесь вы терпите крах, потому что векторы пусты и не содержат значений.

vector[x] ссылки на существующий элемент в векторе. Вектор должен содержать не менее x+1 элементов, но ни один из ваших векторов не имеет в них ничего. У них нет элемента 0, ни элемента 1, ни какого-либо элемента.

Похоже, ваш код ожидает, что каждый вектор будет содержать n+1 элементов, поэтому вы должны явно вызвать метод каждого из них resize(), соответственно, прежде чем пытаться использовать каждый вектор.