C++ 程序已停止工作 - 求解常微分方程
C++ program has stopped working- Solving ordinary differential equations
我正在编写一个 C++ 程序来为大学作业寻找一阶微分方程的解。程序启动,然后一旦我输入要执行的迭代次数,我就会收到错误消息 "Euler's method.exe has stopped working"。这是我的代码:
#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;
}
我相当确定问题在于我如何定义我的向量,但我是使用它们的新手,所以看不出哪里出了问题。如果有人能指出我方法中的错误,我将不胜感激
谢谢
vector<double> xsub;
vector<double> ysub;
您正在实例化一对向量。它们最初是空的。
xsub[0] = xsub0;
ysub[0] = ysub0;
然后您继续为向量的内容赋值。这是你崩溃的地方,因为向量是空的,不包含任何值。
vector[x]
引用向量中的现有元素。该向量必须至少包含 x+1
个元素,但 none 个向量中包含任何元素。它们没有元素 0,也没有元素 1,也没有任何元素。
看起来您的代码希望每个向量都包含 n+1
个元素,因此在您尝试使用每个向量之前,您应该相应地显式调用每个向量的 resize()
方法。
这是一个更新的函数。您必须设置大小,而不是向空向量询问其大小。
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];
}
我正在编写一个 C++ 程序来为大学作业寻找一阶微分方程的解。程序启动,然后一旦我输入要执行的迭代次数,我就会收到错误消息 "Euler's method.exe has stopped working"。这是我的代码:
#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;
}
我相当确定问题在于我如何定义我的向量,但我是使用它们的新手,所以看不出哪里出了问题。如果有人能指出我方法中的错误,我将不胜感激
谢谢
vector<double> xsub;
vector<double> ysub;
您正在实例化一对向量。它们最初是空的。
xsub[0] = xsub0;
ysub[0] = ysub0;
然后您继续为向量的内容赋值。这是你崩溃的地方,因为向量是空的,不包含任何值。
vector[x]
引用向量中的现有元素。该向量必须至少包含 x+1
个元素,但 none 个向量中包含任何元素。它们没有元素 0,也没有元素 1,也没有任何元素。
看起来您的代码希望每个向量都包含 n+1
个元素,因此在您尝试使用每个向量之前,您应该相应地显式调用每个向量的 resize()
方法。
这是一个更新的函数。您必须设置大小,而不是向空向量询问其大小。
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];
}