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*))'

Может ли кто-нибудь помочь мне там? Спасибо за ваше время!

0 ответов

Другие вопросы по тегам