Squashed 'third_party/boostorg/odeint/' content from commit 6ff2719

Change-Id: If4892e29c1a5e6cf3a7aa51486a2725c251b0c7d
git-subtree-dir: third_party/boostorg/odeint
git-subtree-split: 6ff2719b6907b86596c3d43e88c1bcfdf29df560
diff --git a/examples/stochastic_euler.cpp b/examples/stochastic_euler.cpp
new file mode 100644
index 0000000..c98d27b
--- /dev/null
+++ b/examples/stochastic_euler.cpp
@@ -0,0 +1,147 @@
+/*
+ libs/numeric/odeint/examples/stochastic_euler.hpp
+
+ Copyright 2012 Karsten Ahnert
+ Copyright 2012 Mario Mulansky
+
+ Stochastic euler stepper example and Ornstein-Uhlenbeck process
+
+ 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)
+ */
+
+
+#include <vector>
+#include <iostream>
+#include <boost/random.hpp>
+#include <boost/array.hpp>
+
+#include <boost/numeric/odeint.hpp>
+
+
+/*
+//[ stochastic_euler_class_definition
+template< size_t N > class stochastic_euler
+{
+public:
+
+    typedef boost::array< double , N > state_type;
+    typedef boost::array< double , N > deriv_type;
+    typedef double value_type;
+    typedef double time_type;
+    typedef unsigned short order_type;
+    typedef boost::numeric::odeint::stepper_tag stepper_category;
+
+    static order_type order( void ) { return 1; }
+
+    // ...
+};
+//]
+*/
+
+
+/*
+//[ stochastic_euler_do_step
+template< size_t N > class stochastic_euler
+{
+public:
+
+    // ...
+
+    template< class System >
+    void do_step( System system , state_type &x , time_type t , time_type dt ) const
+    {
+        deriv_type det , stoch ;
+        system.first( x , det );
+        system.second( x , stoch );
+        for( size_t i=0 ; i<x.size() ; ++i )
+            x[i] += dt * det[i] + sqrt( dt ) * stoch[i];
+    }
+};
+//]
+*/
+
+
+
+
+//[ stochastic_euler_class
+template< size_t N >
+class stochastic_euler
+{
+public:
+
+    typedef boost::array< double , N > state_type;
+    typedef boost::array< double , N > deriv_type;
+    typedef double value_type;
+    typedef double time_type;
+    typedef unsigned short order_type;
+
+    typedef boost::numeric::odeint::stepper_tag stepper_category;
+
+    static order_type order( void ) { return 1; }
+
+    template< class System >
+    void do_step( System system , state_type &x , time_type t , time_type dt ) const
+    {
+        deriv_type det , stoch ;
+        system.first( x , det );
+        system.second( x , stoch );
+        for( size_t i=0 ; i<x.size() ; ++i )
+            x[i] += dt * det[i] + sqrt( dt ) * stoch[i];
+    }
+};
+//]
+
+
+
+//[ stochastic_euler_ornstein_uhlenbeck_def
+const static size_t N = 1;
+typedef boost::array< double , N > state_type;
+
+struct ornstein_det
+{
+    void operator()( const state_type &x , state_type &dxdt ) const
+    {
+        dxdt[0] = -x[0];
+    }
+};
+
+struct ornstein_stoch
+{
+    boost::mt19937 &m_rng;
+    boost::normal_distribution<> m_dist;
+
+  ornstein_stoch( boost::mt19937 &rng , double sigma ) : m_rng( rng ) , m_dist( 0.0 , sigma ) { }
+
+    void operator()( const state_type &x , state_type &dxdt )
+    {
+        dxdt[0] = m_dist( m_rng );
+    }
+};
+//]
+
+struct streaming_observer
+{
+    template< class State >
+    void operator()( const State &x , double t ) const
+    {
+        std::cout << t << "\t" << x[0] << "\n";
+    }
+};
+
+
+int main( int argc , char **argv )
+{
+    using namespace std;
+    using namespace boost::numeric::odeint;
+
+    //[ ornstein_uhlenbeck_main
+    boost::mt19937 rng;
+    double dt = 0.1;
+    state_type x = {{ 1.0 }};
+    integrate_const( stochastic_euler< N >() , make_pair( ornstein_det() , ornstein_stoch( rng , 1.0 ) ),
+            x , 0.0 , 10.0 , dt , streaming_observer() );
+    //]
+    return 0;
+}