我正在尝试用c++解决一个微分时滞方程组。我是一个新手在编码方面,所以如果你有建议,请告诉我,我想提高我的写作!我想做的是:初始化历史数组,然后通过覆盖历史数组来开始求解微分方程。但问题是,我得到了错误消息:
在抛出'std::out_of_range‘what()的实例后调用terminate : vector::_M_range_check:__n (它是9999) >= this->size() (它是9999)
似乎历史数组超出了范围。我试着在第二个if条件后添加std::cout来检查代码是否通过了第二个for循环,但他没有,因为我现在是通过实践来学习c++的,所以这个问题对我来说并不是很清楚。我希望有人能看到这个错误。请不要犹豫改进我的代码,我将不胜感激!
谢谢你的帮忙!
#include <iostream>
#include <vector>
#include <cmath>
#include <iomanip>
#include <fstream>
const double pi = 3.14159265358979323846;
//delay
int tau = 1;
//initial values
double x = 1.0;
double y = 1.0;
double t = 0.0;
//constants and parameters
double K = 0.25;
double lam = 0.5;
double omega = pi;
double dx, dy;
//step-size
double dt = pow(10.0, -4.0);
//number of steps
int Delta = static_cast<int>(tau/dt);
std::vector<double> hist_x((static_cast<int>(tau/dt) - 1), 0.0);
std::vector<double> hist_y((static_cast<int>(tau/dt) - 1), 0.0);
std::vector<double> t_val;
std::vector<double> x_val;
std::vector<double> y_val;
double euler(double f, double di, double time_step){
f = f + time_step * di;
return f;
}
int main()
{
std::ofstream file_x;
std::ofstream file_y;
std::ofstream file_t;
file_x.open("x_val.txt");
file_y.open("y_val.txt");
file_t.open("t_val.txt");
for(int n = 0; n < 2; n++){
if(n==0){
for(int j; j < Delta; j++){
dx = lam * x + omega * x;
dy = lam * y - omega * x;
x = euler(x, dx, dt);
y = euler(y, dy, dt);
t = t + dt;
x_val.push_back(x);
y_val.push_back(y);
t_val.push_back(t);
hist_x.at(j) = x;
hist_y.at(j) = y;
file_x<<x_val.at(j)<<std::endl;
file_y<<y_val.at(j)<<std::endl;
file_t<<t_val.at(j)<<std::endl;
}
}
if(!(n==0)){
for(int k = 0; k < Delta; k++){
//f1(x,y)
dx = lam * x + omega * x - K * ( x - hist_x.at(k) );
//f2(x,y)
dy = lam * y - omega * x - K * ( y - hist_y.at(k) );
x = euler(x, dx, dt);
y = euler(y, dy, dt);
t = t + dt;
x_val.push_back(x);
y_val.push_back(y);
t_val.push_back(t);
hist_x.at(k) = x;
hist_y.at(k) = y;
file_x<<x_val.at(k + n * Delta)<<std::endl;
file_y<<y_val.at(k + n * Delta)<<std::endl;
file_t<<t_val.at(k + n * Delta)<<std::endl;
}
}
}
file_x.close();
file_y.close();
file_t.close();
}发布于 2021-06-18 00:36:39
for(int j; j < Delta; j++){
您忘记了初始化j;您的意思是:
for (int j = 0; j < Delta; j++)
{intΔ= static_cast(tau/dt);std::vector hist_x((static_cast(tau/dt) - 1),0.0);std::vector hist_y((static_cast(tau/dt) - 1),0.0);
你从索引到增量−1,这意味着向量需要有增量元素,并且你少分配了一个;正确:
std::vector<double> hist_x(Delta, 0.0);
std::vector<double> hist_y(Delta, 0.0);https://stackoverflow.com/questions/68017245
复制相似问题