steppers.html 150 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Steppers</title>
  5. <link rel="stylesheet" href="../../../../../../../doc/src/boostbook.css" type="text/css">
  6. <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
  7. <link rel="home" href="../../index.html" title="Chapter&#160;1.&#160;Boost.Numeric.Odeint">
  8. <link rel="up" href="../odeint_in_detail.html" title="odeint in detail">
  9. <link rel="prev" href="../odeint_in_detail.html" title="odeint in detail">
  10. <link rel="next" href="generation_functions.html" title="Generation functions">
  11. </head>
  12. <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
  13. <table cellpadding="2" width="100%"><tr>
  14. <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../logo.jpg"></td>
  15. <td align="center"><a href="../../../../../../../index.html">Home</a></td>
  16. <td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td>
  17. <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
  18. <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
  19. <td align="center"><a href="../../../../../../../more/index.htm">More</a></td>
  20. </tr></table>
  21. <hr>
  22. <div class="spirit-nav">
  23. <a accesskey="p" href="../odeint_in_detail.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../odeint_in_detail.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="generation_functions.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
  24. </div>
  25. <div class="section">
  26. <div class="titlepage"><div><div><h3 class="title">
  27. <a name="boost_numeric_odeint.odeint_in_detail.steppers"></a><a class="link" href="steppers.html" title="Steppers">Steppers</a>
  28. </h3></div></div></div>
  29. <div class="toc"><dl class="toc">
  30. <dt><span class="section"><a href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.explicit_steppers">Explicit
  31. steppers</a></span></dt>
  32. <dt><span class="section"><a href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.symplectic_solvers">Symplectic
  33. solvers</a></span></dt>
  34. <dt><span class="section"><a href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.implicit_solvers">Implicit
  35. solvers</a></span></dt>
  36. <dt><span class="section"><a href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.multistep_methods">Multistep
  37. methods</a></span></dt>
  38. <dt><span class="section"><a href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.controlled_steppers">Controlled
  39. steppers</a></span></dt>
  40. <dt><span class="section"><a href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.dense_output_steppers">Dense
  41. output steppers</a></span></dt>
  42. <dt><span class="section"><a href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.using_steppers">Using
  43. steppers</a></span></dt>
  44. <dt><span class="section"><a href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.stepper_overview">Stepper
  45. overview</a></span></dt>
  46. <dt><span class="section"><a href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.custom_steppers">Custom
  47. steppers</a></span></dt>
  48. <dt><span class="section"><a href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.custom_runge_kutta_steppers">Custom
  49. Runge-Kutta steppers</a></span></dt>
  50. </dl></div>
  51. <p>
  52. Solving ordinary differential equation numerically is usually done iteratively,
  53. that is a given state of an ordinary differential equation is iterated forward
  54. <span class="emphasis"><em>x(t) -&gt; x(t+dt) -&gt; x(t+2dt)</em></span>. The steppers in odeint
  55. perform one single step. The most general stepper type is described by the
  56. <a class="link" href="../concepts/stepper.html" title="Stepper">Stepper</a> concept.
  57. The stepper concepts of odeint are described in detail in section <a class="link" href="../concepts.html" title="Concepts">Concepts</a>,
  58. here we briefly present the mathematical and numerical details of the steppers.
  59. The <a class="link" href="../concepts/stepper.html" title="Stepper">Stepper</a>
  60. has two versions of the <code class="computeroutput"><span class="identifier">do_step</span></code>
  61. method, one with an in-place transform of the current state and one with
  62. an out-of-place transform:
  63. </p>
  64. <p>
  65. <code class="computeroutput"><span class="identifier">do_step</span><span class="special">(</span>
  66. <span class="identifier">sys</span> <span class="special">,</span>
  67. <span class="identifier">inout</span> <span class="special">,</span>
  68. <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">)</span></code>
  69. </p>
  70. <p>
  71. <code class="computeroutput"><span class="identifier">do_step</span><span class="special">(</span>
  72. <span class="identifier">sys</span> <span class="special">,</span>
  73. <span class="identifier">in</span> <span class="special">,</span>
  74. <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">out</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">)</span></code>
  75. </p>
  76. <p>
  77. The first parameter is always the system function - a function describing
  78. the ODE. In the first version the second parameter is the step which is here
  79. updated in-place and the third and the fourth parameters are the time and
  80. step size (the time step). After a call to <code class="computeroutput"><span class="identifier">do_step</span></code>
  81. the state <code class="computeroutput"><span class="identifier">inout</span></code> is updated
  82. and now represents an approximate solution of the ODE at time <span class="emphasis"><em>t+dt</em></span>.
  83. In the second version the second argument is the state of the ODE at time
  84. <span class="emphasis"><em>t</em></span>, the third argument is t, the fourth argument is the
  85. approximate solution at time <span class="emphasis"><em>t+dt</em></span> which is filled by
  86. <code class="computeroutput"><span class="identifier">do_step</span></code> and the fifth argument
  87. is the time step. Note that these functions do not change the time <code class="computeroutput"><span class="identifier">t</span></code>.
  88. </p>
  89. <p>
  90. <span class="bold"><strong>System functions</strong></span>
  91. </p>
  92. <p>
  93. Up to now, we have nothing said about the system function. This function
  94. depends on the stepper. For the explicit Runge-Kutta steppers this function
  95. can be a simple callable object hence a simple (global) C-function or a functor.
  96. The parameter syntax is <code class="computeroutput"><span class="identifier">sys</span><span class="special">(</span> <span class="identifier">x</span> <span class="special">,</span>
  97. <span class="identifier">dxdt</span> <span class="special">,</span>
  98. <span class="identifier">t</span> <span class="special">)</span></code>
  99. and it is assumed that it calculates <span class="emphasis"><em>dx/dt = f(x,t)</em></span>.
  100. The function structure in most cases looks like:
  101. </p>
  102. <p>
  103. </p>
  104. <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">sys</span><span class="special">(</span> <span class="keyword">const</span> <span class="identifier">state_type</span> <span class="special">&amp;</span> <span class="comment">/*x*/</span> <span class="special">,</span> <span class="identifier">state_type</span> <span class="special">&amp;</span> <span class="comment">/*dxdt*/</span> <span class="special">,</span> <span class="keyword">const</span> <span class="keyword">double</span> <span class="comment">/*t*/</span> <span class="special">)</span>
  105. <span class="special">{</span>
  106. <span class="comment">// ...</span>
  107. <span class="special">}</span>
  108. </pre>
  109. <p>
  110. </p>
  111. <p>
  112. Other types of system functions might represent Hamiltonian systems or systems
  113. which also compute the Jacobian needed in implicit steppers. For information
  114. which stepper uses which system function see the stepper table below. It
  115. might be possible that odeint will introduce new system types in near future.
  116. Since the system function is strongly related to the stepper type, such an
  117. introduction of a new stepper might result in a new type of system function.
  118. </p>
  119. <div class="section">
  120. <div class="titlepage"><div><div><h4 class="title">
  121. <a name="boost_numeric_odeint.odeint_in_detail.steppers.explicit_steppers"></a><a class="link" href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.explicit_steppers" title="Explicit steppers">Explicit
  122. steppers</a>
  123. </h4></div></div></div>
  124. <p>
  125. A first specialization are the explicit steppers. Explicit means that the
  126. new state of the ode can be computed explicitly from the current state
  127. without solving implicit equations. Such steppers have in common that they
  128. evaluate the system at time <span class="emphasis"><em>t</em></span> such that the result
  129. of <span class="emphasis"><em>f(x,t)</em></span> can be passed to the stepper. In odeint,
  130. the explicit stepper have two additional methods
  131. </p>
  132. <p>
  133. <code class="computeroutput"><span class="identifier">do_step</span><span class="special">(</span>
  134. <span class="identifier">sys</span> <span class="special">,</span>
  135. <span class="identifier">inout</span> <span class="special">,</span>
  136. <span class="identifier">dxdtin</span> <span class="special">,</span>
  137. <span class="identifier">t</span> <span class="special">,</span>
  138. <span class="identifier">dt</span> <span class="special">)</span></code>
  139. </p>
  140. <p>
  141. <code class="computeroutput"><span class="identifier">do_step</span><span class="special">(</span>
  142. <span class="identifier">sys</span> <span class="special">,</span>
  143. <span class="identifier">in</span> <span class="special">,</span>
  144. <span class="identifier">dxdtin</span> <span class="special">,</span>
  145. <span class="identifier">t</span> <span class="special">,</span>
  146. <span class="identifier">out</span> <span class="special">,</span>
  147. <span class="identifier">dt</span> <span class="special">)</span></code>
  148. </p>
  149. <p>
  150. Here, the additional parameter is the value of the function <span class="emphasis"><em>f</em></span>
  151. at state <span class="emphasis"><em>x</em></span> and time <span class="emphasis"><em>t</em></span>. An example
  152. is the Runge-Kutta stepper of fourth order:
  153. </p>
  154. <p>
  155. </p>
  156. <pre class="programlisting"><span class="identifier">runge_kutta4</span><span class="special">&lt;</span> <span class="identifier">state_type</span> <span class="special">&gt;</span> <span class="identifier">rk</span><span class="special">;</span>
  157. <span class="identifier">rk</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">sys1</span> <span class="special">,</span> <span class="identifier">inout</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span> <span class="comment">// In-place transformation of inout</span>
  158. <span class="identifier">rk</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">sys2</span> <span class="special">,</span> <span class="identifier">inout</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span> <span class="comment">// call with different system: Ok</span>
  159. <span class="identifier">rk</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">sys1</span> <span class="special">,</span> <span class="identifier">in</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">out</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span> <span class="comment">// Out-of-place transformation</span>
  160. <span class="identifier">rk</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">sys1</span> <span class="special">,</span> <span class="identifier">inout</span> <span class="special">,</span> <span class="identifier">dxdtin</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span> <span class="comment">// In-place tranformation of inout</span>
  161. <span class="identifier">rk</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">sys1</span> <span class="special">,</span> <span class="identifier">in</span> <span class="special">,</span> <span class="identifier">dxdtin</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">out</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span> <span class="comment">// Out-of-place transformation</span>
  162. </pre>
  163. <p>
  164. </p>
  165. <p>
  166. In fact, you do not need to call these two methods. You can always use
  167. the simpler <code class="computeroutput"><span class="identifier">do_step</span><span class="special">(</span>
  168. <span class="identifier">sys</span> <span class="special">,</span>
  169. <span class="identifier">inout</span> <span class="special">,</span>
  170. <span class="identifier">t</span> <span class="special">,</span>
  171. <span class="identifier">dt</span> <span class="special">)</span></code>,
  172. but sometimes the derivative of the state is needed externally to do some
  173. external computations or to perform some statistical analysis.
  174. </p>
  175. <p>
  176. A special class of the explicit steppers are the FSAL (first-same-as-last)
  177. steppers, where the last evaluation of the system function is also the
  178. first evaluation of the following step. For such steppers the <code class="computeroutput"><span class="identifier">do_step</span></code> method are slightly different:
  179. </p>
  180. <p>
  181. <code class="computeroutput"><span class="identifier">do_step</span><span class="special">(</span>
  182. <span class="identifier">sys</span> <span class="special">,</span>
  183. <span class="identifier">inout</span> <span class="special">,</span>
  184. <span class="identifier">dxdtinout</span> <span class="special">,</span>
  185. <span class="identifier">t</span> <span class="special">,</span>
  186. <span class="identifier">dt</span> <span class="special">)</span></code>
  187. </p>
  188. <p>
  189. <code class="computeroutput"><span class="identifier">do_step</span><span class="special">(</span>
  190. <span class="identifier">sys</span> <span class="special">,</span>
  191. <span class="identifier">in</span> <span class="special">,</span>
  192. <span class="identifier">dxdtin</span> <span class="special">,</span>
  193. <span class="identifier">out</span> <span class="special">,</span>
  194. <span class="identifier">dxdtout</span> <span class="special">,</span>
  195. <span class="identifier">t</span> <span class="special">,</span>
  196. <span class="identifier">dt</span> <span class="special">)</span></code>
  197. </p>
  198. <p>
  199. This method takes the derivative at time <code class="computeroutput"><span class="identifier">t</span></code>
  200. and also stores the derivative at time <span class="emphasis"><em>t+dt</em></span>. Calling
  201. these functions subsequently iterating along the solution one saves one
  202. function call by passing the result for dxdt into the next function call.
  203. However, when using FSAL steppers without supplying derivatives:
  204. </p>
  205. <p>
  206. <code class="computeroutput"><span class="identifier">do_step</span><span class="special">(</span>
  207. <span class="identifier">sys</span> <span class="special">,</span>
  208. <span class="identifier">inout</span> <span class="special">,</span>
  209. <span class="identifier">t</span> <span class="special">,</span>
  210. <span class="identifier">dt</span> <span class="special">)</span></code>
  211. </p>
  212. <p>
  213. the stepper internally satisfies the FSAL property which means it remembers
  214. the last <code class="computeroutput"><span class="identifier">dxdt</span></code> and uses
  215. it for the next step. An example for a FSAL stepper is the Runge-Kutta-Dopri5
  216. stepper. The FSAL trick is sometimes also referred as the Fehlberg trick.
  217. An example how the FSAL steppers can be used is
  218. </p>
  219. <p>
  220. </p>
  221. <pre class="programlisting"><span class="identifier">runge_kutta_dopri5</span><span class="special">&lt;</span> <span class="identifier">state_type</span> <span class="special">&gt;</span> <span class="identifier">rk</span><span class="special">;</span>
  222. <span class="identifier">rk</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">sys1</span> <span class="special">,</span> <span class="identifier">in</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">out</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span>
  223. <span class="identifier">rk</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">sys2</span> <span class="special">,</span> <span class="identifier">in</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">out</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span> <span class="comment">// DONT do this, sys1 is assumed</span>
  224. <span class="identifier">rk</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">sys2</span> <span class="special">,</span> <span class="identifier">in2</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">out</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span>
  225. <span class="identifier">rk</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">sys2</span> <span class="special">,</span> <span class="identifier">in3</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">out</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span> <span class="comment">// DONT do this, in2 is assumed</span>
  226. <span class="identifier">rk</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">sys1</span> <span class="special">,</span> <span class="identifier">inout</span> <span class="special">,</span> <span class="identifier">dxdtinout</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span>
  227. <span class="identifier">rk</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">sys2</span> <span class="special">,</span> <span class="identifier">inout</span> <span class="special">,</span> <span class="identifier">dxdtinout</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span> <span class="comment">// Ok, internal derivative is not used, dxdtinout is updated</span>
  228. <span class="identifier">rk</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">sys1</span> <span class="special">,</span> <span class="identifier">in</span> <span class="special">,</span> <span class="identifier">dxdtin</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">out</span> <span class="special">,</span> <span class="identifier">dxdtout</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span>
  229. <span class="identifier">rk</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">sys2</span> <span class="special">,</span> <span class="identifier">in</span> <span class="special">,</span> <span class="identifier">dxdtin</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">out</span> <span class="special">,</span> <span class="identifier">dxdtout</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span> <span class="comment">// Ok, internal derivative is not used</span>
  230. </pre>
  231. <p>
  232. </p>
  233. <div class="caution"><table border="0" summary="Caution">
  234. <tr>
  235. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Caution]" src="../../../../../../../doc/src/images/caution.png"></td>
  236. <th align="left">Caution</th>
  237. </tr>
  238. <tr><td align="left" valign="top"><p>
  239. The FSAL-steppers save the derivative at time <span class="emphasis"><em>t+dt</em></span>
  240. internally if they are called via <code class="computeroutput"><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">sys</span> <span class="special">,</span> <span class="identifier">in</span> <span class="special">,</span> <span class="identifier">out</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">)</span></code>. The first call of <code class="computeroutput"><span class="identifier">do_step</span></code>
  241. will initialize <code class="computeroutput"><span class="identifier">dxdt</span></code>
  242. and for all following calls it is assumed that the same system and the
  243. same state are used. If you use the FSAL stepper within the integrate
  244. functions this is taken care of automatically. See the <a class="link" href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.using_steppers" title="Using steppers">Using
  245. steppers</a> section for more details or look into the table below
  246. to see which stepper have an internal state.
  247. </p></td></tr>
  248. </table></div>
  249. </div>
  250. <div class="section">
  251. <div class="titlepage"><div><div><h4 class="title">
  252. <a name="boost_numeric_odeint.odeint_in_detail.steppers.symplectic_solvers"></a><a class="link" href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.symplectic_solvers" title="Symplectic solvers">Symplectic
  253. solvers</a>
  254. </h4></div></div></div>
  255. <p>
  256. As mentioned above symplectic solvers are used for Hamiltonian systems.
  257. Symplectic solvers conserve the phase space volume exactly and if the Hamiltonian
  258. system is energy conservative they also conserve the energy approximately.
  259. A special class of symplectic systems are separable systems which can be
  260. written in the form <span class="emphasis"><em>dqdt/dt = f1(p)</em></span>, <span class="emphasis"><em>dpdt/dt
  261. = f2(q)</em></span>, where <span class="emphasis"><em>(q,p)</em></span> are the state of system.
  262. The space of <span class="emphasis"><em>(q,p)</em></span> is sometimes referred as the phase
  263. space and <span class="emphasis"><em>q</em></span> and <span class="emphasis"><em>p</em></span> are said the
  264. be the phase space variables. Symplectic systems in this special form occur
  265. widely in nature. For example the complete classical mechanics as written
  266. down by Newton, Lagrange and Hamilton can be formulated in this framework.
  267. The separability of the system depends on the specific choice of coordinates.
  268. </p>
  269. <p>
  270. Symplectic systems can be solved by odeint by means of the symplectic_euler
  271. stepper and a symplectic Runge-Kutta-Nystrom method of fourth order. These
  272. steppers assume that the system is autonomous, hence the time will not
  273. explicitly occur. Further they fulfill in principle the default Stepper
  274. concept, but they expect the system to be a pair of callable objects. The
  275. first entry of this pair calculates <span class="emphasis"><em>f1(p)</em></span> while the
  276. second calculates <span class="emphasis"><em>f2(q)</em></span>. The syntax is <code class="computeroutput"><span class="identifier">sys</span><span class="special">.</span><span class="identifier">first</span><span class="special">(</span><span class="identifier">p</span><span class="special">,</span><span class="identifier">dqdt</span><span class="special">)</span></code> and <code class="computeroutput"><span class="identifier">sys</span><span class="special">.</span><span class="identifier">second</span><span class="special">(</span><span class="identifier">q</span><span class="special">,</span><span class="identifier">dpdt</span><span class="special">)</span></code>,
  277. where the first and second part can be again simple C-functions of functors.
  278. An example is the harmonic oscillator:
  279. </p>
  280. <p>
  281. </p>
  282. <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special">&lt;</span> <span class="keyword">double</span> <span class="special">,</span> <span class="number">1</span> <span class="special">&gt;</span> <span class="identifier">vector_type</span><span class="special">;</span>
  283. <span class="keyword">struct</span> <span class="identifier">harm_osc_f1</span>
  284. <span class="special">{</span>
  285. <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">const</span> <span class="identifier">vector_type</span> <span class="special">&amp;</span><span class="identifier">p</span> <span class="special">,</span> <span class="identifier">vector_type</span> <span class="special">&amp;</span><span class="identifier">dqdt</span> <span class="special">)</span>
  286. <span class="special">{</span>
  287. <span class="identifier">dqdt</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">p</span><span class="special">[</span><span class="number">0</span><span class="special">];</span>
  288. <span class="special">}</span>
  289. <span class="special">};</span>
  290. <span class="keyword">struct</span> <span class="identifier">harm_osc_f2</span>
  291. <span class="special">{</span>
  292. <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">const</span> <span class="identifier">vector_type</span> <span class="special">&amp;</span><span class="identifier">q</span> <span class="special">,</span> <span class="identifier">vector_type</span> <span class="special">&amp;</span><span class="identifier">dpdt</span> <span class="special">)</span>
  293. <span class="special">{</span>
  294. <span class="identifier">dpdt</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="special">-</span><span class="identifier">q</span><span class="special">[</span><span class="number">0</span><span class="special">];</span>
  295. <span class="special">}</span>
  296. <span class="special">};</span>
  297. </pre>
  298. <p>
  299. </p>
  300. <p>
  301. The state of such an ODE consist now also of two parts, the part for q
  302. (also called the coordinates) and the part for p (the momenta). The full
  303. example for the harmonic oscillator is now:
  304. </p>
  305. <p>
  306. </p>
  307. <pre class="programlisting"><span class="identifier">pair</span><span class="special">&lt;</span> <span class="identifier">vector_type</span> <span class="special">,</span> <span class="identifier">vector_type</span> <span class="special">&gt;</span> <span class="identifier">x</span><span class="special">;</span>
  308. <span class="identifier">x</span><span class="special">.</span><span class="identifier">first</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="number">1.0</span><span class="special">;</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">second</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="number">0.0</span><span class="special">;</span>
  309. <span class="identifier">symplectic_rkn_sb3a_mclachlan</span><span class="special">&lt;</span> <span class="identifier">vector_type</span> <span class="special">&gt;</span> <span class="identifier">rkn</span><span class="special">;</span>
  310. <span class="identifier">rkn</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">make_pair</span><span class="special">(</span> <span class="identifier">harm_osc_f1</span><span class="special">()</span> <span class="special">,</span> <span class="identifier">harm_osc_f2</span><span class="special">()</span> <span class="special">)</span> <span class="special">,</span> <span class="identifier">x</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span>
  311. </pre>
  312. <p>
  313. </p>
  314. <p>
  315. If you like to represent the system with one class you can easily bind
  316. two public method:
  317. </p>
  318. <p>
  319. </p>
  320. <pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">harm_osc</span>
  321. <span class="special">{</span>
  322. <span class="keyword">void</span> <span class="identifier">f1</span><span class="special">(</span> <span class="keyword">const</span> <span class="identifier">vector_type</span> <span class="special">&amp;</span><span class="identifier">p</span> <span class="special">,</span> <span class="identifier">vector_type</span> <span class="special">&amp;</span><span class="identifier">dqdt</span> <span class="special">)</span> <span class="keyword">const</span>
  323. <span class="special">{</span>
  324. <span class="identifier">dqdt</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">p</span><span class="special">[</span><span class="number">0</span><span class="special">];</span>
  325. <span class="special">}</span>
  326. <span class="keyword">void</span> <span class="identifier">f2</span><span class="special">(</span> <span class="keyword">const</span> <span class="identifier">vector_type</span> <span class="special">&amp;</span><span class="identifier">q</span> <span class="special">,</span> <span class="identifier">vector_type</span> <span class="special">&amp;</span><span class="identifier">dpdt</span> <span class="special">)</span> <span class="keyword">const</span>
  327. <span class="special">{</span>
  328. <span class="identifier">dpdt</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="special">-</span><span class="identifier">q</span><span class="special">[</span><span class="number">0</span><span class="special">];</span>
  329. <span class="special">}</span>
  330. <span class="special">};</span>
  331. </pre>
  332. <p>
  333. </p>
  334. <p>
  335. </p>
  336. <pre class="programlisting"><span class="identifier">harm_osc</span> <span class="identifier">h</span><span class="special">;</span>
  337. <span class="identifier">rkn</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">make_pair</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span> <span class="special">&amp;</span><span class="identifier">harm_osc</span><span class="special">::</span><span class="identifier">f1</span> <span class="special">,</span> <span class="identifier">h</span> <span class="special">,</span> <span class="identifier">_1</span> <span class="special">,</span> <span class="identifier">_2</span> <span class="special">)</span> <span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(</span> <span class="special">&amp;</span><span class="identifier">harm_osc</span><span class="special">::</span><span class="identifier">f2</span> <span class="special">,</span> <span class="identifier">h</span> <span class="special">,</span> <span class="identifier">_1</span> <span class="special">,</span> <span class="identifier">_2</span> <span class="special">)</span> <span class="special">)</span> <span class="special">,</span>
  338. <span class="identifier">x</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span>
  339. </pre>
  340. <p>
  341. </p>
  342. <p>
  343. Many Hamiltonian system can be written as <span class="emphasis"><em>dq/dt=p</em></span>,
  344. <span class="emphasis"><em>dp/dt=f(q)</em></span> which is computationally much easier than
  345. the full separable system. Very often, it is also possible to transform
  346. the original equations of motion to bring the system in this simplified
  347. form. This kind of system can be used in the symplectic solvers, by simply
  348. passing <span class="emphasis"><em>f(p)</em></span> to the <code class="computeroutput"><span class="identifier">do_step</span></code>
  349. method, again <span class="emphasis"><em>f(p)</em></span> will be represented by a simple
  350. C-function or a functor. Here, the above example of the harmonic oscillator
  351. can be written as
  352. </p>
  353. <p>
  354. </p>
  355. <pre class="programlisting"><span class="identifier">pair</span><span class="special">&lt;</span> <span class="identifier">vector_type</span> <span class="special">,</span> <span class="identifier">vector_type</span> <span class="special">&gt;</span> <span class="identifier">x</span><span class="special">;</span>
  356. <span class="identifier">x</span><span class="special">.</span><span class="identifier">first</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="number">1.0</span><span class="special">;</span> <span class="identifier">x</span><span class="special">.</span><span class="identifier">second</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="number">0.0</span><span class="special">;</span>
  357. <span class="identifier">symplectic_rkn_sb3a_mclachlan</span><span class="special">&lt;</span> <span class="identifier">vector_type</span> <span class="special">&gt;</span> <span class="identifier">rkn</span><span class="special">;</span>
  358. <span class="identifier">rkn</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">harm_osc_f1</span><span class="special">()</span> <span class="special">,</span> <span class="identifier">x</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span>
  359. </pre>
  360. <p>
  361. </p>
  362. <p>
  363. In this example the function <code class="computeroutput"><span class="identifier">harm_osc_f1</span></code>
  364. is exactly the same function as in the above examples.
  365. </p>
  366. <p>
  367. Note, that the state of the ODE must not be constructed explicitly via
  368. <code class="computeroutput"><span class="identifier">pair</span><span class="special">&lt;</span>
  369. <span class="identifier">vector_type</span> <span class="special">,</span>
  370. <span class="identifier">vector_type</span> <span class="special">&gt;</span>
  371. <span class="identifier">x</span></code>. One can also use a combination
  372. of <code class="computeroutput"><span class="identifier">make_pair</span></code> and <code class="computeroutput"><span class="identifier">ref</span></code>. Furthermore, a convenience version
  373. of <code class="computeroutput"><span class="identifier">do_step</span></code> exists which
  374. takes q and p without combining them into a pair:
  375. </p>
  376. <p>
  377. </p>
  378. <pre class="programlisting"><span class="identifier">rkn</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">harm_osc_f1</span><span class="special">()</span> <span class="special">,</span> <span class="identifier">make_pair</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span><span class="special">(</span> <span class="identifier">q</span> <span class="special">)</span> <span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span><span class="special">(</span> <span class="identifier">p</span> <span class="special">)</span> <span class="special">)</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span>
  379. <span class="identifier">rkn</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">harm_osc_f1</span><span class="special">()</span> <span class="special">,</span> <span class="identifier">q</span> <span class="special">,</span> <span class="identifier">p</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span>
  380. <span class="identifier">rkn</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">make_pair</span><span class="special">(</span> <span class="identifier">harm_osc_f1</span><span class="special">()</span> <span class="special">,</span> <span class="identifier">harm_osc_f2</span><span class="special">()</span> <span class="special">)</span> <span class="special">,</span> <span class="identifier">q</span> <span class="special">,</span> <span class="identifier">p</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span>
  381. </pre>
  382. <p>
  383. </p>
  384. </div>
  385. <div class="section">
  386. <div class="titlepage"><div><div><h4 class="title">
  387. <a name="boost_numeric_odeint.odeint_in_detail.steppers.implicit_solvers"></a><a class="link" href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.implicit_solvers" title="Implicit solvers">Implicit
  388. solvers</a>
  389. </h4></div></div></div>
  390. <div class="caution"><table border="0" summary="Caution">
  391. <tr>
  392. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Caution]" src="../../../../../../../doc/src/images/caution.png"></td>
  393. <th align="left">Caution</th>
  394. </tr>
  395. <tr><td align="left" valign="top"><p>
  396. This section is not up-to-date.
  397. </p></td></tr>
  398. </table></div>
  399. <p>
  400. For some kind of systems the stability properties of the classical Runge-Kutta
  401. are not sufficient, especially if the system is said to be stiff. A stiff
  402. system possesses two or more time scales of very different order. Solvers
  403. for stiff systems are usually implicit, meaning that they solve equations
  404. like <span class="emphasis"><em>x(t+dt) = x(t) + dt * f(x(t+1))</em></span>. This particular
  405. scheme is the implicit Euler method. Implicit methods usually solve the
  406. system of equations by a root finding algorithm like the Newton method
  407. and therefore need to know the Jacobian of the system <span class="emphasis"><em>J<sub>&#8203;ij</sub> = df<sub>&#8203;i</sub> /
  408. dx<sub>&#8203;j</sub></em></span>.
  409. </p>
  410. <p>
  411. For implicit solvers the system is again a pair, where the first component
  412. computes <span class="emphasis"><em>f(x,t)</em></span> and the second the Jacobian. The syntax
  413. is <code class="computeroutput"><span class="identifier">sys</span><span class="special">.</span><span class="identifier">first</span><span class="special">(</span> <span class="identifier">x</span> <span class="special">,</span> <span class="identifier">dxdt</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">)</span></code> and
  414. <code class="computeroutput"><span class="identifier">sys</span><span class="special">.</span><span class="identifier">second</span><span class="special">(</span> <span class="identifier">x</span> <span class="special">,</span> <span class="identifier">J</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">)</span></code>.
  415. For the implicit solver the <code class="computeroutput"><span class="identifier">state_type</span></code>
  416. is <code class="computeroutput"><span class="identifier">ublas</span><span class="special">::</span><span class="identifier">vector</span></code> and the Jacobian is represented
  417. by <code class="computeroutput"><span class="identifier">ublas</span><span class="special">::</span><span class="identifier">matrix</span></code>.
  418. </p>
  419. <div class="important"><table border="0" summary="Important">
  420. <tr>
  421. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../../../../../doc/src/images/important.png"></td>
  422. <th align="left">Important</th>
  423. </tr>
  424. <tr><td align="left" valign="top"><p>
  425. Implicit solvers only work with ublas::vector as state type. At the moment,
  426. no other state types are supported.
  427. </p></td></tr>
  428. </table></div>
  429. </div>
  430. <div class="section">
  431. <div class="titlepage"><div><div><h4 class="title">
  432. <a name="boost_numeric_odeint.odeint_in_detail.steppers.multistep_methods"></a><a class="link" href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.multistep_methods" title="Multistep methods">Multistep
  433. methods</a>
  434. </h4></div></div></div>
  435. <p>
  436. Another large class of solvers are multi-step method. They save a small
  437. part of the history of the solution and compute the next step with the
  438. help of this history. Since multi-step methods know a part of their history
  439. they do not need to compute the system function very often, usually it
  440. is only computed once. This makes multi-step methods preferable if a call
  441. of the system function is expensive. Examples are ODEs defined on networks,
  442. where the computation of the interaction is usually where expensive (and
  443. might be of order O(N^2)).
  444. </p>
  445. <p>
  446. Multi-step methods differ from the normal steppers. They save a part of
  447. their history and this part has to be explicitly calculated and initialized.
  448. In the following example an Adams-Bashforth-stepper with a history of 5
  449. steps is instantiated and initialized;
  450. </p>
  451. <p>
  452. </p>
  453. <pre class="programlisting"><span class="identifier">adams_bashforth_moulton</span><span class="special">&lt;</span> <span class="number">5</span> <span class="special">,</span> <span class="identifier">state_type</span> <span class="special">&gt;</span> <span class="identifier">abm</span><span class="special">;</span>
  454. <span class="identifier">abm</span><span class="special">.</span><span class="identifier">initialize</span><span class="special">(</span> <span class="identifier">sys</span> <span class="special">,</span> <span class="identifier">inout</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span>
  455. <span class="identifier">abm</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">sys</span> <span class="special">,</span> <span class="identifier">inout</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span>
  456. </pre>
  457. <p>
  458. </p>
  459. <p>
  460. The initialization uses a fourth-order Runge-Kutta stepper and after the
  461. call of <code class="computeroutput"><span class="identifier">initialize</span></code> the
  462. state of <code class="computeroutput"><span class="identifier">inout</span></code> has changed
  463. to the current state, such that it can be immediately used by passing it
  464. to following calls of <code class="computeroutput"><span class="identifier">do_step</span></code>.
  465. You can also use you own steppers to initialize the internal state of the
  466. Adams-Bashforth-Stepper:
  467. </p>
  468. <p>
  469. </p>
  470. <pre class="programlisting"><span class="identifier">abm</span><span class="special">.</span><span class="identifier">initialize</span><span class="special">(</span> <span class="identifier">runge_kutta_fehlberg78</span><span class="special">&lt;</span> <span class="identifier">state_type</span> <span class="special">&gt;()</span> <span class="special">,</span> <span class="identifier">sys</span> <span class="special">,</span> <span class="identifier">inout</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span>
  471. </pre>
  472. <p>
  473. </p>
  474. <p>
  475. Many multi-step methods are also explicit steppers, hence the parameter
  476. of <code class="computeroutput"><span class="identifier">do_step</span></code> method do not
  477. differ from the explicit steppers.
  478. </p>
  479. <div class="caution"><table border="0" summary="Caution">
  480. <tr>
  481. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Caution]" src="../../../../../../../doc/src/images/caution.png"></td>
  482. <th align="left">Caution</th>
  483. </tr>
  484. <tr><td align="left" valign="top"><p>
  485. The multi-step methods have some internal variables which depend on the
  486. explicit solution. Hence after any external changes of your state (e.g.
  487. size) or system the initialize function has to be called again to adjust
  488. the internal state of the stepper. If you use the integrate functions
  489. this will be taken into account. See the <a class="link" href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.using_steppers" title="Using steppers">Using
  490. steppers</a> section for more details.
  491. </p></td></tr>
  492. </table></div>
  493. </div>
  494. <div class="section">
  495. <div class="titlepage"><div><div><h4 class="title">
  496. <a name="boost_numeric_odeint.odeint_in_detail.steppers.controlled_steppers"></a><a class="link" href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.controlled_steppers" title="Controlled steppers">Controlled
  497. steppers</a>
  498. </h4></div></div></div>
  499. <p>
  500. Many of the above introduced steppers possess the possibility to use adaptive
  501. step-size control. Adaptive step size integration works in principle as
  502. follows:
  503. </p>
  504. <div class="orderedlist"><ol class="orderedlist" type="1">
  505. <li class="listitem">
  506. The error of one step is calculated. This is usually done by performing
  507. two steps with different orders. The difference between these two steps
  508. is then used as a measure for the error. Stepper which can calculate
  509. the error are <a class="link" href="../concepts/error_stepper.html" title="Error Stepper">Error
  510. Stepper</a> and they form an own class with an separate concept.
  511. </li>
  512. <li class="listitem">
  513. This error is compared against some predefined error tolerances. Are
  514. the tolerance violated the step is reject and the step-size is decreases.
  515. Otherwise the step is accepted and possibly the step-size is increased.
  516. </li>
  517. </ol></div>
  518. <p>
  519. The class of controlled steppers has their own concept in odeint - the
  520. <a class="link" href="../concepts/controlled_stepper.html" title="Controlled Stepper">Controlled
  521. Stepper</a> concept. They are usually constructed from the underlying
  522. error steppers. An example is the controller for the explicit Runge-Kutta
  523. steppers. The Runge-Kutta steppers enter the controller as a template argument.
  524. Additionally one can pass the Runge-Kutta stepper to the constructor, but
  525. this step is not necessary; the stepper is default-constructed if possible.
  526. </p>
  527. <p>
  528. Different step size controlling mechanism exist. They all have in common
  529. that they somehow compare predefined error tolerance against the error
  530. and that they might reject or accept a step. If a step is rejected the
  531. step size is usually decreased and the step is made again with the reduced
  532. step size. This procedure is repeated until the step is accepted. This
  533. algorithm is implemented in the integration functions.
  534. </p>
  535. <p>
  536. A classical way to decide whether a step is rejected or accepted is to
  537. calculate
  538. </p>
  539. <p>
  540. <span class="emphasis"><em>val = || | err<sub>&#8203;i</sub> | / ( &#949;<sub>&#8203;abs</sub> + &#949;<sub>&#8203;rel</sub> * ( a<sub>&#8203;x</sub> | x<sub>&#8203;i</sub> | + a<sub>&#8203;dxdt</sub> | | dxdt<sub>&#8203;i</sub> | )||
  541. </em></span>
  542. </p>
  543. <p>
  544. <span class="emphasis"><em>&#949;<sub>&#8203;abs</sub></em></span> and <span class="emphasis"><em>&#949;<sub>&#8203;rel</sub></em></span> are the absolute
  545. and the relative error tolerances, and <span class="emphasis"><em>|| x ||</em></span> is
  546. a norm, typically <span class="emphasis"><em>||x||=(&#931;<sub>&#8203;i</sub> x<sub>&#8203;i</sub><sup>2</sup>)<sup>1/2</sup></em></span> or the maximum norm.
  547. The step is rejected if <span class="emphasis"><em>val</em></span> is greater then 1, otherwise
  548. it is accepted. For details of the used norms and error tolerance see the
  549. table below.
  550. </p>
  551. <p>
  552. For the <code class="computeroutput"><span class="identifier">controlled_runge_kutta</span></code>
  553. stepper the new step size is then calculated via
  554. </p>
  555. <p>
  556. <span class="emphasis"><em>val &gt; 1 : dt<sub>&#8203;new</sub> = dt<sub>&#8203;current</sub> max( 0.9 pow( val , -1 / ( O<sub>&#8203;E</sub> - 1
  557. ) ) , 0.2 )</em></span>
  558. </p>
  559. <p>
  560. <span class="emphasis"><em>val &lt; 0.5 : dt<sub>&#8203;new</sub> = dt<sub>&#8203;current</sub> min( 0.9 pow( val , -1 / O<sub>&#8203;S</sub> ) ,
  561. 5 )</em></span>
  562. </p>
  563. <p>
  564. <span class="emphasis"><em>else : dt<sub>&#8203;new</sub> = dt<sub>&#8203;current</sub></em></span>
  565. </p>
  566. <p>
  567. Here, <span class="emphasis"><em>O<sub>&#8203;S</sub></em></span> and <span class="emphasis"><em>O<sub>&#8203;E</sub></em></span> are the order
  568. of the stepper and the error stepper. These formulas also contain some
  569. safety factors, avoiding that the step size is reduced or increased to
  570. much. For details of the implementations of the controlled steppers in
  571. odeint see the table below.
  572. </p>
  573. <div class="table">
  574. <a name="boost_numeric_odeint.odeint_in_detail.steppers.controlled_steppers.adaptive_step_size_algorithms"></a><p class="title"><b>Table&#160;1.5.&#160;Adaptive step size algorithms</b></p>
  575. <div class="table-contents"><table class="table" summary="Adaptive step size algorithms">
  576. <colgroup>
  577. <col>
  578. <col>
  579. <col>
  580. <col>
  581. </colgroup>
  582. <thead><tr>
  583. <th>
  584. <p>
  585. Stepper
  586. </p>
  587. </th>
  588. <th>
  589. <p>
  590. Tolerance formula
  591. </p>
  592. </th>
  593. <th>
  594. <p>
  595. Norm
  596. </p>
  597. </th>
  598. <th>
  599. <p>
  600. Step size adaption
  601. </p>
  602. </th>
  603. </tr></thead>
  604. <tbody>
  605. <tr>
  606. <td>
  607. <p>
  608. <code class="computeroutput"><span class="identifier">controlled_runge_kutta</span></code>
  609. </p>
  610. </td>
  611. <td>
  612. <p>
  613. <span class="emphasis"><em>val = || | err<sub>&#8203;i</sub> | / ( &#949;<sub>&#8203;abs</sub> + &#949;<sub>&#8203;rel</sub> * ( a<sub>&#8203;x</sub> | x<sub>&#8203;i</sub> | + a<sub>&#8203;dxdt</sub> | |
  614. dxdt<sub>&#8203;i</sub> | )|| </em></span>
  615. </p>
  616. </td>
  617. <td>
  618. <p>
  619. <span class="emphasis"><em>||x|| = max( x<sub>&#8203;i</sub> )</em></span>
  620. </p>
  621. </td>
  622. <td>
  623. <p>
  624. <span class="emphasis"><em>val &gt; 1 : dt<sub>&#8203;new</sub> = dt<sub>&#8203;current</sub> max( 0.9 pow( val , -1
  625. / ( O<sub>&#8203;E</sub> - 1 ) ) , 0.2 )</em></span>
  626. </p>
  627. <p>
  628. <span class="emphasis"><em>val &lt; 0.5 : dt<sub>&#8203;new</sub> = dt<sub>&#8203;current</sub> min( 0.9 pow( val ,
  629. -1 / O<sub>&#8203;S</sub> ) , 5 )</em></span>
  630. </p>
  631. <p>
  632. <span class="emphasis"><em>else : dt<sub>&#8203;new</sub> = dt<sub>&#8203;current</sub></em></span>
  633. </p>
  634. </td>
  635. </tr>
  636. <tr>
  637. <td>
  638. <p>
  639. <code class="computeroutput"><span class="identifier">rosenbrock4_controller</span></code>
  640. </p>
  641. </td>
  642. <td>
  643. <p>
  644. <span class="emphasis"><em>val = || err<sub>&#8203;i</sub> / ( &#949;<sub>&#8203;abs</sub> + &#949;<sub>&#8203;rel</sub> max( | x<sub>&#8203;i</sub> | , | xold<sub>&#8203;i</sub> | ) )
  645. || </em></span>
  646. </p>
  647. </td>
  648. <td>
  649. <p>
  650. <span class="emphasis"><em>||x||=(&#931;<sub>&#8203;i</sub> x<sub>&#8203;i</sub><sup>2</sup>)<sup>1/2</sup></em></span>
  651. </p>
  652. </td>
  653. <td>
  654. <p>
  655. <span class="emphasis"><em>fac = max( 1 / 6 , min( 5 , pow( val , 1 / 4 ) / 0.9
  656. ) </em></span>
  657. </p>
  658. <p>
  659. <span class="emphasis"><em>fac2 = max( 1 / 6 , min( 5 , dt<sub>&#8203;old</sub> / dt<sub>&#8203;current</sub> pow( val<sup>2</sup> /
  660. val<sub>&#8203;old</sub> , 1 / 4 ) / 0.9 ) </em></span>
  661. </p>
  662. <p>
  663. <span class="emphasis"><em>val &gt; 1 : dt<sub>&#8203;new</sub> = dt<sub>&#8203;current</sub> / fac </em></span>
  664. </p>
  665. <p>
  666. <span class="emphasis"><em>val &lt; 1 : dt<sub>&#8203;new</sub> = dt<sub>&#8203;current</sub> / max( fac , fac2 ) </em></span>
  667. </p>
  668. </td>
  669. </tr>
  670. <tr>
  671. <td>
  672. <p>
  673. bulirsch_stoer
  674. </p>
  675. </td>
  676. <td>
  677. <p>
  678. <span class="emphasis"><em>tol=1/2</em></span>
  679. </p>
  680. </td>
  681. <td>
  682. <p>
  683. -
  684. </p>
  685. </td>
  686. <td>
  687. <p>
  688. <span class="emphasis"><em>dt<sub>&#8203;new</sub> = dt<sub>&#8203;old</sub><sup>1/a</sup></em></span>
  689. </p>
  690. </td>
  691. </tr>
  692. </tbody>
  693. </table></div>
  694. </div>
  695. <br class="table-break"><p>
  696. To ease to generation of the controlled stepper, generation functions exist
  697. which take the absolute and relative error tolerances and a predefined
  698. error stepper and construct from this knowledge an appropriate controlled
  699. stepper. The generation functions are explained in detail in <a class="link" href="generation_functions.html" title="Generation functions">Generation
  700. functions</a>.
  701. </p>
  702. </div>
  703. <div class="section">
  704. <div class="titlepage"><div><div><h4 class="title">
  705. <a name="boost_numeric_odeint.odeint_in_detail.steppers.dense_output_steppers"></a><a class="link" href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.dense_output_steppers" title="Dense output steppers">Dense
  706. output steppers</a>
  707. </h4></div></div></div>
  708. <p>
  709. A fourth class of stepper exists which are the so called dense output steppers.
  710. Dense-output steppers might take larger steps and interpolate the solution
  711. between two consecutive points. This interpolated points have usually the
  712. same order as the order of the stepper. Dense-output steppers are often
  713. composite stepper which take the underlying method as a template parameter.
  714. An example is the <code class="computeroutput"><span class="identifier">dense_output_runge_kutta</span></code>
  715. stepper which takes a Runge-Kutta stepper with dense-output facilities
  716. as argument. Not all Runge-Kutta steppers provide dense-output calculation;
  717. at the moment only the Dormand-Prince 5 stepper provides dense output.
  718. An example is
  719. </p>
  720. <p>
  721. </p>
  722. <pre class="programlisting"><span class="identifier">dense_output_runge_kutta</span><span class="special">&lt;</span> <span class="identifier">controlled_runge_kutta</span><span class="special">&lt;</span> <span class="identifier">runge_kutta_dopri5</span><span class="special">&lt;</span> <span class="identifier">state_type</span> <span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;</span> <span class="identifier">dense</span><span class="special">;</span>
  723. <span class="identifier">dense</span><span class="special">.</span><span class="identifier">initialize</span><span class="special">(</span> <span class="identifier">in</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span>
  724. <span class="identifier">pair</span><span class="special">&lt;</span> <span class="keyword">double</span> <span class="special">,</span> <span class="keyword">double</span> <span class="special">&gt;</span> <span class="identifier">times</span> <span class="special">=</span> <span class="identifier">dense</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">sys</span> <span class="special">);</span>
  725. <span class="special">(</span><span class="keyword">void</span><span class="special">)</span><span class="identifier">times</span><span class="special">;</span>
  726. </pre>
  727. <p>
  728. </p>
  729. <p>
  730. Dense output stepper have their own concept. The main difference to usual
  731. steppers is that they manage the state and time internally. If you call
  732. <code class="computeroutput"><span class="identifier">do_step</span></code>, only the ODE is
  733. passed as argument. Furthermore <code class="computeroutput"><span class="identifier">do_step</span></code>
  734. return the last time interval: <code class="computeroutput"><span class="identifier">t</span></code>
  735. and <code class="computeroutput"><span class="identifier">t</span><span class="special">+</span><span class="identifier">dt</span></code>, hence you can interpolate the solution
  736. between these two times points. Another difference is that they must be
  737. initialized with <code class="computeroutput"><span class="identifier">initialize</span></code>,
  738. otherwise the internal state of the stepper is default constructed which
  739. might produce funny errors or bugs.
  740. </p>
  741. <p>
  742. The construction of the dense output stepper looks a little bit nasty,
  743. since in the case of the <code class="computeroutput"><span class="identifier">dense_output_runge_kutta</span></code>
  744. stepper a controlled stepper and an error stepper have to be nested. To
  745. simplify the generation of the dense output stepper generation functions
  746. exist:
  747. </p>
  748. <p>
  749. </p>
  750. <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">odeint</span><span class="special">::</span><span class="identifier">result_of</span><span class="special">::</span><span class="identifier">make_dense_output</span><span class="special">&lt;</span>
  751. <span class="identifier">runge_kutta_dopri5</span><span class="special">&lt;</span> <span class="identifier">state_type</span> <span class="special">&gt;</span> <span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">dense_stepper_type</span><span class="special">;</span>
  752. <span class="identifier">dense_stepper_type</span> <span class="identifier">dense2</span> <span class="special">=</span> <span class="identifier">make_dense_output</span><span class="special">(</span> <span class="number">1.0e-6</span> <span class="special">,</span> <span class="number">1.0e-6</span> <span class="special">,</span> <span class="identifier">runge_kutta_dopri5</span><span class="special">&lt;</span> <span class="identifier">state_type</span> <span class="special">&gt;()</span> <span class="special">);</span>
  753. <span class="special">(</span><span class="keyword">void</span><span class="special">)</span><span class="identifier">dense2</span><span class="special">;</span>
  754. </pre>
  755. <p>
  756. </p>
  757. <p>
  758. This statement is also lengthy; it demonstrates how <code class="computeroutput"><span class="identifier">make_dense_output</span></code>
  759. can be used with the <code class="computeroutput"><span class="identifier">result_of</span></code>
  760. protocol. The parameters to <code class="computeroutput"><span class="identifier">make_dense_output</span></code>
  761. are the absolute error tolerance, the relative error tolerance and the
  762. stepper. This explicitly assumes that the underlying stepper is a controlled
  763. stepper and that this stepper has an absolute and a relative error tolerance.
  764. For details about the generation functions see <a class="link" href="generation_functions.html" title="Generation functions">Generation
  765. functions</a>. The generation functions have been designed for easy
  766. use with the integrate functions:
  767. </p>
  768. <p>
  769. </p>
  770. <pre class="programlisting"><span class="identifier">integrate_const</span><span class="special">(</span> <span class="identifier">make_dense_output</span><span class="special">(</span> <span class="number">1.0e-6</span> <span class="special">,</span> <span class="number">1.0e-6</span> <span class="special">,</span> <span class="identifier">runge_kutta_dopri5</span><span class="special">&lt;</span> <span class="identifier">state_type</span> <span class="special">&gt;()</span> <span class="special">)</span> <span class="special">,</span> <span class="identifier">sys</span> <span class="special">,</span> <span class="identifier">inout</span> <span class="special">,</span> <span class="identifier">t_start</span> <span class="special">,</span> <span class="identifier">t_end</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span>
  771. </pre>
  772. <p>
  773. </p>
  774. </div>
  775. <div class="section">
  776. <div class="titlepage"><div><div><h4 class="title">
  777. <a name="boost_numeric_odeint.odeint_in_detail.steppers.using_steppers"></a><a class="link" href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.using_steppers" title="Using steppers">Using
  778. steppers</a>
  779. </h4></div></div></div>
  780. <p>
  781. This section contains some general information about the usage of the steppers
  782. in odeint.
  783. </p>
  784. <p>
  785. <span class="bold"><strong>Steppers are copied by value</strong></span>
  786. </p>
  787. <p>
  788. The stepper in odeint are always copied by values. They are copied for
  789. the creation of the controlled steppers or the dense output steppers as
  790. well as in the integrate functions.
  791. </p>
  792. <p>
  793. <span class="bold"><strong>Steppers might have a internal state</strong></span>
  794. </p>
  795. <div class="caution"><table border="0" summary="Caution">
  796. <tr>
  797. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Caution]" src="../../../../../../../doc/src/images/caution.png"></td>
  798. <th align="left">Caution</th>
  799. </tr>
  800. <tr><td align="left" valign="top"><p>
  801. Some of the features described in this section are not yet implemented
  802. </p></td></tr>
  803. </table></div>
  804. <p>
  805. Some steppers require to store some information about the state of the
  806. ODE between two steps. Examples are the multi-step methods which store
  807. a part of the solution during the evolution of the ODE, or the FSAL steppers
  808. which store the last derivative at time <span class="emphasis"><em>t+dt</em></span>, to be
  809. used in the next step. In both cases the steppers expect that consecutive
  810. calls of <code class="computeroutput"><span class="identifier">do_step</span></code> are from
  811. the same solution and the same ODE. In this case it is absolutely necessary
  812. that you call <code class="computeroutput"><span class="identifier">do_step</span></code> with
  813. the same system function and the same state, see also the examples for
  814. the FSAL steppers above.
  815. </p>
  816. <p>
  817. Stepper with an internal state support two additional methods: <code class="computeroutput"><span class="identifier">reset</span></code> which resets the state and <code class="computeroutput"><span class="identifier">initialize</span></code> which initializes the internal
  818. state. The parameters of <code class="computeroutput"><span class="identifier">initialize</span></code>
  819. depend on the specific stepper. For example the Adams-Bashforth-Moulton
  820. stepper provides two initialize methods: <code class="computeroutput"><span class="identifier">initialize</span><span class="special">(</span> <span class="identifier">system</span> <span class="special">,</span> <span class="identifier">inout</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">)</span></code> which initializes the internal states
  821. with the help of the Runge-Kutta 4 stepper, and <code class="computeroutput"><span class="identifier">initialize</span><span class="special">(</span> <span class="identifier">stepper</span> <span class="special">,</span> <span class="identifier">system</span> <span class="special">,</span> <span class="identifier">inout</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">)</span></code> which initializes with the help of <code class="computeroutput"><span class="identifier">stepper</span></code>. For the case of the FSAL steppers,
  822. <code class="computeroutput"><span class="identifier">initialize</span></code> is <code class="computeroutput"><span class="identifier">initialize</span><span class="special">(</span>
  823. <span class="identifier">sys</span> <span class="special">,</span>
  824. <span class="identifier">in</span> <span class="special">,</span>
  825. <span class="identifier">t</span> <span class="special">)</span></code>
  826. which simply calculates the r.h.s. of the ODE and assigns its value to
  827. the internal derivative.
  828. </p>
  829. <p>
  830. All these steppers have in common, that they initially fill their internal
  831. state by themselves. Hence you are not required to call initialize. See
  832. how this works for the Adams-Bashforth-Moulton stepper: in the example
  833. we instantiate a fourth order Adams-Bashforth-Moulton stepper, meaning
  834. that it will store 4 internal derivatives of the solution at times <code class="computeroutput"><span class="special">(</span><span class="identifier">t</span><span class="special">-</span><span class="identifier">dt</span><span class="special">,</span><span class="identifier">t</span><span class="special">-</span><span class="number">2</span><span class="special">*</span><span class="identifier">dt</span><span class="special">,</span><span class="identifier">t</span><span class="special">-</span><span class="number">3</span><span class="special">*</span><span class="identifier">dt</span><span class="special">,</span><span class="identifier">t</span><span class="special">-</span><span class="number">4</span><span class="special">*</span><span class="identifier">dt</span><span class="special">)</span></code>.
  835. </p>
  836. <p>
  837. </p>
  838. <pre class="programlisting"><span class="identifier">adams_bashforth_moulton</span><span class="special">&lt;</span> <span class="number">4</span> <span class="special">,</span> <span class="identifier">state_type</span> <span class="special">&gt;</span> <span class="identifier">stepper</span><span class="special">;</span>
  839. <span class="identifier">stepper</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">sys</span> <span class="special">,</span> <span class="identifier">x</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span> <span class="comment">// make one step with the classical Runge-Kutta stepper and initialize the first internal state</span>
  840. <span class="comment">// the internal array is now [x(t-dt)]</span>
  841. <span class="identifier">stepper</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">sys</span> <span class="special">,</span> <span class="identifier">x</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span> <span class="comment">// make one step with the classical Runge-Kutta stepper and initialize the second internal state</span>
  842. <span class="comment">// the internal state array is now [x(t-dt), x(t-2*dt)]</span>
  843. <span class="identifier">stepper</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">sys</span> <span class="special">,</span> <span class="identifier">x</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span> <span class="comment">// make one step with the classical Runge-Kutta stepper and initialize the third internal state</span>
  844. <span class="comment">// the internal state array is now [x(t-dt), x(t-2*dt), x(t-3*dt)]</span>
  845. <span class="identifier">stepper</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">sys</span> <span class="special">,</span> <span class="identifier">x</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span> <span class="comment">// make one step with the classical Runge-Kutta stepper and initialize the fourth internal state</span>
  846. <span class="comment">// the internal state array is now [x(t-dt), x(t-2*dt), x(t-3*dt), x(t-4*dt)]</span>
  847. <span class="identifier">stepper</span><span class="special">.</span><span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">sys</span> <span class="special">,</span> <span class="identifier">x</span> <span class="special">,</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">);</span> <span class="comment">// make one step with Adam-Bashforth-Moulton, the internal array of states is now rotated</span>
  848. </pre>
  849. <p>
  850. </p>
  851. <p>
  852. In the stepper table at the bottom of this page one can see which stepper
  853. have an internal state and hence provide the <code class="computeroutput"><span class="identifier">reset</span></code>
  854. and <code class="computeroutput"><span class="identifier">initialize</span></code> methods.
  855. </p>
  856. <p>
  857. <span class="bold"><strong>Stepper might be resizable</strong></span>
  858. </p>
  859. <p>
  860. Nearly all steppers in odeint need to store some intermediate results of
  861. the type <code class="computeroutput"><span class="identifier">state_type</span></code> or
  862. <code class="computeroutput"><span class="identifier">deriv_type</span></code>. To do so odeint
  863. need some memory management for the internal temporaries. As this memory
  864. management is typically related to adjusting the size of vector-like types,
  865. it is called resizing in odeint. So, most steppers in odeint provide an
  866. additional template parameter which controls the size adjustment of the
  867. internal variables - the resizer. In detail odeint provides three policy
  868. classes (resizers) <code class="computeroutput"><span class="identifier">always_resizer</span></code>,
  869. <code class="computeroutput"><span class="identifier">initially_resizer</span></code>, and
  870. <code class="computeroutput"><span class="identifier">never_resizer</span></code>. Furthermore,
  871. all stepper have a method <code class="computeroutput"><span class="identifier">adjust_size</span></code>
  872. which takes a parameter representing a state type and which manually adjusts
  873. the size of the internal variables matching the size of the given instance.
  874. Before performing the actual resizing odeint always checks if the sizes
  875. of the state and the internal variable differ and only resizes if they
  876. are different.
  877. </p>
  878. <div class="note"><table border="0" summary="Note">
  879. <tr>
  880. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../../doc/src/images/note.png"></td>
  881. <th align="left">Note</th>
  882. </tr>
  883. <tr><td align="left" valign="top"><p>
  884. You only have to worry about memory allocation when using dynamically
  885. sized vector types. If your state type is heap allocated, like <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span></code>, no memory allocation is required
  886. whatsoever.
  887. </p></td></tr>
  888. </table></div>
  889. <p>
  890. By default the resizing parameter is <code class="computeroutput"><span class="identifier">initially_resizer</span></code>,
  891. meaning that the first call to <code class="computeroutput"><span class="identifier">do_step</span></code>
  892. performs the resizing, hence memory allocation. If you have changed the
  893. size of your system and your state you have to call <code class="computeroutput"><span class="identifier">adjust_size</span></code>
  894. by hand in this case. The second resizer is the <code class="computeroutput"><span class="identifier">always_resizer</span></code>
  895. which tries to resize the internal variables at every call of <code class="computeroutput"><span class="identifier">do_step</span></code>. Typical use cases for this kind
  896. of resizer are self expanding lattices like shown in the tutorial ( <a class="link" href="../tutorial/self_expanding_lattices.html" title="Self expanding lattices">Self expanding
  897. lattices</a>) or partial differential equations with an adaptive grid.
  898. Here, no calls of <code class="computeroutput"><span class="identifier">adjust_size</span></code>
  899. are required, the steppers manage everything themselves. The third class
  900. of resizer is the <code class="computeroutput"><span class="identifier">never_resizer</span></code>
  901. which means that the internal variables are never adjusted automatically
  902. and always have to be adjusted by hand .
  903. </p>
  904. <p>
  905. There is a second mechanism which influences the resizing and which controls
  906. if a state type is at least resizeable - a meta-function <code class="computeroutput"><span class="identifier">is_resizeable</span></code>. This meta-function returns
  907. a static Boolean value if any type is resizable. For example it will return
  908. <code class="computeroutput"><span class="keyword">true</span></code> for <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span> <span class="identifier">T</span> <span class="special">&gt;</span></code> but <code class="computeroutput"><span class="keyword">false</span></code>
  909. for <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special">&lt;</span> <span class="identifier">T</span> <span class="special">&gt;</span></code>.
  910. By default and for unknown types <code class="computeroutput"><span class="identifier">is_resizeable</span></code>
  911. returns <code class="computeroutput"><span class="keyword">false</span></code>, so if you have
  912. your own type you need to specialize this meta-function. For more details
  913. on the resizing mechanism see the section <a class="link" href="state_types__algebras_and_operations.html" title="State types, algebras and operations">Adapt
  914. your own state types</a>.
  915. </p>
  916. <p>
  917. <span class="bold"><strong>Which steppers should be used in which situation</strong></span>
  918. </p>
  919. <p>
  920. odeint provides a quite large number of different steppers such that the
  921. user is left with the question of which stepper fits his needs. Our personal
  922. recommendations are:
  923. </p>
  924. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  925. <li class="listitem">
  926. <code class="computeroutput"><span class="identifier">runge_kutta_dopri5</span></code>
  927. is maybe the best default stepper. It has step size control as well
  928. as dense-output functionality. Simple create a dense-output stepper
  929. by <code class="computeroutput"><span class="identifier">make_dense_output</span><span class="special">(</span> <span class="number">1.0e-6</span> <span class="special">,</span> <span class="number">1.0e-5</span> <span class="special">,</span> <span class="identifier">runge_kutta_dopri5</span><span class="special">&lt;</span> <span class="identifier">state_type</span>
  930. <span class="special">&gt;()</span> <span class="special">)</span></code>.
  931. </li>
  932. <li class="listitem">
  933. <code class="computeroutput"><span class="identifier">runge_kutta4</span></code> is a good
  934. stepper for constant step sizes. It is widely used and very well known.
  935. If you need to create artificial time series this stepper should be
  936. the first choice.
  937. </li>
  938. <li class="listitem">
  939. 'runge_kutta_fehlberg78' is similar to the 'runge_kutta4' with the
  940. advantage that it has higher precision. It can also be used with step
  941. size control.
  942. </li>
  943. <li class="listitem">
  944. <code class="computeroutput"><span class="identifier">adams_bashforth_moulton</span></code>
  945. is very well suited for ODEs where the r.h.s. is expensive (in terms
  946. of computation time). It will calculate the system function only once
  947. during each step.
  948. </li>
  949. </ul></div>
  950. </div>
  951. <div class="section">
  952. <div class="titlepage"><div><div><h4 class="title">
  953. <a name="boost_numeric_odeint.odeint_in_detail.steppers.stepper_overview"></a><a class="link" href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.stepper_overview" title="Stepper overview">Stepper
  954. overview</a>
  955. </h4></div></div></div>
  956. <div class="table">
  957. <a name="boost_numeric_odeint.odeint_in_detail.steppers.stepper_overview.stepper_algorithms"></a><p class="title"><b>Table&#160;1.6.&#160;Stepper Algorithms</b></p>
  958. <div class="table-contents"><table class="table" summary="Stepper Algorithms">
  959. <colgroup>
  960. <col>
  961. <col>
  962. <col>
  963. <col>
  964. <col>
  965. <col>
  966. <col>
  967. <col>
  968. <col>
  969. </colgroup>
  970. <thead><tr>
  971. <th>
  972. <p>
  973. Algorithm
  974. </p>
  975. </th>
  976. <th>
  977. <p>
  978. Class
  979. </p>
  980. </th>
  981. <th>
  982. <p>
  983. Concept
  984. </p>
  985. </th>
  986. <th>
  987. <p>
  988. System Concept
  989. </p>
  990. </th>
  991. <th>
  992. <p>
  993. Order
  994. </p>
  995. </th>
  996. <th>
  997. <p>
  998. Error Estimation
  999. </p>
  1000. </th>
  1001. <th>
  1002. <p>
  1003. Dense Output
  1004. </p>
  1005. </th>
  1006. <th>
  1007. <p>
  1008. Internal state
  1009. </p>
  1010. </th>
  1011. <th>
  1012. <p>
  1013. Remarks
  1014. </p>
  1015. </th>
  1016. </tr></thead>
  1017. <tbody>
  1018. <tr>
  1019. <td>
  1020. <p>
  1021. Explicit Euler
  1022. </p>
  1023. </td>
  1024. <td>
  1025. <p>
  1026. <code class="computeroutput"><span class="identifier">euler</span></code>
  1027. </p>
  1028. </td>
  1029. <td>
  1030. <p>
  1031. <a class="link" href="../concepts/dense_output_stepper.html" title="Dense Output Stepper">Dense
  1032. Output Stepper</a>
  1033. </p>
  1034. </td>
  1035. <td>
  1036. <p>
  1037. <a class="link" href="../concepts/system.html" title="System">System</a>
  1038. </p>
  1039. </td>
  1040. <td>
  1041. <p>
  1042. 1
  1043. </p>
  1044. </td>
  1045. <td>
  1046. <p>
  1047. No
  1048. </p>
  1049. </td>
  1050. <td>
  1051. <p>
  1052. Yes
  1053. </p>
  1054. </td>
  1055. <td>
  1056. <p>
  1057. No
  1058. </p>
  1059. </td>
  1060. <td>
  1061. <p>
  1062. Very simple, only for demonstrating purpose
  1063. </p>
  1064. </td>
  1065. </tr>
  1066. <tr>
  1067. <td>
  1068. <p>
  1069. Modified Midpoint
  1070. </p>
  1071. </td>
  1072. <td>
  1073. <p>
  1074. <code class="computeroutput"><span class="identifier">modified_midpoint</span></code>
  1075. </p>
  1076. </td>
  1077. <td>
  1078. <p>
  1079. <a class="link" href="../concepts/stepper.html" title="Stepper">Stepper</a>
  1080. </p>
  1081. </td>
  1082. <td>
  1083. <p>
  1084. <a class="link" href="../concepts/system.html" title="System">System</a>
  1085. </p>
  1086. </td>
  1087. <td>
  1088. <p>
  1089. configurable (2)
  1090. </p>
  1091. </td>
  1092. <td>
  1093. <p>
  1094. No
  1095. </p>
  1096. </td>
  1097. <td>
  1098. <p>
  1099. No
  1100. </p>
  1101. </td>
  1102. <td>
  1103. <p>
  1104. No
  1105. </p>
  1106. </td>
  1107. <td>
  1108. <p>
  1109. Used in Bulirsch-Stoer implementation
  1110. </p>
  1111. </td>
  1112. </tr>
  1113. <tr>
  1114. <td>
  1115. <p>
  1116. Runge-Kutta 4
  1117. </p>
  1118. </td>
  1119. <td>
  1120. <p>
  1121. <code class="computeroutput"><span class="identifier">runge_kutta4</span></code>
  1122. </p>
  1123. </td>
  1124. <td>
  1125. <p>
  1126. <a class="link" href="../concepts/stepper.html" title="Stepper">Stepper</a>
  1127. </p>
  1128. </td>
  1129. <td>
  1130. <p>
  1131. <a class="link" href="../concepts/system.html" title="System">System</a>
  1132. </p>
  1133. </td>
  1134. <td>
  1135. <p>
  1136. 4
  1137. </p>
  1138. </td>
  1139. <td>
  1140. <p>
  1141. No
  1142. </p>
  1143. </td>
  1144. <td>
  1145. <p>
  1146. No
  1147. </p>
  1148. </td>
  1149. <td>
  1150. <p>
  1151. No
  1152. </p>
  1153. </td>
  1154. <td>
  1155. <p>
  1156. The classical Runge-Kutta scheme, good general scheme without
  1157. error control
  1158. </p>
  1159. </td>
  1160. </tr>
  1161. <tr>
  1162. <td>
  1163. <p>
  1164. Cash-Karp
  1165. </p>
  1166. </td>
  1167. <td>
  1168. <p>
  1169. <code class="computeroutput"><span class="identifier">runge_kutta_cash_karp54</span></code>
  1170. </p>
  1171. </td>
  1172. <td>
  1173. <p>
  1174. <a class="link" href="../concepts/error_stepper.html" title="Error Stepper">Error
  1175. Stepper</a>
  1176. </p>
  1177. </td>
  1178. <td>
  1179. <p>
  1180. <a class="link" href="../concepts/system.html" title="System">System</a>
  1181. </p>
  1182. </td>
  1183. <td>
  1184. <p>
  1185. 5
  1186. </p>
  1187. </td>
  1188. <td>
  1189. <p>
  1190. Yes (4)
  1191. </p>
  1192. </td>
  1193. <td>
  1194. <p>
  1195. No
  1196. </p>
  1197. </td>
  1198. <td>
  1199. <p>
  1200. No
  1201. </p>
  1202. </td>
  1203. <td>
  1204. <p>
  1205. Good general scheme with error estimation, to be used in controlled_error_stepper
  1206. </p>
  1207. </td>
  1208. </tr>
  1209. <tr>
  1210. <td>
  1211. <p>
  1212. Dormand-Prince 5
  1213. </p>
  1214. </td>
  1215. <td>
  1216. <p>
  1217. <code class="computeroutput"><span class="identifier">runge_kutta_dopri5</span></code>
  1218. </p>
  1219. </td>
  1220. <td>
  1221. <p>
  1222. <a class="link" href="../concepts/error_stepper.html" title="Error Stepper">Error
  1223. Stepper</a>
  1224. </p>
  1225. </td>
  1226. <td>
  1227. <p>
  1228. <a class="link" href="../concepts/system.html" title="System">System</a>
  1229. </p>
  1230. </td>
  1231. <td>
  1232. <p>
  1233. 5
  1234. </p>
  1235. </td>
  1236. <td>
  1237. <p>
  1238. Yes (4)
  1239. </p>
  1240. </td>
  1241. <td>
  1242. <p>
  1243. Yes
  1244. </p>
  1245. </td>
  1246. <td>
  1247. <p>
  1248. Yes
  1249. </p>
  1250. </td>
  1251. <td>
  1252. <p>
  1253. Standard method with error control and dense output, to be used
  1254. in controlled_error_stepper and in dense_output_controlled_explicit_fsal.
  1255. </p>
  1256. </td>
  1257. </tr>
  1258. <tr>
  1259. <td>
  1260. <p>
  1261. Fehlberg 78
  1262. </p>
  1263. </td>
  1264. <td>
  1265. <p>
  1266. <code class="computeroutput"><span class="identifier">runge_kutta_fehlberg78</span></code>
  1267. </p>
  1268. </td>
  1269. <td>
  1270. <p>
  1271. <a class="link" href="../concepts/error_stepper.html" title="Error Stepper">Error
  1272. Stepper</a>
  1273. </p>
  1274. </td>
  1275. <td>
  1276. <p>
  1277. <a class="link" href="../concepts/system.html" title="System">System</a>
  1278. </p>
  1279. </td>
  1280. <td>
  1281. <p>
  1282. 8
  1283. </p>
  1284. </td>
  1285. <td>
  1286. <p>
  1287. Yes (7)
  1288. </p>
  1289. </td>
  1290. <td>
  1291. <p>
  1292. No
  1293. </p>
  1294. </td>
  1295. <td>
  1296. <p>
  1297. No
  1298. </p>
  1299. </td>
  1300. <td>
  1301. <p>
  1302. Good high order method with error estimation, to be used in controlled_error_stepper.
  1303. </p>
  1304. </td>
  1305. </tr>
  1306. <tr>
  1307. <td>
  1308. <p>
  1309. Adams Bashforth
  1310. </p>
  1311. </td>
  1312. <td>
  1313. <p>
  1314. <code class="computeroutput"><span class="identifier">adams_bashforth</span></code>
  1315. </p>
  1316. </td>
  1317. <td>
  1318. <p>
  1319. <a class="link" href="../concepts/stepper.html" title="Stepper">Stepper</a>
  1320. </p>
  1321. </td>
  1322. <td>
  1323. <p>
  1324. <a class="link" href="../concepts/system.html" title="System">System</a>
  1325. </p>
  1326. </td>
  1327. <td>
  1328. <p>
  1329. configurable
  1330. </p>
  1331. </td>
  1332. <td>
  1333. <p>
  1334. No
  1335. </p>
  1336. </td>
  1337. <td>
  1338. <p>
  1339. No
  1340. </p>
  1341. </td>
  1342. <td>
  1343. <p>
  1344. Yes
  1345. </p>
  1346. </td>
  1347. <td>
  1348. <p>
  1349. Multistep method
  1350. </p>
  1351. </td>
  1352. </tr>
  1353. <tr>
  1354. <td>
  1355. <p>
  1356. Adams Bashforth Moulton
  1357. </p>
  1358. </td>
  1359. <td>
  1360. <p>
  1361. <code class="computeroutput"><span class="identifier">adams_bashforth_moulton</span></code>
  1362. </p>
  1363. </td>
  1364. <td>
  1365. <p>
  1366. <a class="link" href="../concepts/stepper.html" title="Stepper">Stepper</a>
  1367. </p>
  1368. </td>
  1369. <td>
  1370. <p>
  1371. <a class="link" href="../concepts/system.html" title="System">System</a>
  1372. </p>
  1373. </td>
  1374. <td>
  1375. <p>
  1376. configurable
  1377. </p>
  1378. </td>
  1379. <td>
  1380. <p>
  1381. No
  1382. </p>
  1383. </td>
  1384. <td>
  1385. <p>
  1386. No
  1387. </p>
  1388. </td>
  1389. <td>
  1390. <p>
  1391. Yes
  1392. </p>
  1393. </td>
  1394. <td>
  1395. <p>
  1396. Combined multistep method
  1397. </p>
  1398. </td>
  1399. </tr>
  1400. <tr>
  1401. <td>
  1402. <p>
  1403. Controlled Runge-Kutta
  1404. </p>
  1405. </td>
  1406. <td>
  1407. <p>
  1408. <code class="computeroutput"><span class="identifier">controlled_runge_kutta</span></code>
  1409. </p>
  1410. </td>
  1411. <td>
  1412. <p>
  1413. <a class="link" href="../concepts/controlled_stepper.html" title="Controlled Stepper">Controlled
  1414. Stepper</a>
  1415. </p>
  1416. </td>
  1417. <td>
  1418. <p>
  1419. <a class="link" href="../concepts/system.html" title="System">System</a>
  1420. </p>
  1421. </td>
  1422. <td>
  1423. <p>
  1424. depends
  1425. </p>
  1426. </td>
  1427. <td>
  1428. <p>
  1429. Yes
  1430. </p>
  1431. </td>
  1432. <td>
  1433. <p>
  1434. No
  1435. </p>
  1436. </td>
  1437. <td>
  1438. <p>
  1439. depends
  1440. </p>
  1441. </td>
  1442. <td>
  1443. <p>
  1444. Error control for <a class="link" href="../concepts/error_stepper.html" title="Error Stepper">Error
  1445. Stepper</a>. Requires an <a class="link" href="../concepts/error_stepper.html" title="Error Stepper">Error
  1446. Stepper</a> from above. Order depends on the given ErrorStepper
  1447. </p>
  1448. </td>
  1449. </tr>
  1450. <tr>
  1451. <td>
  1452. <p>
  1453. Dense Output Runge-Kutta
  1454. </p>
  1455. </td>
  1456. <td>
  1457. <p>
  1458. <code class="computeroutput"><span class="identifier">dense_output_runge_kutta</span></code>
  1459. </p>
  1460. </td>
  1461. <td>
  1462. <p>
  1463. <a class="link" href="../concepts/dense_output_stepper.html" title="Dense Output Stepper">Dense
  1464. Output Stepper</a>
  1465. </p>
  1466. </td>
  1467. <td>
  1468. <p>
  1469. <a class="link" href="../concepts/system.html" title="System">System</a>
  1470. </p>
  1471. </td>
  1472. <td>
  1473. <p>
  1474. depends
  1475. </p>
  1476. </td>
  1477. <td>
  1478. <p>
  1479. No
  1480. </p>
  1481. </td>
  1482. <td>
  1483. <p>
  1484. Yes
  1485. </p>
  1486. </td>
  1487. <td>
  1488. <p>
  1489. Yes
  1490. </p>
  1491. </td>
  1492. <td>
  1493. <p>
  1494. Dense output for <a class="link" href="../concepts/stepper.html" title="Stepper">Stepper</a>
  1495. and <a class="link" href="../concepts/error_stepper.html" title="Error Stepper">Error
  1496. Stepper</a> from above if they provide dense output functionality
  1497. (like <code class="computeroutput"><span class="identifier">euler</span></code> and
  1498. <code class="computeroutput"><span class="identifier">runge_kutta_dopri5</span></code>).
  1499. Order depends on the given stepper.
  1500. </p>
  1501. </td>
  1502. </tr>
  1503. <tr>
  1504. <td>
  1505. <p>
  1506. Bulirsch-Stoer
  1507. </p>
  1508. </td>
  1509. <td>
  1510. <p>
  1511. <code class="computeroutput"><span class="identifier">bulirsch_stoer</span></code>
  1512. </p>
  1513. </td>
  1514. <td>
  1515. <p>
  1516. <a class="link" href="../concepts/controlled_stepper.html" title="Controlled Stepper">Controlled
  1517. Stepper</a>
  1518. </p>
  1519. </td>
  1520. <td>
  1521. <p>
  1522. <a class="link" href="../concepts/system.html" title="System">System</a>
  1523. </p>
  1524. </td>
  1525. <td>
  1526. <p>
  1527. variable
  1528. </p>
  1529. </td>
  1530. <td>
  1531. <p>
  1532. Yes
  1533. </p>
  1534. </td>
  1535. <td>
  1536. <p>
  1537. No
  1538. </p>
  1539. </td>
  1540. <td>
  1541. <p>
  1542. No
  1543. </p>
  1544. </td>
  1545. <td>
  1546. <p>
  1547. Stepper with step size and order control. Very good if high precision
  1548. is required.
  1549. </p>
  1550. </td>
  1551. </tr>
  1552. <tr>
  1553. <td>
  1554. <p>
  1555. Bulirsch-Stoer Dense Output
  1556. </p>
  1557. </td>
  1558. <td>
  1559. <p>
  1560. <code class="computeroutput"><span class="identifier">bulirsch_stoer_dense_out</span></code>
  1561. </p>
  1562. </td>
  1563. <td>
  1564. <p>
  1565. <a class="link" href="../concepts/dense_output_stepper.html" title="Dense Output Stepper">Dense
  1566. Output Stepper</a>
  1567. </p>
  1568. </td>
  1569. <td>
  1570. <p>
  1571. <a class="link" href="../concepts/system.html" title="System">System</a>
  1572. </p>
  1573. </td>
  1574. <td>
  1575. <p>
  1576. variable
  1577. </p>
  1578. </td>
  1579. <td>
  1580. <p>
  1581. Yes
  1582. </p>
  1583. </td>
  1584. <td>
  1585. <p>
  1586. Yes
  1587. </p>
  1588. </td>
  1589. <td>
  1590. <p>
  1591. No
  1592. </p>
  1593. </td>
  1594. <td>
  1595. <p>
  1596. Stepper with step size and order control as well as dense output.
  1597. Very good if high precision and dense output is required.
  1598. </p>
  1599. </td>
  1600. </tr>
  1601. <tr>
  1602. <td>
  1603. <p>
  1604. Implicit Euler
  1605. </p>
  1606. </td>
  1607. <td>
  1608. <p>
  1609. <code class="computeroutput"><span class="identifier">implicit_euler</span></code>
  1610. </p>
  1611. </td>
  1612. <td>
  1613. <p>
  1614. <a class="link" href="../concepts/stepper.html" title="Stepper">Stepper</a>
  1615. </p>
  1616. </td>
  1617. <td>
  1618. <p>
  1619. <a class="link" href="../concepts/implicit_system.html" title="Implicit System">Implicit
  1620. System</a>
  1621. </p>
  1622. </td>
  1623. <td>
  1624. <p>
  1625. 1
  1626. </p>
  1627. </td>
  1628. <td>
  1629. <p>
  1630. No
  1631. </p>
  1632. </td>
  1633. <td>
  1634. <p>
  1635. No
  1636. </p>
  1637. </td>
  1638. <td>
  1639. <p>
  1640. No
  1641. </p>
  1642. </td>
  1643. <td>
  1644. <p>
  1645. Basic implicit routine. Requires the Jacobian. Works only with
  1646. <a href="http://www.boost.org/doc/libs/release/libs/numeric/ublas/index.html" target="_top">Boost.uBLAS</a>
  1647. vectors as state types.
  1648. </p>
  1649. </td>
  1650. </tr>
  1651. <tr>
  1652. <td>
  1653. <p>
  1654. Rosenbrock 4
  1655. </p>
  1656. </td>
  1657. <td>
  1658. <p>
  1659. <code class="computeroutput"><span class="identifier">rosenbrock4</span></code>
  1660. </p>
  1661. </td>
  1662. <td>
  1663. <p>
  1664. <a class="link" href="../concepts/error_stepper.html" title="Error Stepper">Error
  1665. Stepper</a>
  1666. </p>
  1667. </td>
  1668. <td>
  1669. <p>
  1670. <a class="link" href="../concepts/implicit_system.html" title="Implicit System">Implicit
  1671. System</a>
  1672. </p>
  1673. </td>
  1674. <td>
  1675. <p>
  1676. 4
  1677. </p>
  1678. </td>
  1679. <td>
  1680. <p>
  1681. Yes
  1682. </p>
  1683. </td>
  1684. <td>
  1685. <p>
  1686. Yes
  1687. </p>
  1688. </td>
  1689. <td>
  1690. <p>
  1691. No
  1692. </p>
  1693. </td>
  1694. <td>
  1695. <p>
  1696. Good for stiff systems. Works only with <a href="http://www.boost.org/doc/libs/release/libs/numeric/ublas/index.html" target="_top">Boost.uBLAS</a>
  1697. vectors as state types.
  1698. </p>
  1699. </td>
  1700. </tr>
  1701. <tr>
  1702. <td>
  1703. <p>
  1704. Controlled Rosenbrock 4
  1705. </p>
  1706. </td>
  1707. <td>
  1708. <p>
  1709. <code class="computeroutput"><span class="identifier">rosenbrock4_controller</span></code>
  1710. </p>
  1711. </td>
  1712. <td>
  1713. <p>
  1714. <a class="link" href="../concepts/controlled_stepper.html" title="Controlled Stepper">Controlled
  1715. Stepper</a>
  1716. </p>
  1717. </td>
  1718. <td>
  1719. <p>
  1720. <a class="link" href="../concepts/implicit_system.html" title="Implicit System">Implicit
  1721. System</a>
  1722. </p>
  1723. </td>
  1724. <td>
  1725. <p>
  1726. 4
  1727. </p>
  1728. </td>
  1729. <td>
  1730. <p>
  1731. Yes
  1732. </p>
  1733. </td>
  1734. <td>
  1735. <p>
  1736. Yes
  1737. </p>
  1738. </td>
  1739. <td>
  1740. <p>
  1741. No
  1742. </p>
  1743. </td>
  1744. <td>
  1745. <p>
  1746. Rosenbrock 4 with error control. Works only with <a href="http://www.boost.org/doc/libs/release/libs/numeric/ublas/index.html" target="_top">Boost.uBLAS</a>
  1747. vectors as state types.
  1748. </p>
  1749. </td>
  1750. </tr>
  1751. <tr>
  1752. <td>
  1753. <p>
  1754. Dense Output Rosenbrock 4
  1755. </p>
  1756. </td>
  1757. <td>
  1758. <p>
  1759. <code class="computeroutput"><span class="identifier">rosenbrock4_dense_output</span></code>
  1760. </p>
  1761. </td>
  1762. <td>
  1763. <p>
  1764. <a class="link" href="../concepts/dense_output_stepper.html" title="Dense Output Stepper">Dense
  1765. Output Stepper</a>
  1766. </p>
  1767. </td>
  1768. <td>
  1769. <p>
  1770. <a class="link" href="../concepts/implicit_system.html" title="Implicit System">Implicit
  1771. System</a>
  1772. </p>
  1773. </td>
  1774. <td>
  1775. <p>
  1776. 4
  1777. </p>
  1778. </td>
  1779. <td>
  1780. <p>
  1781. Yes
  1782. </p>
  1783. </td>
  1784. <td>
  1785. <p>
  1786. Yes
  1787. </p>
  1788. </td>
  1789. <td>
  1790. <p>
  1791. No
  1792. </p>
  1793. </td>
  1794. <td>
  1795. <p>
  1796. Controlled Rosenbrock 4 with dense output. Works only with <a href="http://www.boost.org/doc/libs/release/libs/numeric/ublas/index.html" target="_top">Boost.uBLAS</a>
  1797. vectors as state types.
  1798. </p>
  1799. </td>
  1800. </tr>
  1801. <tr>
  1802. <td>
  1803. <p>
  1804. Symplectic Euler
  1805. </p>
  1806. </td>
  1807. <td>
  1808. <p>
  1809. <code class="computeroutput"><span class="identifier">symplectic_euler</span></code>
  1810. </p>
  1811. </td>
  1812. <td>
  1813. <p>
  1814. <a class="link" href="../concepts/stepper.html" title="Stepper">Stepper</a>
  1815. </p>
  1816. </td>
  1817. <td>
  1818. <p>
  1819. <a class="link" href="../concepts/symplectic_system.html" title="Symplectic System">Symplectic
  1820. System</a> <a class="link" href="../concepts/simple_symplectic_system.html" title="Simple Symplectic System">Simple
  1821. Symplectic System</a>
  1822. </p>
  1823. </td>
  1824. <td>
  1825. <p>
  1826. 1
  1827. </p>
  1828. </td>
  1829. <td>
  1830. <p>
  1831. No
  1832. </p>
  1833. </td>
  1834. <td>
  1835. <p>
  1836. No
  1837. </p>
  1838. </td>
  1839. <td>
  1840. <p>
  1841. No
  1842. </p>
  1843. </td>
  1844. <td>
  1845. <p>
  1846. Basic symplectic solver for separable Hamiltonian system
  1847. </p>
  1848. </td>
  1849. </tr>
  1850. <tr>
  1851. <td>
  1852. <p>
  1853. Symplectic RKN McLachlan
  1854. </p>
  1855. </td>
  1856. <td>
  1857. <p>
  1858. <code class="computeroutput"><span class="identifier">symplectic_rkn_sb3a_mclachlan</span></code>
  1859. </p>
  1860. </td>
  1861. <td>
  1862. <p>
  1863. <a class="link" href="../concepts/stepper.html" title="Stepper">Stepper</a>
  1864. </p>
  1865. </td>
  1866. <td>
  1867. <p>
  1868. <a class="link" href="../concepts/symplectic_system.html" title="Symplectic System">Symplectic
  1869. System</a> <a class="link" href="../concepts/simple_symplectic_system.html" title="Simple Symplectic System">Simple
  1870. Symplectic System</a>
  1871. </p>
  1872. </td>
  1873. <td>
  1874. <p>
  1875. 4
  1876. </p>
  1877. </td>
  1878. <td>
  1879. <p>
  1880. No
  1881. </p>
  1882. </td>
  1883. <td>
  1884. <p>
  1885. No
  1886. </p>
  1887. </td>
  1888. <td>
  1889. <p>
  1890. No
  1891. </p>
  1892. </td>
  1893. <td>
  1894. <p>
  1895. Symplectic solver for separable Hamiltonian system with 6 stages
  1896. and order 4.
  1897. </p>
  1898. </td>
  1899. </tr>
  1900. <tr>
  1901. <td>
  1902. <p>
  1903. Symplectic RKN McLachlan
  1904. </p>
  1905. </td>
  1906. <td>
  1907. <p>
  1908. <code class="computeroutput"><span class="identifier">symplectic_rkn_sb3a_m4_mclachlan</span></code>
  1909. </p>
  1910. </td>
  1911. <td>
  1912. <p>
  1913. <a class="link" href="../concepts/stepper.html" title="Stepper">Stepper</a>
  1914. </p>
  1915. </td>
  1916. <td>
  1917. <p>
  1918. <a class="link" href="../concepts/symplectic_system.html" title="Symplectic System">Symplectic
  1919. System</a> <a class="link" href="../concepts/simple_symplectic_system.html" title="Simple Symplectic System">Simple
  1920. Symplectic System</a>
  1921. </p>
  1922. </td>
  1923. <td>
  1924. <p>
  1925. 4
  1926. </p>
  1927. </td>
  1928. <td>
  1929. <p>
  1930. No
  1931. </p>
  1932. </td>
  1933. <td>
  1934. <p>
  1935. No
  1936. </p>
  1937. </td>
  1938. <td>
  1939. <p>
  1940. No
  1941. </p>
  1942. </td>
  1943. <td>
  1944. <p>
  1945. Symplectic solver with 5 stages and order 4, can be used with
  1946. arbitrary precision types.
  1947. </p>
  1948. </td>
  1949. </tr>
  1950. <tr>
  1951. <td>
  1952. <p>
  1953. Velocity Verlet
  1954. </p>
  1955. </td>
  1956. <td>
  1957. <p>
  1958. <code class="computeroutput"><span class="identifier">velocity_verlet</span></code>
  1959. </p>
  1960. </td>
  1961. <td>
  1962. <p>
  1963. <a class="link" href="../concepts/stepper.html" title="Stepper">Stepper</a>
  1964. </p>
  1965. </td>
  1966. <td>
  1967. <p>
  1968. <a class="link" href="../concepts/second_order_system.html" title="Second Order System">Second
  1969. Order System</a>
  1970. </p>
  1971. </td>
  1972. <td>
  1973. <p>
  1974. 1
  1975. </p>
  1976. </td>
  1977. <td>
  1978. <p>
  1979. No
  1980. </p>
  1981. </td>
  1982. <td>
  1983. <p>
  1984. No
  1985. </p>
  1986. </td>
  1987. <td>
  1988. <p>
  1989. Yes
  1990. </p>
  1991. </td>
  1992. <td>
  1993. <p>
  1994. Velocity verlet method suitable for molecular dynamics simulation.
  1995. </p>
  1996. </td>
  1997. </tr>
  1998. </tbody>
  1999. </table></div>
  2000. </div>
  2001. <br class="table-break">
  2002. </div>
  2003. <div class="section">
  2004. <div class="titlepage"><div><div><h4 class="title">
  2005. <a name="boost_numeric_odeint.odeint_in_detail.steppers.custom_steppers"></a><a class="link" href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.custom_steppers" title="Custom steppers">Custom
  2006. steppers</a>
  2007. </h4></div></div></div>
  2008. <p>
  2009. Finally, one can also write new steppers which are fully compatible with
  2010. odeint. They only have to fulfill one or several of the stepper <a class="link" href="../concepts.html" title="Concepts">Concepts</a>
  2011. of odeint.
  2012. </p>
  2013. <p>
  2014. We will illustrate how to write your own stepper with the example of the
  2015. stochastic Euler method. This method is suited to solve stochastic differential
  2016. equations (SDEs). A SDE has the form
  2017. </p>
  2018. <p>
  2019. <span class="emphasis"><em>dx/dt = f(x) + g(x) &#958;(t)</em></span>
  2020. </p>
  2021. <p>
  2022. where <span class="emphasis"><em>&#958;</em></span> is Gaussian white noise with zero mean and
  2023. a standard deviation <span class="emphasis"><em>&#963;(t)</em></span>. <span class="emphasis"><em>f(x)</em></span>
  2024. is said to be the deterministic part while <span class="emphasis"><em>g(x) &#958;</em></span> is
  2025. the noisy part. In case <span class="emphasis"><em>g(x)</em></span> is independent of <span class="emphasis"><em>x</em></span>
  2026. the SDE is said to have additive noise. It is not possible to solve SDE
  2027. with the classical solvers for ODEs since the noisy part of the SDE has
  2028. to be scaled differently then the deterministic part with respect to the
  2029. time step. But there exist many solvers for SDEs. A classical and easy
  2030. method is the stochastic Euler solver. It works by iterating
  2031. </p>
  2032. <p>
  2033. <span class="emphasis"><em>x(t+&#916; t) = x(t) + &#916; t f(x(t)) + &#916; t<sup>1/2</sup> g(x) &#958;(t)</em></span>
  2034. </p>
  2035. <p>
  2036. where &#958;(t) is an independent normal distributed random variable.
  2037. </p>
  2038. <p>
  2039. Now we will implement this method. We will call the stepper <code class="computeroutput"><span class="identifier">stochastic_euler</span></code>. It models the <a class="link" href="../concepts/stepper.html" title="Stepper">Stepper</a> concept.
  2040. For simplicity, we fix the state type to be an <code class="computeroutput"><span class="identifier">array</span><span class="special">&lt;</span> <span class="keyword">double</span> <span class="special">,</span> <span class="identifier">N</span> <span class="special">&gt;</span></code> The class definition looks like
  2041. </p>
  2042. <p>
  2043. </p>
  2044. <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="identifier">size_t</span> <span class="identifier">N</span> <span class="special">&gt;</span> <span class="keyword">class</span> <span class="identifier">stochastic_euler</span>
  2045. <span class="special">{</span>
  2046. <span class="keyword">public</span><span class="special">:</span>
  2047. <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special">&lt;</span> <span class="keyword">double</span> <span class="special">,</span> <span class="identifier">N</span> <span class="special">&gt;</span> <span class="identifier">state_type</span><span class="special">;</span>
  2048. <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special">&lt;</span> <span class="keyword">double</span> <span class="special">,</span> <span class="identifier">N</span> <span class="special">&gt;</span> <span class="identifier">deriv_type</span><span class="special">;</span>
  2049. <span class="keyword">typedef</span> <span class="keyword">double</span> <span class="identifier">value_type</span><span class="special">;</span>
  2050. <span class="keyword">typedef</span> <span class="keyword">double</span> <span class="identifier">time_type</span><span class="special">;</span>
  2051. <span class="keyword">typedef</span> <span class="keyword">unsigned</span> <span class="keyword">short</span> <span class="identifier">order_type</span><span class="special">;</span>
  2052. <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">odeint</span><span class="special">::</span><span class="identifier">stepper_tag</span> <span class="identifier">stepper_category</span><span class="special">;</span>
  2053. <span class="keyword">static</span> <span class="identifier">order_type</span> <span class="identifier">order</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="number">1</span><span class="special">;</span> <span class="special">}</span>
  2054. <span class="comment">// ...</span>
  2055. <span class="special">};</span>
  2056. </pre>
  2057. <p>
  2058. </p>
  2059. <p>
  2060. The types are needed in order to fulfill the stepper concept. As internal
  2061. state and deriv type we use simple arrays in the stochastic Euler, they
  2062. are needed for the temporaries. The stepper has the order one which is
  2063. returned from the <code class="computeroutput"><span class="identifier">order</span><span class="special">()</span></code> function.
  2064. </p>
  2065. <p>
  2066. The system functions needs to calculate the deterministic and the stochastic
  2067. part of our stochastic differential equation. So it might be suitable that
  2068. the system function is a pair of functions. The first element of the pair
  2069. computes the deterministic part and the second the stochastic one. Then,
  2070. the second part also needs to calculate the random numbers in order to
  2071. simulate the stochastic process. We can now implement the <code class="computeroutput"><span class="identifier">do_step</span></code> method
  2072. </p>
  2073. <p>
  2074. </p>
  2075. <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="identifier">size_t</span> <span class="identifier">N</span> <span class="special">&gt;</span> <span class="keyword">class</span> <span class="identifier">stochastic_euler</span>
  2076. <span class="special">{</span>
  2077. <span class="keyword">public</span><span class="special">:</span>
  2078. <span class="comment">// ...</span>
  2079. <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">class</span> <span class="identifier">System</span> <span class="special">&gt;</span>
  2080. <span class="keyword">void</span> <span class="identifier">do_step</span><span class="special">(</span> <span class="identifier">System</span> <span class="identifier">system</span> <span class="special">,</span> <span class="identifier">state_type</span> <span class="special">&amp;</span><span class="identifier">x</span> <span class="special">,</span> <span class="identifier">time_type</span> <span class="identifier">t</span> <span class="special">,</span> <span class="identifier">time_type</span> <span class="identifier">dt</span> <span class="special">)</span> <span class="keyword">const</span>
  2081. <span class="special">{</span>
  2082. <span class="identifier">deriv_type</span> <span class="identifier">det</span> <span class="special">,</span> <span class="identifier">stoch</span> <span class="special">;</span>
  2083. <span class="identifier">system</span><span class="special">.</span><span class="identifier">first</span><span class="special">(</span> <span class="identifier">x</span> <span class="special">,</span> <span class="identifier">det</span> <span class="special">);</span>
  2084. <span class="identifier">system</span><span class="special">.</span><span class="identifier">second</span><span class="special">(</span> <span class="identifier">x</span> <span class="special">,</span> <span class="identifier">stoch</span> <span class="special">);</span>
  2085. <span class="keyword">for</span><span class="special">(</span> <span class="identifier">size_t</span> <span class="identifier">i</span><span class="special">=</span><span class="number">0</span> <span class="special">;</span> <span class="identifier">i</span><span class="special">&lt;</span><span class="identifier">x</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">;</span> <span class="special">++</span><span class="identifier">i</span> <span class="special">)</span>
  2086. <span class="identifier">x</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">+=</span> <span class="identifier">dt</span> <span class="special">*</span> <span class="identifier">det</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">+</span> <span class="identifier">sqrt</span><span class="special">(</span> <span class="identifier">dt</span> <span class="special">)</span> <span class="special">*</span> <span class="identifier">stoch</span><span class="special">[</span><span class="identifier">i</span><span class="special">];</span>
  2087. <span class="special">}</span>
  2088. <span class="special">};</span>
  2089. </pre>
  2090. <p>
  2091. </p>
  2092. <p>
  2093. This is all. It is quite simple and the stochastic Euler stepper implement
  2094. here is quite general. Of course it can be enhanced, for example
  2095. </p>
  2096. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  2097. <li class="listitem">
  2098. use of operations and algebras as well as the resizing mechanism for
  2099. maximal flexibility and portability
  2100. </li>
  2101. <li class="listitem">
  2102. use of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">ref</span></code> for the system functions
  2103. </li>
  2104. <li class="listitem">
  2105. use of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">range</span></code> for the state type in the
  2106. <code class="computeroutput"><span class="identifier">do_step</span></code> method
  2107. </li>
  2108. <li class="listitem">
  2109. ...
  2110. </li>
  2111. </ul></div>
  2112. <p>
  2113. Now, lets look how we use the new stepper. A nice example is the Ornstein-Uhlenbeck
  2114. process. It consists of a simple Brownian motion overlapped with an relaxation
  2115. process. Its SDE reads
  2116. </p>
  2117. <p>
  2118. <span class="emphasis"><em>dx/dt = - x + &#958;</em></span>
  2119. </p>
  2120. <p>
  2121. where &#958; is Gaussian white noise with standard deviation <span class="emphasis"><em>&#963;</em></span>.
  2122. Implementing the Ornstein-Uhlenbeck process is quite simple. We need two
  2123. functions or functors - one for the deterministic and one for the stochastic
  2124. part:
  2125. </p>
  2126. <p>
  2127. </p>
  2128. <pre class="programlisting"><span class="keyword">const</span> <span class="keyword">static</span> <span class="identifier">size_t</span> <span class="identifier">N</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span>
  2129. <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special">&lt;</span> <span class="keyword">double</span> <span class="special">,</span> <span class="identifier">N</span> <span class="special">&gt;</span> <span class="identifier">state_type</span><span class="special">;</span>
  2130. <span class="keyword">struct</span> <span class="identifier">ornstein_det</span>
  2131. <span class="special">{</span>
  2132. <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">const</span> <span class="identifier">state_type</span> <span class="special">&amp;</span><span class="identifier">x</span> <span class="special">,</span> <span class="identifier">state_type</span> <span class="special">&amp;</span><span class="identifier">dxdt</span> <span class="special">)</span> <span class="keyword">const</span>
  2133. <span class="special">{</span>
  2134. <span class="identifier">dxdt</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="special">-</span><span class="identifier">x</span><span class="special">[</span><span class="number">0</span><span class="special">];</span>
  2135. <span class="special">}</span>
  2136. <span class="special">};</span>
  2137. <span class="keyword">struct</span> <span class="identifier">ornstein_stoch</span>
  2138. <span class="special">{</span>
  2139. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mt19937</span> <span class="special">&amp;</span><span class="identifier">m_rng</span><span class="special">;</span>
  2140. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">normal_distribution</span><span class="special">&lt;&gt;</span> <span class="identifier">m_dist</span><span class="special">;</span>
  2141. <span class="identifier">ornstein_stoch</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mt19937</span> <span class="special">&amp;</span><span class="identifier">rng</span> <span class="special">,</span> <span class="keyword">double</span> <span class="identifier">sigma</span> <span class="special">)</span> <span class="special">:</span> <span class="identifier">m_rng</span><span class="special">(</span> <span class="identifier">rng</span> <span class="special">)</span> <span class="special">,</span> <span class="identifier">m_dist</span><span class="special">(</span> <span class="number">0.0</span> <span class="special">,</span> <span class="identifier">sigma</span> <span class="special">)</span> <span class="special">{</span> <span class="special">}</span>
  2142. <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">const</span> <span class="identifier">state_type</span> <span class="special">&amp;</span><span class="identifier">x</span> <span class="special">,</span> <span class="identifier">state_type</span> <span class="special">&amp;</span><span class="identifier">dxdt</span> <span class="special">)</span>
  2143. <span class="special">{</span>
  2144. <span class="identifier">dxdt</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">m_dist</span><span class="special">(</span> <span class="identifier">m_rng</span> <span class="special">);</span>
  2145. <span class="special">}</span>
  2146. <span class="special">};</span>
  2147. </pre>
  2148. <p>
  2149. </p>
  2150. <p>
  2151. In the stochastic part we have used the Mersenne twister for the random
  2152. number generation and a Gaussian white noise generator <code class="computeroutput"><span class="identifier">normal_distribution</span></code>
  2153. with standard deviation <span class="emphasis"><em>&#963;</em></span>. Now, we can use the stochastic
  2154. Euler stepper with the integrate functions:
  2155. </p>
  2156. <p>
  2157. </p>
  2158. <pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mt19937</span> <span class="identifier">rng</span><span class="special">;</span>
  2159. <span class="keyword">double</span> <span class="identifier">dt</span> <span class="special">=</span> <span class="number">0.1</span><span class="special">;</span>
  2160. <span class="identifier">state_type</span> <span class="identifier">x</span> <span class="special">=</span> <span class="special">{{</span> <span class="number">1.0</span> <span class="special">}};</span>
  2161. <span class="identifier">integrate_const</span><span class="special">(</span> <span class="identifier">stochastic_euler</span><span class="special">&lt;</span> <span class="identifier">N</span> <span class="special">&gt;()</span> <span class="special">,</span> <span class="identifier">make_pair</span><span class="special">(</span> <span class="identifier">ornstein_det</span><span class="special">()</span> <span class="special">,</span> <span class="identifier">ornstein_stoch</span><span class="special">(</span> <span class="identifier">rng</span> <span class="special">,</span> <span class="number">1.0</span> <span class="special">)</span> <span class="special">),</span>
  2162. <span class="identifier">x</span> <span class="special">,</span> <span class="number">0.0</span> <span class="special">,</span> <span class="number">10.0</span> <span class="special">,</span> <span class="identifier">dt</span> <span class="special">,</span> <span class="identifier">streaming_observer</span><span class="special">()</span> <span class="special">);</span>
  2163. </pre>
  2164. <p>
  2165. </p>
  2166. <p>
  2167. Note, how we have used the <code class="computeroutput"><span class="identifier">make_pair</span></code>
  2168. function for the generation of the system function.
  2169. </p>
  2170. </div>
  2171. <div class="section">
  2172. <div class="titlepage"><div><div><h4 class="title">
  2173. <a name="boost_numeric_odeint.odeint_in_detail.steppers.custom_runge_kutta_steppers"></a><a class="link" href="steppers.html#boost_numeric_odeint.odeint_in_detail.steppers.custom_runge_kutta_steppers" title="Custom Runge-Kutta steppers">Custom
  2174. Runge-Kutta steppers</a>
  2175. </h4></div></div></div>
  2176. <p>
  2177. odeint provides a C++ template meta-algorithm for constructing arbitrary
  2178. Runge-Kutta schemes <a href="#ftn.boost_numeric_odeint.odeint_in_detail.steppers.custom_runge_kutta_steppers.f0" class="footnote" name="boost_numeric_odeint.odeint_in_detail.steppers.custom_runge_kutta_steppers.f0"><sup class="footnote">[1]</sup></a>. Some schemes are predefined in odeint, for example the classical
  2179. Runge-Kutta of fourth order, or the Runge-Kutta-Cash-Karp 54 and the Runge-Kutta-Fehlberg
  2180. 78 method. You can use this meta algorithm to construct you own solvers.
  2181. This has the advantage that you can make full use of odeint's algebra and
  2182. operation system.
  2183. </p>
  2184. <p>
  2185. Consider for example the method of Heun, defined by the following Butcher
  2186. tableau:
  2187. </p>
  2188. <pre class="programlisting">c1 = 0
  2189. c2 = 1/3, a21 = 1/3
  2190. c3 = 2/3, a31 = 0 , a32 = 2/3
  2191. b1 = 1/4, b2 = 0 , b3 = 3/4
  2192. </pre>
  2193. <p>
  2194. Implementing this method is very easy. First you have to define the constants:
  2195. </p>
  2196. <p>
  2197. </p>
  2198. <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">class</span> <span class="identifier">Value</span> <span class="special">=</span> <span class="keyword">double</span> <span class="special">&gt;</span>
  2199. <span class="keyword">struct</span> <span class="identifier">heun_a1</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special">&lt;</span> <span class="identifier">Value</span> <span class="special">,</span> <span class="number">1</span> <span class="special">&gt;</span> <span class="special">{</span>
  2200. <span class="identifier">heun_a1</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
  2201. <span class="special">{</span>
  2202. <span class="special">(*</span><span class="keyword">this</span><span class="special">)[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="identifier">Value</span> <span class="special">&gt;(</span> <span class="number">1</span> <span class="special">)</span> <span class="special">/</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="identifier">Value</span> <span class="special">&gt;(</span> <span class="number">3</span> <span class="special">);</span>
  2203. <span class="special">}</span>
  2204. <span class="special">};</span>
  2205. <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">class</span> <span class="identifier">Value</span> <span class="special">=</span> <span class="keyword">double</span> <span class="special">&gt;</span>
  2206. <span class="keyword">struct</span> <span class="identifier">heun_a2</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special">&lt;</span> <span class="identifier">Value</span> <span class="special">,</span> <span class="number">2</span> <span class="special">&gt;</span>
  2207. <span class="special">{</span>
  2208. <span class="identifier">heun_a2</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
  2209. <span class="special">{</span>
  2210. <span class="special">(*</span><span class="keyword">this</span><span class="special">)[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="identifier">Value</span> <span class="special">&gt;(</span> <span class="number">0</span> <span class="special">);</span>
  2211. <span class="special">(*</span><span class="keyword">this</span><span class="special">)[</span><span class="number">1</span><span class="special">]</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="identifier">Value</span> <span class="special">&gt;(</span> <span class="number">2</span> <span class="special">)</span> <span class="special">/</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="identifier">Value</span> <span class="special">&gt;(</span> <span class="number">3</span> <span class="special">);</span>
  2212. <span class="special">}</span>
  2213. <span class="special">};</span>
  2214. <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">class</span> <span class="identifier">Value</span> <span class="special">=</span> <span class="keyword">double</span> <span class="special">&gt;</span>
  2215. <span class="keyword">struct</span> <span class="identifier">heun_b</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special">&lt;</span> <span class="identifier">Value</span> <span class="special">,</span> <span class="number">3</span> <span class="special">&gt;</span>
  2216. <span class="special">{</span>
  2217. <span class="identifier">heun_b</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
  2218. <span class="special">{</span>
  2219. <span class="special">(*</span><span class="keyword">this</span><span class="special">)[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">Value</span><span class="special">&gt;(</span> <span class="number">1</span> <span class="special">)</span> <span class="special">/</span> <span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">Value</span><span class="special">&gt;(</span> <span class="number">4</span> <span class="special">);</span>
  2220. <span class="special">(*</span><span class="keyword">this</span><span class="special">)[</span><span class="number">1</span><span class="special">]</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">Value</span><span class="special">&gt;(</span> <span class="number">0</span> <span class="special">);</span>
  2221. <span class="special">(*</span><span class="keyword">this</span><span class="special">)[</span><span class="number">2</span><span class="special">]</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">Value</span><span class="special">&gt;(</span> <span class="number">3</span> <span class="special">)</span> <span class="special">/</span> <span class="keyword">static_cast</span><span class="special">&lt;</span><span class="identifier">Value</span><span class="special">&gt;(</span> <span class="number">4</span> <span class="special">);</span>
  2222. <span class="special">}</span>
  2223. <span class="special">};</span>
  2224. <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">class</span> <span class="identifier">Value</span> <span class="special">=</span> <span class="keyword">double</span> <span class="special">&gt;</span>
  2225. <span class="keyword">struct</span> <span class="identifier">heun_c</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special">&lt;</span> <span class="identifier">Value</span> <span class="special">,</span> <span class="number">3</span> <span class="special">&gt;</span>
  2226. <span class="special">{</span>
  2227. <span class="identifier">heun_c</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
  2228. <span class="special">{</span>
  2229. <span class="special">(*</span><span class="keyword">this</span><span class="special">)[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="identifier">Value</span> <span class="special">&gt;(</span> <span class="number">0</span> <span class="special">);</span>
  2230. <span class="special">(*</span><span class="keyword">this</span><span class="special">)[</span><span class="number">1</span><span class="special">]</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="identifier">Value</span> <span class="special">&gt;(</span> <span class="number">1</span> <span class="special">)</span> <span class="special">/</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="identifier">Value</span> <span class="special">&gt;(</span> <span class="number">3</span> <span class="special">);</span>
  2231. <span class="special">(*</span><span class="keyword">this</span><span class="special">)[</span><span class="number">2</span><span class="special">]</span> <span class="special">=</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="identifier">Value</span> <span class="special">&gt;(</span> <span class="number">2</span> <span class="special">)</span> <span class="special">/</span> <span class="keyword">static_cast</span><span class="special">&lt;</span> <span class="identifier">Value</span> <span class="special">&gt;(</span> <span class="number">3</span> <span class="special">);</span>
  2232. <span class="special">}</span>
  2233. <span class="special">};</span>
  2234. </pre>
  2235. <p>
  2236. </p>
  2237. <p>
  2238. While this might look cumbersome, packing all parameters into a templatized
  2239. class which is not immediately evaluated has the advantage that you can
  2240. change the <code class="computeroutput"><span class="identifier">value_type</span></code> of
  2241. your stepper to any type you like - presumably arbitrary precision types.
  2242. One could also instantiate the coefficients directly
  2243. </p>
  2244. <p>
  2245. </p>
  2246. <pre class="programlisting"><span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special">&lt;</span> <span class="keyword">double</span> <span class="special">,</span> <span class="number">1</span> <span class="special">&gt;</span> <span class="identifier">heun_a1</span> <span class="special">=</span> <span class="special">{{</span> <span class="number">1.0</span> <span class="special">/</span> <span class="number">3.0</span> <span class="special">}};</span>
  2247. <span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special">&lt;</span> <span class="keyword">double</span> <span class="special">,</span> <span class="number">2</span> <span class="special">&gt;</span> <span class="identifier">heun_a2</span> <span class="special">=</span> <span class="special">{{</span> <span class="number">0.0</span> <span class="special">,</span> <span class="number">2.0</span> <span class="special">/</span> <span class="number">3.0</span> <span class="special">}};</span>
  2248. <span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special">&lt;</span> <span class="keyword">double</span> <span class="special">,</span> <span class="number">3</span> <span class="special">&gt;</span> <span class="identifier">heun_b</span> <span class="special">=</span> <span class="special">{{</span> <span class="number">1.0</span> <span class="special">/</span> <span class="number">4.0</span> <span class="special">,</span> <span class="number">0.0</span> <span class="special">,</span> <span class="number">3.0</span> <span class="special">/</span> <span class="number">4.0</span> <span class="special">}};</span>
  2249. <span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special">&lt;</span> <span class="keyword">double</span> <span class="special">,</span> <span class="number">3</span> <span class="special">&gt;</span> <span class="identifier">heun_c</span> <span class="special">=</span> <span class="special">{{</span> <span class="number">0.0</span> <span class="special">,</span> <span class="number">1.0</span> <span class="special">/</span> <span class="number">3.0</span> <span class="special">,</span> <span class="number">2.0</span> <span class="special">/</span> <span class="number">3.0</span> <span class="special">}};</span>
  2250. </pre>
  2251. <p>
  2252. </p>
  2253. <p>
  2254. But then you are nailed down to use doubles.
  2255. </p>
  2256. <p>
  2257. Next, you need to define your stepper, note that the Heun method has 3
  2258. stages and produces approximations of order 3:
  2259. </p>
  2260. <p>
  2261. </p>
  2262. <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span>
  2263. <span class="keyword">class</span> <span class="identifier">State</span> <span class="special">,</span>
  2264. <span class="keyword">class</span> <span class="identifier">Value</span> <span class="special">=</span> <span class="keyword">double</span> <span class="special">,</span>
  2265. <span class="keyword">class</span> <span class="identifier">Deriv</span> <span class="special">=</span> <span class="identifier">State</span> <span class="special">,</span>
  2266. <span class="keyword">class</span> <span class="identifier">Time</span> <span class="special">=</span> <span class="identifier">Value</span> <span class="special">,</span>
  2267. <span class="keyword">class</span> <span class="identifier">Algebra</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">odeint</span><span class="special">::</span><span class="identifier">range_algebra</span> <span class="special">,</span>
  2268. <span class="keyword">class</span> <span class="identifier">Operations</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">odeint</span><span class="special">::</span><span class="identifier">default_operations</span> <span class="special">,</span>
  2269. <span class="keyword">class</span> <span class="identifier">Resizer</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">odeint</span><span class="special">::</span><span class="identifier">initially_resizer</span>
  2270. <span class="special">&gt;</span>
  2271. <span class="keyword">class</span> <span class="identifier">heun</span> <span class="special">:</span> <span class="keyword">public</span>
  2272. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">odeint</span><span class="special">::</span><span class="identifier">explicit_generic_rk</span><span class="special">&lt;</span> <span class="number">3</span> <span class="special">,</span> <span class="number">3</span> <span class="special">,</span> <span class="identifier">State</span> <span class="special">,</span> <span class="identifier">Value</span> <span class="special">,</span> <span class="identifier">Deriv</span> <span class="special">,</span> <span class="identifier">Time</span> <span class="special">,</span>
  2273. <span class="identifier">Algebra</span> <span class="special">,</span> <span class="identifier">Operations</span> <span class="special">,</span> <span class="identifier">Resizer</span> <span class="special">&gt;</span>
  2274. <span class="special">{</span>
  2275. <span class="keyword">public</span><span class="special">:</span>
  2276. <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">odeint</span><span class="special">::</span><span class="identifier">explicit_generic_rk</span><span class="special">&lt;</span> <span class="number">3</span> <span class="special">,</span> <span class="number">3</span> <span class="special">,</span> <span class="identifier">State</span> <span class="special">,</span> <span class="identifier">Value</span> <span class="special">,</span> <span class="identifier">Deriv</span> <span class="special">,</span> <span class="identifier">Time</span> <span class="special">,</span>
  2277. <span class="identifier">Algebra</span> <span class="special">,</span> <span class="identifier">Operations</span> <span class="special">,</span> <span class="identifier">Resizer</span> <span class="special">&gt;</span> <span class="identifier">stepper_base_type</span><span class="special">;</span>
  2278. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">stepper_base_type</span><span class="special">::</span><span class="identifier">state_type</span> <span class="identifier">state_type</span><span class="special">;</span>
  2279. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">stepper_base_type</span><span class="special">::</span><span class="identifier">wrapped_state_type</span> <span class="identifier">wrapped_state_type</span><span class="special">;</span>
  2280. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">stepper_base_type</span><span class="special">::</span><span class="identifier">value_type</span> <span class="identifier">value_type</span><span class="special">;</span>
  2281. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">stepper_base_type</span><span class="special">::</span><span class="identifier">deriv_type</span> <span class="identifier">deriv_type</span><span class="special">;</span>
  2282. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">stepper_base_type</span><span class="special">::</span><span class="identifier">wrapped_deriv_type</span> <span class="identifier">wrapped_deriv_type</span><span class="special">;</span>
  2283. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">stepper_base_type</span><span class="special">::</span><span class="identifier">time_type</span> <span class="identifier">time_type</span><span class="special">;</span>
  2284. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">stepper_base_type</span><span class="special">::</span><span class="identifier">algebra_type</span> <span class="identifier">algebra_type</span><span class="special">;</span>
  2285. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">stepper_base_type</span><span class="special">::</span><span class="identifier">operations_type</span> <span class="identifier">operations_type</span><span class="special">;</span>
  2286. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">stepper_base_type</span><span class="special">::</span><span class="identifier">resizer_type</span> <span class="identifier">resizer_type</span><span class="special">;</span>
  2287. <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">stepper_base_type</span><span class="special">::</span><span class="identifier">stepper_type</span> <span class="identifier">stepper_type</span><span class="special">;</span>
  2288. <span class="identifier">heun</span><span class="special">(</span> <span class="keyword">const</span> <span class="identifier">algebra_type</span> <span class="special">&amp;</span><span class="identifier">algebra</span> <span class="special">=</span> <span class="identifier">algebra_type</span><span class="special">()</span> <span class="special">)</span>
  2289. <span class="special">:</span> <span class="identifier">stepper_base_type</span><span class="special">(</span>
  2290. <span class="identifier">fusion</span><span class="special">::</span><span class="identifier">make_vector</span><span class="special">(</span>
  2291. <span class="identifier">heun_a1</span><span class="special">&lt;</span><span class="identifier">Value</span><span class="special">&gt;()</span> <span class="special">,</span>
  2292. <span class="identifier">heun_a2</span><span class="special">&lt;</span><span class="identifier">Value</span><span class="special">&gt;()</span> <span class="special">)</span> <span class="special">,</span>
  2293. <span class="identifier">heun_b</span><span class="special">&lt;</span><span class="identifier">Value</span><span class="special">&gt;()</span> <span class="special">,</span> <span class="identifier">heun_c</span><span class="special">&lt;</span><span class="identifier">Value</span><span class="special">&gt;()</span> <span class="special">,</span> <span class="identifier">algebra</span> <span class="special">)</span>
  2294. <span class="special">{</span> <span class="special">}</span>
  2295. <span class="special">};</span>
  2296. </pre>
  2297. <p>
  2298. </p>
  2299. <p>
  2300. That's it. Now, we have a new stepper method and we can use it, for example
  2301. with the Lorenz system:
  2302. </p>
  2303. <p>
  2304. </p>
  2305. <pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span><span class="special">&lt;</span> <span class="keyword">double</span> <span class="special">,</span> <span class="number">3</span> <span class="special">&gt;</span> <span class="identifier">state_type</span><span class="special">;</span>
  2306. <span class="identifier">heun</span><span class="special">&lt;</span> <span class="identifier">state_type</span> <span class="special">&gt;</span> <span class="identifier">h</span><span class="special">;</span>
  2307. <span class="identifier">state_type</span> <span class="identifier">x</span> <span class="special">=</span> <span class="special">{{</span> <span class="number">10.0</span> <span class="special">,</span> <span class="number">10.0</span> <span class="special">,</span> <span class="number">10.0</span> <span class="special">}};</span>
  2308. <span class="identifier">integrate_const</span><span class="special">(</span> <span class="identifier">h</span> <span class="special">,</span> <span class="identifier">lorenz</span><span class="special">()</span> <span class="special">,</span> <span class="identifier">x</span> <span class="special">,</span> <span class="number">0.0</span> <span class="special">,</span> <span class="number">100.0</span> <span class="special">,</span> <span class="number">0.01</span> <span class="special">,</span>
  2309. <span class="identifier">streaming_observer</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special">)</span> <span class="special">);</span>
  2310. </pre>
  2311. <p>
  2312. </p>
  2313. </div>
  2314. <div class="footnotes">
  2315. <br><hr style="width:100; text-align:left;margin-left: 0">
  2316. <div id="ftn.boost_numeric_odeint.odeint_in_detail.steppers.custom_runge_kutta_steppers.f0" class="footnote"><p><a href="#boost_numeric_odeint.odeint_in_detail.steppers.custom_runge_kutta_steppers.f0" class="para"><sup class="para">[1] </sup></a>
  2317. M. Mulansky, K. Ahnert, Template-Metaprogramming applied to numerical
  2318. problems, <a href="http://arxiv.org/abs/1110.3233" target="_top">arxiv:1110.3233</a>
  2319. </p></div>
  2320. </div>
  2321. </div>
  2322. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  2323. <td align="left"></td>
  2324. <td align="right"><div class="copyright-footer">Copyright &#169; 2009-2015 Karsten Ahnert and Mario Mulansky<p>
  2325. Distributed under the Boost Software License, Version 1.0. (See accompanying
  2326. file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
  2327. </p>
  2328. </div></td>
  2329. </tr></table>
  2330. <hr>
  2331. <div class="spirit-nav">
  2332. <a accesskey="p" href="../odeint_in_detail.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../odeint_in_detail.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="generation_functions.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
  2333. </div>
  2334. </body>
  2335. </html>