2
0
mirror of https://github.com/boostorg/odeint.git synced 2026-01-26 06:42:23 +00:00

Ideas taylor added, a ode solver using the taylor expansion of the rhs of the ode

This commit is contained in:
karsten
2011-04-03 15:13:01 +00:00
parent 0ba59f7fa8
commit 73d76a49ae
5 changed files with 836 additions and 0 deletions

View File

@@ -0,0 +1,14 @@
# (C) Copyright 2010 : Karsten Ahnert, Mario Mulansky
# 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)
project
: requirements
<define>BOOST_ALL_NO_LIB=1
<include>../../../../..
;
exe taylor_main : taylor_main.cpp ;
exe taylor_lorenz_evol : taylor_lorenz_evol.cpp ;

View File

@@ -0,0 +1,353 @@
(* Content-type: application/mathematica *)
(*** Wolfram Notebook File ***)
(* http://www.wolfram.com/nb *)
(* CreatedBy='Mathematica 7.0' *)
(*CacheID: 234*)
(* Internal cache information:
NotebookFileLineBreakTest
NotebookFileLineBreakTest
NotebookDataPosition[ 145, 7]
NotebookDataLength[ 10200, 344]
NotebookOptionsPosition[ 9018, 300]
NotebookOutlinePosition[ 9356, 315]
CellTagsIndexPosition[ 9313, 312]
WindowFrame->Normal*)
(* Beginning of Notebook Content *)
Notebook[{
Cell[BoxData[{
RowBox[{
RowBox[{"\[Sigma]", "=", "10"}], ";"}], "\[IndentingNewLine]",
RowBox[{
RowBox[{"R", "=", "28"}], ";"}], "\[IndentingNewLine]",
RowBox[{
RowBox[{"b", "=",
RowBox[{"8", "/", "3"}]}], ";"}], "\[IndentingNewLine]",
RowBox[{
RowBox[{"fx", "[", "t_", "]"}], ":=",
RowBox[{"\[Sigma]",
RowBox[{"(",
RowBox[{
RowBox[{"y", "[", "t", "]"}], "-",
RowBox[{"x", "[", "t", "]"}]}], ")"}]}]}], "\[IndentingNewLine]",
RowBox[{
RowBox[{"fy", "[", "t_", "]"}], ":=",
RowBox[{
RowBox[{"R", " ",
RowBox[{"x", "[", "t", "]"}]}], "-",
RowBox[{"y", "[", "t", "]"}], "-",
RowBox[{
RowBox[{"x", "[", "t", "]"}], " ",
RowBox[{"z", "[", "t", "]"}]}]}]}], "\[IndentingNewLine]",
RowBox[{
RowBox[{"fz", "[", "t_", "]"}], ":=",
RowBox[{
RowBox[{
RowBox[{"x", "[", "t", "]"}],
RowBox[{"y", "[", "t", "]"}]}], "-",
RowBox[{"b", " ",
RowBox[{"z", "[", "t", "]"}]}]}]}]}], "Input",
CellChangeTimes->{{3.510824673195559*^9, 3.5108246955668364`*^9}, {
3.510824728655014*^9, 3.510824774844098*^9}}],
Cell[BoxData[
RowBox[{
RowBox[{"vec", "=",
RowBox[{"{",
RowBox[{
RowBox[{"fx", "[", "t", "]"}], ",",
RowBox[{"fy", "[", "t", "]"}], ",",
RowBox[{"fz", "[", "t", "]"}]}], "}"}]}], ";"}]], "Input",
CellChangeTimes->{{3.5108247955762157`*^9, 3.510824808339299*^9}}],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"dx", "=",
RowBox[{
RowBox[{
RowBox[{"vec", "/.",
RowBox[{
RowBox[{"x", "[", "t", "]"}], "\[Rule]", "10"}]}], "/.",
RowBox[{
RowBox[{"y", "[", "t", "]"}], "\[Rule]", "10"}]}], "/.",
RowBox[{
RowBox[{"z", "[", "t", "]"}], "\[Rule]", "10"}]}]}]], "Input",
CellChangeTimes->{{3.5108248103120823`*^9, 3.510824843576672*^9}}],
Cell[BoxData[
RowBox[{"{",
RowBox[{"0", ",", "170", ",",
FractionBox["220", "3"]}], "}"}]], "Output",
CellChangeTimes->{3.510824811744413*^9, 3.510824844343238*^9}]
}, Open ]],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"ddx", "=",
RowBox[{
RowBox[{
RowBox[{
RowBox[{
RowBox[{
RowBox[{
RowBox[{"D", "[",
RowBox[{"vec", ",", "t"}], "]"}], "/.",
RowBox[{
RowBox[{"x", "[", "t", "]"}], "\[Rule]", "10"}]}], "/.",
RowBox[{
RowBox[{"y", "[", "t", "]"}], "\[Rule]", "10"}]}], "/.",
RowBox[{
RowBox[{"z", "[", "t", "]"}], "\[Rule]", "10"}]}], "/.",
RowBox[{
RowBox[{
RowBox[{"x", "'"}], "[", "t", "]"}], "\[Rule]", "0"}]}], "/.",
RowBox[{
RowBox[{
RowBox[{"y", "'"}], "[", "t", "]"}], "\[Rule]", "170"}]}], "/.",
RowBox[{
RowBox[{
RowBox[{"z", "'"}], "[", "t", "]"}], "\[Rule]",
RowBox[{"220", "/", "3"}]}]}]}]], "Input",
CellChangeTimes->{{3.510824847695149*^9, 3.510824889430078*^9}}],
Cell[BoxData[
RowBox[{"{",
RowBox[{"1700", ",",
RowBox[{"-",
FractionBox["2710", "3"]}], ",",
FractionBox["13540", "9"]}], "}"}]], "Output",
CellChangeTimes->{{3.510824862798667*^9, 3.510824892253048*^9}}]
}, Open ]],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"dddx", "=",
RowBox[{
RowBox[{
RowBox[{
RowBox[{
RowBox[{
RowBox[{
RowBox[{
RowBox[{
RowBox[{
RowBox[{"D", "[",
RowBox[{"vec", ",",
RowBox[{"{",
RowBox[{"t", ",", "2"}], "}"}]}], "]"}], "/.",
RowBox[{
RowBox[{"x", "[", "t", "]"}], "\[Rule]", "10"}]}], "/.",
RowBox[{
RowBox[{"y", "[", "t", "]"}], "\[Rule]", "10"}]}], "/.",
RowBox[{
RowBox[{"z", "[", "t", "]"}], "\[Rule]", "10"}]}], "/.",
RowBox[{
RowBox[{
RowBox[{"x", "'"}], "[", "t", "]"}], "\[Rule]", "0"}]}], "/.",
RowBox[{
RowBox[{
RowBox[{"y", "'"}], "[", "t", "]"}], "\[Rule]", "170"}]}], "/.",
RowBox[{
RowBox[{
RowBox[{"z", "'"}], "[", "t", "]"}], "\[Rule]",
RowBox[{"220", "/", "3"}]}]}], "/.",
RowBox[{
RowBox[{
RowBox[{"x", "''"}], "[", "t", "]"}], "\[Rule]", "1700"}]}], "/.",
RowBox[{
RowBox[{
RowBox[{"y", "''"}], "[", "t", "]"}], "\[Rule]",
RowBox[{
RowBox[{"-", "2710"}], "/", "3"}]}]}], "/.",
RowBox[{
RowBox[{
RowBox[{"z", "''"}], "[", "t", "]"}], "\[Rule]",
RowBox[{"13540", "/", "9"}]}]}]}]], "Input",
CellChangeTimes->{{3.5108248942284517`*^9, 3.510824926935175*^9}}],
Cell[BoxData[
RowBox[{"{",
RowBox[{
RowBox[{"-",
FractionBox["78100", "3"]}], ",",
FractionBox["148130", "9"], ",",
FractionBox["106780", "27"]}], "}"}]], "Output",
CellChangeTimes->{3.510824928988983*^9}]
}, Open ]],
Cell[CellGroupData[{
Cell[BoxData[{
RowBox[{"N", "[", "dx", "]"}], "\[IndentingNewLine]",
RowBox[{"N", "[", "ddx", "]"}], "\[IndentingNewLine]",
RowBox[{"N", "[", "dddx", "]"}]}], "Input",
CellChangeTimes->{{3.510824932150373*^9, 3.510824938416258*^9}}],
Cell[BoxData[
RowBox[{"{",
RowBox[{"0.`", ",", "170.`", ",", "73.33333333333333`"}], "}"}]], "Output",
CellChangeTimes->{3.510824939061275*^9}],
Cell[BoxData[
RowBox[{"{",
RowBox[{"1700.`", ",",
RowBox[{"-", "903.3333333333334`"}], ",", "1504.4444444444443`"}],
"}"}]], "Output",
CellChangeTimes->{3.5108249391281633`*^9}],
Cell[BoxData[
RowBox[{"{",
RowBox[{
RowBox[{"-", "26033.333333333332`"}], ",", "16458.88888888889`", ",",
"3954.814814814815`"}], "}"}]], "Output",
CellChangeTimes->{3.510824939152525*^9}]
}, Open ]],
Cell[CellGroupData[{
Cell[BoxData[{
RowBox[{
RowBox[{"dt", "=", "0.1"}], ";"}], "\[IndentingNewLine]",
RowBox[{"dx1", "=",
RowBox[{
RowBox[{"1", "/", "10"}], " ", "dx"}]}], "\[IndentingNewLine]",
RowBox[{"ddx1", "=",
RowBox[{
RowBox[{
RowBox[{"1", "/", "100"}], "/", "2"}], "ddx"}]}], "\[IndentingNewLine]",
RowBox[{"dddx1", "=",
RowBox[{
RowBox[{
RowBox[{"1", "/", "1000"}], "/", "6"}], "dddx"}]}]}], "Input",
CellChangeTimes->{{3.5108251832490597`*^9, 3.510825322790757*^9}, {
3.510825737885933*^9, 3.510825758949971*^9}, {3.510825802567717*^9,
3.510825805399754*^9}}],
Cell[BoxData[
RowBox[{"{",
RowBox[{"0", ",", "17", ",",
FractionBox["22", "3"]}], "}"}]], "Output",
CellChangeTimes->{{3.510825209963582*^9, 3.5108252877049*^9},
3.510825323504698*^9, 3.510825760025854*^9, 3.510825805994877*^9}],
Cell[BoxData[
RowBox[{"{",
RowBox[{
FractionBox["17", "2"], ",",
RowBox[{"-",
FractionBox["271", "60"]}], ",",
FractionBox["677", "90"]}], "}"}]], "Output",
CellChangeTimes->{{3.510825209963582*^9, 3.5108252877049*^9},
3.510825323504698*^9, 3.510825760025854*^9, 3.51082580600082*^9}],
Cell[BoxData[
RowBox[{"{",
RowBox[{
RowBox[{"-",
FractionBox["781", "180"]}], ",",
FractionBox["14813", "5400"], ",",
FractionBox["5339", "8100"]}], "}"}]], "Output",
CellChangeTimes->{{3.510825209963582*^9, 3.5108252877049*^9},
3.510825323504698*^9, 3.510825760025854*^9, 3.5108258060061197`*^9}]
}, Open ]],
Cell[CellGroupData[{
Cell[BoxData[{
RowBox[{"N", "[",
RowBox[{"dx1", ",", "20"}], "]"}], "\[IndentingNewLine]",
RowBox[{"N", "[",
RowBox[{"ddx1", ",", "20"}], "]"}], "\[IndentingNewLine]",
RowBox[{"N", "[",
RowBox[{"dddx1", ",", "20"}], "]"}]}], "Input",
CellChangeTimes->{{3.5108252915121098`*^9, 3.510825294371749*^9}, {
3.510825326753573*^9, 3.5108253314518747`*^9}}],
Cell[BoxData[
RowBox[{"{",
RowBox[{
"0", ",", "17.`20.", ",", "7.33333333333333333333333333333333333333`20."}],
"}"}]], "Output",
CellChangeTimes->{3.510825295082189*^9, 3.510825332149527*^9,
3.510825761579811*^9, 3.510825806943115*^9}],
Cell[BoxData[
RowBox[{"{",
RowBox[{"8.5`20.", ",",
RowBox[{
"-", "4.5166666666666666666666666666666666666658830037661184749947`20."}],
",", "7.52222222222222222222222222222222222222`20."}], "}"}]], "Output",
CellChangeTimes->{3.510825295082189*^9, 3.510825332149527*^9,
3.510825761579811*^9, 3.510825806948196*^9}],
Cell[BoxData[
RowBox[{"{",
RowBox[{
RowBox[{
"-", "4.3388888888888888888888888888888888888896072465477247312549`20."}],
",", "2.7431481481481481481481481481481481481481481481481481481482`20.",
",", "0.6591358024691358024691358024691358024691358024691358024691`20."}],
"}"}]], "Output",
CellChangeTimes->{3.510825295082189*^9, 3.510825332149527*^9,
3.510825761579811*^9, 3.510825806952417*^9}]
}, Open ]]
},
WindowSize->{640, 750},
WindowMargins->{{148, Automatic}, {Automatic, 27}},
FrontEndVersion->"7.0 for Linux x86 (64-bit) (November 11, 2008)",
StyleDefinitions->"Default.nb"
]
(* End of Notebook Content *)
(* Internal cache information *)
(*CellTagsOutline
CellTagsIndex->{}
*)
(*CellTagsIndex
CellTagsIndex->{}
*)
(*NotebookFileOutline
Notebook[{
Cell[545, 20, 1090, 33, 143, "Input"],
Cell[1638, 55, 292, 8, 32, "Input"],
Cell[CellGroupData[{
Cell[1955, 67, 384, 11, 32, "Input"],
Cell[2342, 80, 173, 4, 46, "Output"]
}, Open ]],
Cell[CellGroupData[{
Cell[2552, 89, 830, 26, 55, "Input"],
Cell[3385, 117, 223, 6, 46, "Output"]
}, Open ]],
Cell[CellGroupData[{
Cell[3645, 128, 1387, 43, 99, "Input"],
Cell[5035, 173, 226, 7, 46, "Output"]
}, Open ]],
Cell[CellGroupData[{
Cell[5298, 185, 238, 4, 77, "Input"],
Cell[5539, 191, 148, 3, 31, "Output"],
Cell[5690, 196, 189, 5, 31, "Output"],
Cell[5882, 203, 200, 5, 31, "Output"]
}, Open ]],
Cell[CellGroupData[{
Cell[6119, 213, 591, 16, 99, "Input"],
Cell[6713, 231, 241, 5, 46, "Output"],
Cell[6957, 238, 309, 8, 46, "Output"],
Cell[7269, 248, 322, 8, 46, "Output"]
}, Open ]],
Cell[CellGroupData[{
Cell[7628, 261, 366, 8, 77, "Input"],
Cell[7997, 271, 249, 6, 31, "Output"],
Cell[8249, 279, 333, 7, 52, "Output"],
Cell[8585, 288, 417, 9, 52, "Output"]
}, Open ]]
}
]
*)
(* End of internal cache information *)

View File

@@ -0,0 +1,314 @@
/*
* taylor.hpp
*
* Created on: Apr 2, 2011
* Author: karsten
*/
#ifndef BOOST_NUMERIC_ODEINT_STEPPER_TAYLOR_HPP_
#define BOOST_NUMERIC_ODEINT_STEPPER_TAYLOR_HPP_
#include <tr1/array>
// general boost includes
#include <boost/static_assert.hpp>
#include <boost/math/special_functions/binomial.hpp>
#include <boost/math/special_functions/factorials.hpp>
// fusion includes
#include <boost/fusion/include/is_sequence.hpp>
#include <boost/fusion/include/size.hpp>
#include <boost/fusion/include/at.hpp>
// mpl includes
#include <boost/mpl/range_c.hpp>
#include <boost/mpl/for_each.hpp>
// proto includes
#include <boost/proto/proto.hpp>
namespace boost {
namespace numeric {
namespace odeint {
namespace taylor_adf
{
namespace proto = boost::proto;
template<int I> struct placeholder {};
proto::terminal< placeholder< 0 > >::type const arg1 = {{}};
proto::terminal< placeholder< 1 > >::type const arg2 = {{}};
proto::terminal< placeholder< 2 > >::type const arg3 = {{}};
template< class State , size_t Order >
struct context_derivs : proto::callable_context< context_derivs< State , Order > const >
{
typedef double result_type;
const State &m_x;
std::tr1::array< State , Order > &m_derivs;
size_t m_which;
context_derivs( const State &x , std::tr1::array< State , Order > &derivs , size_t which )
: m_x( x ) , m_derivs( derivs ) , m_which( which ) { }
template< int I >
double operator()( proto::tag::terminal , placeholder<I> ) const
{
return ( m_which == 0 ) ? m_x[I] : m_derivs[m_which-1][I];
}
double operator()( proto::tag::terminal , double x ) const
{
return ( m_which == 0 ) ? x : 0.0;
}
template< typename L , typename R >
double operator ()( proto::tag::plus , L const &l , R const &r ) const
{
return proto::eval( l , context_derivs< State , Order >( m_x , m_derivs , m_which ) ) +
proto::eval( r , context_derivs< State , Order >( m_x , m_derivs , m_which ) );
}
template< typename L , typename R >
double operator ()( proto::tag::minus , L const &l , R const &r ) const
{
return proto::eval( l , context_derivs< State , Order >( m_x , m_derivs , m_which ) ) -
proto::eval( r , context_derivs< State , Order >( m_x , m_derivs , m_which ) );
}
template< typename L , typename R >
double operator ()( proto::tag::multiplies , L const &l , R const &r ) const
{
double tmp = 0.0;
for( size_t k=0 ; k<=m_which ; ++k )
{
tmp += boost::math::binomial_coefficient< double >( m_which , k )
* proto::eval( l , context_derivs< State , Order >( m_x , m_derivs , k ) )
* proto::eval( r , context_derivs< State , Order >( m_x , m_derivs , m_which - k ) );
}
return tmp;
}
template< typename L , typename R >
double operator ()( proto::tag::divides , L const &l , R const &r ) const
{
return 0.0;
}
};
template< class System , class State , size_t Order >
struct eval_derivs
{
typedef std::tr1::array< State , Order > derivs_type;
System m_sys;
const State &m_x;
derivs_type &m_derivs;
size_t m_which;
double m_dt;
eval_derivs( System sys , const State &x , derivs_type &derivs , size_t which , double dt )
: m_sys( sys ) , m_x( x ) , m_derivs( derivs ) , m_which( which ) , m_dt( dt ) { }
template< class Index >
void operator()( Index )
{
m_derivs[m_which][ Index::value ] = m_dt / double( m_which + 1 ) * boost::proto::eval(
boost::fusion::at< Index >( m_sys ) ,
taylor_adf::context_derivs< State , Order >( m_x , m_derivs , m_which ) );
}
};
template< class System , class State , size_t Order >
eval_derivs< System , State , Order > make_eval_derivs( System sys , const State &x , std::tr1::array< State , Order > &derivs , size_t i , double dt )
{
return eval_derivs< System , State , Order >( sys , x , derivs , i , dt );
}
}
template< size_t N , size_t Order >
class taylor
{
public:
static const size_t dim = N;
static const size_t order = Order;
typedef double value_type;
typedef value_type time_type;
typedef std::tr1::array< value_type , dim > state_type;
typedef std::tr1::array< state_type , order > derivs_type;
template< class System >
void do_step( System sys , state_type &x , value_type t , value_type dt )
{
BOOST_STATIC_ASSERT(( boost::fusion::traits::is_sequence< System >::value ));
BOOST_STATIC_ASSERT(( size_t( boost::fusion::result_of::size< System >::value ) == dim ));
for( size_t i=0 ; i<Order ; ++i )
{
boost::mpl::for_each< boost::mpl::range_c< size_t , 0 , dim > >( make_eval_derivs( sys , x , m_derivs , i , dt ) );
}
for( size_t i=0 ; i<N ; ++i )
{
for( size_t k=0 ; k<order ; ++k )
x[i] += m_derivs[k][i];
}
}
const derivs_type& get_last_derivs( void ) const
{
return m_derivs;
}
private:
derivs_type m_derivs;
};
namespace taylor_adf2
{
namespace proto = boost::proto;
template<int I> struct placeholder {};
proto::terminal< placeholder< 0 > >::type const arg1 = {{}};
proto::terminal< placeholder< 1 > >::type const arg2 = {{}};
proto::terminal< placeholder< 2 > >::type const arg3 = {{}};
template< class State , size_t Order >
struct context_derivs : proto::callable_context< context_derivs< State , Order > const >
{
typedef double result_type;
const State &m_x;
std::tr1::array< State , Order > &m_derivs;
size_t m_which;
context_derivs( const State &x , std::tr1::array< State , Order > &derivs , size_t which )
: m_x( x ) , m_derivs( derivs ) , m_which( which ) { }
template< int I >
double operator()( proto::tag::terminal , placeholder<I> ) const
{
return ( m_which == 0 ) ? m_x[I] : m_derivs[m_which-1][I];
}
double operator()( proto::tag::terminal , double x ) const
{
return ( m_which == 0 ) ? x : 0.0;
}
template< typename L , typename R >
double operator ()( proto::tag::plus , L const &l , R const &r ) const
{
return proto::eval( l , context_derivs< State , Order >( m_x , m_derivs , m_which ) ) +
proto::eval( r , context_derivs< State , Order >( m_x , m_derivs , m_which ) );
}
template< typename L , typename R >
double operator ()( proto::tag::minus , L const &l , R const &r ) const
{
return proto::eval( l , context_derivs< State , Order >( m_x , m_derivs , m_which ) ) -
proto::eval( r , context_derivs< State , Order >( m_x , m_derivs , m_which ) );
}
template< typename L , typename R >
double operator ()( proto::tag::multiplies , L const &l , R const &r ) const
{
double tmp = 0.0;
for( size_t k=0 ; k<=m_which ; ++k )
{
tmp += boost::math::binomial_coefficient< double >( m_which , k )
* proto::eval( l , context_derivs< State , Order >( m_x , m_derivs , k ) )
* proto::eval( r , context_derivs< State , Order >( m_x , m_derivs , m_which - k ) );
}
return tmp;
}
template< typename L , typename R >
double operator ()( proto::tag::divides , L const &l , R const &r ) const
{
return 0.0;
}
};
template< class System , class State , size_t Order >
struct eval_derivs
{
typedef std::tr1::array< State , Order > derivs_type;
System m_sys;
const State &m_x;
derivs_type &m_derivs;
size_t m_which;
eval_derivs( System sys , const State &x , derivs_type &derivs , size_t which )
: m_sys( sys ) , m_x( x ) , m_derivs( derivs ) , m_which( which ) { }
template< class Index >
void operator()( Index )
{
m_derivs[m_which][ Index::value ] = boost::proto::eval(
boost::fusion::at< Index >( m_sys ) ,
taylor_adf::context_derivs< State , Order >( m_x , m_derivs , m_which ) );
}
};
template< class System , class State , size_t Order >
eval_derivs< System , State , Order > make_eval_derivs( System sys , const State &x , std::tr1::array< State , Order > &derivs , size_t i )
{
return eval_derivs< System , State , Order >( sys , x , derivs , i );
}
}
} // namespace odeint
} // namespace numeric
} // namespace boost
#endif /* BOOST_NUMERIC_ODEINT_STEPPER_TAYLOR_HPP_ */

View File

@@ -0,0 +1,79 @@
/*
* main.cpp
*
* Created on: Apr 2, 2011
* Author: karsten
*/
#include <iostream>
#include "taylor.hpp"
#include <boost/numeric/odeint/stepper/explicit_rk4.hpp>
#include <boost/fusion/include/make_vector.hpp>
template< typename T , size_t N >
std::ostream& operator<<( std::ostream& out , const std::tr1::array< T , N > &x )
{
if( !x.empty() ) out << x[0];
for( size_t i=1 ; i<x.size() ; ++i ) out << "\t" << x[i];
return out;
}
typedef boost::numeric::odeint::taylor< 3 , 11 > taylor_type;
typedef taylor_type::state_type state_type;
typedef boost::numeric::odeint::explicit_rk4< state_type > rk4_type;
const double sigma = 10.0;
const double R = 28.0;
const double b = 8.0 / 3.0;
void lorenz( const state_type &x , state_type &dxdt , double t )
{
dxdt[0] = sigma * ( x[1] - x[0] );
dxdt[1] = R * x[0] - x[1] - x[0] * x[2];
dxdt[2] = x[0]*x[1] - b * x[2];
}
namespace fusion = boost::fusion;
using namespace std;
using namespace boost::numeric::odeint;
using boost::numeric::odeint::taylor_adf::arg1;
using boost::numeric::odeint::taylor_adf::arg2;
using boost::numeric::odeint::taylor_adf::arg3;
int main( int argc , char **argv )
{
taylor_type tay;
rk4_type rk4;
state_type x1 = {{ 10.0 , 10.0 , 10.0 }} , x2 = x1;
const double dt = 0.1;
double t = 0.0;
for( size_t i=0 ; i<10000 ; ++i , t += dt )
{
tay.do_step(
fusion::make_vector
(
sigma * ( arg2 - arg1 ) ,
R * arg1 - arg2 - arg1 * arg3 ,
arg1 * arg2 - b * arg3
) ,
x1 , t , dt );
rk4.do_step( lorenz , x2 , t , dt );
cout << t << "\t" << x1 << "\t" << x2 << "\n";
}
return 0;
}

View File

@@ -0,0 +1,76 @@
/*
* main.cpp
*
* Created on: Apr 2, 2011
* Author: karsten
*/
#include <iostream>
#include "taylor.hpp"
#include <boost/fusion/include/make_vector.hpp>
template< typename T , size_t N >
std::ostream& operator<<( std::ostream& out , const std::tr1::array< T , N > &x )
{
if( !x.empty() ) out << x[0];
for( size_t i=1 ; i<x.size() ; ++i ) out << "\t" << x[i];
return out;
}
typedef boost::numeric::odeint::taylor< 3 , 10 > taylor_type;
typedef taylor_type::state_type state_type;
typedef taylor_type::derivs_type derivs_type;
const double sigma = 10.0;
const double R = 28.0;
const double b = 8.0 / 3.0;
void lorenz( const state_type &x , state_type &dxdt , double t )
{
dxdt[0] = sigma * ( x[1] - x[0] );
dxdt[1] = R * x[0] - x[1] - x[0] * x[2];
dxdt[2] = x[0]*x[1] - b * x[2];
}
namespace fusion = boost::fusion;
using namespace std;
using namespace boost::numeric::odeint;
using boost::numeric::odeint::taylor_adf::arg1;
using boost::numeric::odeint::taylor_adf::arg2;
using boost::numeric::odeint::taylor_adf::arg3;
int main( int argc , char **argv )
{
taylor_type t;
state_type x = {{ 10.0 , 10.0 , 10.0 }} , dxdt = {{ 0.0 , 0.0 , 0.0 }} , xerr = {{ 0.0 , 0.0 , 0.0 }};
lorenz( x , dxdt , 0.0 );
cout << x << endl;
cout << dxdt << endl << endl;
t.do_step(
fusion::make_vector
(
sigma * ( arg2 - arg1 ) ,
R * arg1 - arg2 - arg1 * arg3 ,
arg1 * arg2 - b * arg3
) ,
x , 0.0 , 0.1 );
cout.precision( 14 );
const derivs_type &derivs = t.get_last_derivs();
for( size_t i=0 ; i<derivs.size() ; ++i )
cout << derivs[i] << endl;
return 0;
}