2016-03-24 120 views
2

我正在編寫一個C++程序來爲一個大學任務找到一階微分方程的解。該程序啓動,然後一旦我輸入迭代次數,我會得到錯誤消息「歐拉的method.exe已停止工作」。這是我的代碼: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()方法。