【问题标题】:C++ program has stopped working- Solving ordinary differential equationsC++ 程序已停止工作 - 求解常微分方程
【发布时间】:2016-07-11 12:53:13
【问题描述】:

我正在编写一个 C++ 程序来寻找大学作业的一阶微分方程的解。程序启动,然后一旦我输入要执行的迭代次数,我就会收到错误消息“Euler 的 method.exe 已停止工作”。这是我的代码:

#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++){
  	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];
  }
  
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;
}

我很确定问题在于我如何定义我的向量,但我是新手,所以看不出哪里出错了。如果有人能指出我方法中的错误,我将不胜感激

谢谢

【问题讨论】:

  • 当你在调试器中运行它时你能走多远?
  • 您可以使用push_back()将项目添加到向量中
  • xsub[0] = xsub0; 你的问题开始了
  • 它询问步数,当我输入任何数字时它会崩溃,然后进程以非常高的返回值退出

标签: c++ vector crash ode differential-equations


【解决方案1】:
vector<double> xsub;
vector<double> ysub;

您正在实例化一对向量。它们最初是空的。

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

然后您继续为向量的内容赋值。这是您崩溃的地方,因为向量是空的,并且不包含任何值。

vector[x] 引用向量中的现有元素。向量中必须至少包含 x+1 元素,但您的向量中都没有任何内容。它们没有元素 0,也没有元素 1,也没有任何元素。

看起来您的代码希望每个向量都包含n+1 元素,因此您应该在尝试使用每个向量之前相应地显式调用每个向量的resize() 方法。

【讨论】:

    【解决方案2】:

    这是一个更新的函数。您必须设置大小,而不是询问空向量的大小。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      相关资源
      最近更新 更多