я пытаюсь закодировать простой метод Рунге-Кутты
Аппроксимируемая функция и метод 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.
}
}
Если вы хотите использовать множественный возврат, вы можете использовать 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.
}
}
Других решений пока нет …