123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- /*
- * Copyright 2011-2012 Mario Mulansky
- * Copyright 2012-2013 Karsten Ahnert
- *
- * Distributed under the Boost Software License, Version 1.0.
- * (See accompanying file LICENSE_1_0.txt or
- * copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- * Example for self defined vector type.
- */
- #include <vector>
- #include <boost/numeric/odeint.hpp>
- //[my_vector
- template< size_t MAX_N >
- class my_vector
- {
- typedef std::vector< double > vector;
- public:
- typedef vector::iterator iterator;
- typedef vector::const_iterator const_iterator;
- public:
- my_vector( const size_t N )
- : m_v( N )
- {
- m_v.reserve( MAX_N );
- }
- my_vector()
- : m_v()
- {
- m_v.reserve( MAX_N );
- }
- // ... [ implement container interface ]
- //]
- const double & operator[]( const size_t n ) const
- { return m_v[n]; }
- double & operator[]( const size_t n )
- { return m_v[n]; }
- iterator begin()
- { return m_v.begin(); }
- const_iterator begin() const
- { return m_v.begin(); }
- iterator end()
- { return m_v.end(); }
-
- const_iterator end() const
- { return m_v.end(); }
- size_t size() const
- { return m_v.size(); }
- void resize( const size_t n )
- { m_v.resize( n ); }
- private:
- std::vector< double > m_v;
- };
- //[my_vector_resizeable
- // define my_vector as resizeable
- namespace boost { namespace numeric { namespace odeint {
- template<size_t N>
- struct is_resizeable< my_vector<N> >
- {
- typedef boost::true_type type;
- static const bool value = type::value;
- };
- } } }
- //]
- typedef my_vector<3> state_type;
- void lorenz( const state_type &x , state_type &dxdt , const double t )
- {
- const double sigma( 10.0 );
- const double R( 28.0 );
- const double b( 8.0 / 3.0 );
- dxdt[0] = sigma * ( x[1] - x[0] );
- dxdt[1] = R * x[0] - x[1] - x[0] * x[2];
- dxdt[2] = -b * x[2] + x[0] * x[1];
- }
- using namespace boost::numeric::odeint;
- int main()
- {
- state_type x(3);
- x[0] = 5.0 ; x[1] = 10.0 ; x[2] = 10.0;
- // make sure resizing is ON
- BOOST_STATIC_ASSERT( is_resizeable<state_type>::value == true );
- // my_vector works with range_algebra as it implements
- // the required parts of a container interface
- // no further work is required
- integrate_const( runge_kutta4< state_type >() , lorenz , x , 0.0 , 10.0 , 0.1 );
- }
|