Использование dopri5 с библиотекой odeint boost

система уравнений

Привет. Я хочу развить эти уравнения во времени от нуля до 10 ^ 16 и начальных условий x (0) = 10 ^ 8 и y (0) = 0,5. Из-за зависимости уравнений от x в знаменателе я думаю, что использование odeint с runge_kutta_dopri5 является хорошим выбором из-за адаптивного шагового управления. Дело в том, что я плохо понимаю, как это сделать на практике, потому что у меня мало опыта в C ++ и odeint. Я много искал об использовании odeint, но примеры мне не помогли. Также я хочу остановить вычисления, когда x достигнет нуля, я видел это https://stackoverflow.com/questions/33334073/stop-integration-in-odeint-with-stiff-ode

основываясь на примерах, я написал это до сих пор безуспешно

#include <iostream>
#include <vector>
#include <cmath>
#include <boost/array.hpp>
#include <boost/numeric/odeint.hpp>

using namespace std;
using namespace boost::numeric::odeint;

const double b = 43.0e17;

typedef boost::array< double , 2 > state_type;

void binary(const state_type &x , state_type &dxdt , double t )
{
 dxdt[0] = -b*(64.0/5)*(1 + (73.0/24)*pow(x[1],2) 
   +  37.0/96)*pow(x[1],4) )/pow(x[0],3)*pow(1-pow(x[1],2),7.0/2);

 dxdt[1] = -b*(304.0/96)*x[1]*(1 + (121.0/304)*pow(x[1],2))
 /pow(x[0],4)*pow((1 - pow(x[1],2)),5.0/2);

 }

 void write_binary( const state_type &x , const double t )
{
cout << t << '\t' << x[0] << '\t' << x[1] << '\t' << x[2] << endl;
}
 //I dont know what this does but the examples used it
struct streaming_observer
{
 std::ostream& m_out;

streaming_observer( std::ostream &out ) : m_out( out ) { }

template< class State , class Time >
void operator()( const State &x , Time t ) const
{
    m_out << t;
    for( size_t i=0 ; i<x.size() ; ++i ) m_out << "\t" << x[i] ;
    m_out << "\n";
 }
};
 //This was a first try with a given stepper but i want to replace it
 int main(int argc, char **argv)
  {
state_type x = { 20.871e8 , 0.5  }; // initial conditions
integrate( binary , x , 0.0 , 1000.0 , 0.1 , write_binary );
}

Когда я скомпилировал его, я получил эту ошибку

Внутренняя ошибка программы - утверждение (i ‹N) не выполнено в const T & boost :: array :: operator [] (boost :: array :: size_type) const [with T = double; длинное целое число без знака N = 2ul; boost :: array :: const_reference = const double &; boost :: array :: size_type = long unsigned int]: /usr/include/boost/array.hpp(129): вне диапазона Прервано (ядро выгружено)

Как мне получить эту работу?


person tcm    schedule 17.05.2016    source источник
comment
ваши переменные состояния - это только два x [0] и x [1], как указано в state_type x = { 20.871e8 , 0.5 };.   -  person CroCo    schedule 20.05.2016


Ответы (1)


функция write_binary записывает поверх границ массива и вызывает утверждение. x[2] недействителен.

person headmyshoulder    schedule 18.05.2016