c ++ 11 — метод Рунге-Кутты о переполнении стека

я пытаюсь закодировать простой метод Рунге-Кутты

Аппроксимируемая функция и метод runge-kutta являются отдельными определениями, которые вызываются в цикле в главной функции.

Приближенные решения для y и t выталкиваются в отдельные векторы.

Я получаю следующие ошибки и пытаюсь понять, почему:
Снимок сообщения об ошибке

Код:

//Runge Kutta
#include "C:\Users\Erez\Documents\Dev C++ Projects\std_lib_facilities.h"
double f (double t,double y){
f = t + y;
return f;
}

double rk4funct (double t,double y,double d){
double k1, k2, k3, k4;
k1 = d * f(t, y);
k2 = d * f(t+0.5*d, y+0.5*k1);
k3 = d * f(t+0.5*d, y+0.5*k2);
k4 = d * f(t+d, y+k3);
return k1, k2, k3, k4;
}

int main (){

vector<double> yvector;
vector<double> tvector;
double y0 {0}; //initial y value
double t0 {0}; //initial time value
double d {0}; //step size
int n {0}; //number of iterations

cout << "Please input variables according to the following order: step size, y0, t0, n(# of iterations)\n";
cin >> d >> y0 >> t0 >> n;
yvector.push_back(y0);
tvector.push_back(t0);for (int i {0}; i<n; ++i;) {
rk4funct (tvector[i], yvector[i], d);
yvector[i+1] = yvector[i] + (d/6)*(k1+2k2+2k3+k4);
tvector[i+1] = tvector[i] + d; //same here.
}

}

-2

Решение

Если вы хотите использовать множественный возврат, вы можете использовать std :: tuple

std::tuple<double,double,double,double> rk4funct (double t,double y,double d){
double k1, k2, k3, k4;
k1 = d * f(t, y);
k2 = d * f(t+0.5*d, y+0.5*k1);
k3 = d * f(t+0.5*d, y+0.5*k2);
k4 = d * f(t+d, y+k3);
return std::make_tuple(k1, k2, k3, k4);
}

И возвращаемое значение может быть захвачено

for (int i {0}; i<n; ++i) {
double k1, k2, k3, k4;
auto ret = rk4funct (tvector[i], yvector[i], d);
k1 = std::get<0>(ret);
k2 = std::get<1>(ret);
k3 = std::get<2>(ret);
k4 = std::get<3>(ret);

yvector[i+1] = yvector[i] + (d/6)*(k1+2*k2+2*k3+k4);
tvector[i+1] = tvector[i] + d; //same here.
}

Код ошибки исправлен

//Runge Kutta
#include <iostream>
#include<vector>
#include <tuple>
using namespace std;

double f (double t,double y){
double f = t + y;
return f;
}std::tuple<double,double,double,double> rk4funct (double t,double y,double d){
double k1, k2, k3, k4;
k1 = d * f(t, y);
k2 = d * f(t+0.5*d, y+0.5*k1);
k3 = d * f(t+0.5*d, y+0.5*k2);
k4 = d * f(t+d, y+k3);
return std::make_tuple(k1, k2, k3, k4);
}

int main (){

vector<double> yvector;
vector<double> tvector;
double y0 {0}; //initial y value
double t0 {0}; //initial time value
double d {0}; //step size
int n {0}; //number of iterations

cout << "Please input variables according to the following order: step size, y0, t0, n(# of iterations)\n";
cin >> d >> y0 >> t0 >> n;
yvector.push_back(y0);
tvector.push_back(t0);for (int i {0}; i<n; ++i) {

double k1, k2, k3, k4;
auto ret = rk4funct (tvector[i], yvector[i], d);
k1 = std::get<0>(ret);
k2 = std::get<1>(ret);
k3 = std::get<2>(ret);
k4 = std::get<3>(ret);

yvector[i+1] = yvector[i] + (d/6)*(k1+2*k2+2*k3+k4);
tvector[i+1] = tvector[i] + d; //same here.
}

}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]