2016-03-24 67 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()方法。