C++ integrate_adaptive().
Прежде всего мой код:
#include <iostream>
#include <fstream>
#include <boost/array.hpp>
#include <boost/numeric/odeint.hpp>
using namespace std;
using namespace boost::numeric::odeint;
typedef boost::array< double , 5 > state_type;
typedef runge_kutta_dopri5< double > stepper_type;
const double a = 10.;
const double chi = 0.8;
const double v = 8.;
const double p = 1.02;
const double u1 = 0.2;
const double u2 = 0.1;
const double ur = 0.25;
const double c = 0.0001;
fstream f;
std::ofstream file("odeint.txt");
// Def of the ODE System
void DGLS( const state_type &x , state_type &dxdt , double t )
{
dxdt[0] = -x[0]+a-(x[0]*x[4]*((x[1]/(1.+u2*x[2]))+c))-(p*x[0]*x[4]*(x[2]+c))-(chi*x[0]*x[4]*(x[3]+c));
dxdt[1] = -x[1]+((v*x[0]*x[4])/(1.+ur*x[3]))*((x[1]/(1.+u2*x[2]))+c);
dxdt[2] = -x[2]+(p*((v*x[0]*x[4])/(1.+ur*x[3]))*((x[2]+c)/(1.+u1*(x[1]/(1.+u2*x[2])))));
dxdt[3] = -x[3]+(chi*v*x[0]*x[4]*(x[3]+c));
dxdt[4] = -x[4]*(x[1]+x[2]+x[3]);
}
// write the Values of the odeint integrate steps in an odeint.txt file
void write_lorenz( const state_type &x , const double t )
{
file << t << '\t' << x[0] << '\t' << x[1] << '\t' << x[2] << '\t' << x[3] << '\t' << x[4] << endl;
}
// Def an injection. Raise the value of x[4] at certain t=time[i] by certain value of dosis[i]
void injection( const state_type &x , const double t , double time[11] , double dosis[11] )
{
for (int i=0; i<=10; i++)
{
if ( t == time[i] )
{
x[4] += dosis[i]; // this is LINE 47
}
}
}
int main(int argc, char **argv)
{
double time[11] = {1.,2.,3.,9.,10.,18.,28.,56.,84.,112.,140.};
double dosis[11] = {0.1,0.2,0.1,10,0.1,1,20,10,100,100,100};
f.open("odeint.txt", ios::out);
state_type x = { 10.0 , 0.001 , 0.0001, 0.001 , 0. };
// initial conditions
integrate_adaptive( make_controlled( 1E-12 , 1E-12 , stepper_type() ) , DGLS , x , 0.0 , 140.0 , 0.001 , write_lorenz , injection ); // integrate the ODE System in steps of 0.001
f.close();
}
Я хочу решить систему ODE с bib odeint для C++, но я не так хорошо знаком с синтаксисом C++, и поэтому я не могу исправить ошибку.
В функции 'void инъекция (const state_type&, double, double*, double*)':
Строка 47 [Ошибка] назначение места только для чтения '(& x)->boost::array::operator[](4ull)'
Я не знаю, что случилось с моей инъекцией там..
Но более важной проблемой является то, что я хочу решить ODE с шагом dt = 0,001. Я знаю, что мне нужна пошаговая функция, я объявляю ее в typedef runge kutta ... stepper type, но я получаю сообщение об ошибке от odeint bib встроить
[Ошибка] нет соответствующей функции для вызова 'integrate_adaptive(boost::numeric::odeint::result_of::make_controlled >::type, void (&)(const state_type&, state_type&, double), state_type&, double, double, double, void (&)(const state_type&, double), void (&)(const state_type&, double, double*, double*))'
Может ли кто-нибудь помочь мне там? Спасибо за ваше время!