• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Generation functions</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 1. Boost.Numeric.Odeint">
8<link rel="up" href="../odeint_in_detail.html" title="odeint in detail">
9<link rel="prev" href="steppers.html" title="Steppers">
10<link rel="next" href="integrate_functions.html" title="Integrate 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="steppers.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="integrate_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.generation_functions"></a><a class="link" href="generation_functions.html" title="Generation functions">Generation
28      functions</a>
29</h3></div></div></div>
30<p>
31        In the <a class="link" href="../tutorial.html" title="Tutorial">Tutorial</a> we have
32        learned how we can use the generation functions <code class="computeroutput"><span class="identifier">make_controlled</span></code>
33        and <code class="computeroutput"><span class="identifier">make_dense_output</span></code> to
34        create controlled and dense output stepper from a simple stepper or an error
35        stepper. The syntax of these two functions is very simple:
36      </p>
37<p>
38</p>
39<pre class="programlisting"><span class="keyword">auto</span> <span class="identifier">stepper1</span> <span class="special">=</span> <span class="identifier">make_controlled</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">stepper_type</span><span class="special">()</span> <span class="special">);</span>
40<span class="comment">// or with max step size limit:</span>
41<span class="comment">// auto stepper1 = make_controlled( 1.0e-6 , 1.0e-6 , 0.01, stepper_type() );</span>
42
43<span class="keyword">auto</span> <span class="identifier">stepper2</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">stepper_type</span><span class="special">()</span> <span class="special">);</span>
44</pre>
45<p>
46      </p>
47<p>
48        The first two parameters are the absolute and the relative error tolerances
49        and the third parameter is the stepper. Additionally, a second version exists
50        where additionally a maximal step size is supplied which ensures the the
51        step size is not increased above this value. In C++03 you can infer the type
52        from the <code class="computeroutput"><span class="identifier">result_of</span></code> mechanism:
53      </p>
54<p>
55</p>
56<pre class="programlisting"><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_controlled</span><span class="special">&lt;</span> <span class="identifier">stepper_type</span> <span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">stepper3</span> <span class="special">=</span> <span class="identifier">make_controlled</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">stepper_type</span><span class="special">()</span> <span class="special">);</span>
57<span class="special">(</span><span class="keyword">void</span><span class="special">)</span><span class="identifier">stepper3</span><span class="special">;</span>
58<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> <span class="identifier">stepper_type</span> <span class="special">&gt;::</span><span class="identifier">type</span> <span class="identifier">stepper4</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">stepper_type</span><span class="special">()</span> <span class="special">);</span>
59<span class="special">(</span><span class="keyword">void</span><span class="special">)</span><span class="identifier">stepper4</span><span class="special">;</span>
60</pre>
61<p>
62      </p>
63<p>
64        To use your own steppers with the <code class="computeroutput"><span class="identifier">make_controlled</span></code>
65        or <code class="computeroutput"><span class="identifier">make_dense_output</span></code> you
66        need to specialize two class templates. Suppose your steppers are called
67        <code class="computeroutput"><span class="identifier">custom_stepper</span></code>, <code class="computeroutput"><span class="identifier">custom_controller</span></code> and <code class="computeroutput"><span class="identifier">custom_dense_output</span></code>.
68        Then, the first class you need to specialize is <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">numeric</span><span class="special">::</span><span class="identifier">get_controller</span></code>,
69        a meta function returning the type of the controller:
70      </p>
71<p>
72</p>
73<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">odeint</span> <span class="special">{</span>
74
75<span class="keyword">template</span><span class="special">&lt;&gt;</span>
76<span class="keyword">struct</span> <span class="identifier">get_controller</span><span class="special">&lt;</span> <span class="identifier">custom_stepper</span> <span class="special">&gt;</span>
77<span class="special">{</span>
78    <span class="keyword">typedef</span> <span class="identifier">custom_controller</span> <span class="identifier">type</span><span class="special">;</span>
79<span class="special">};</span>
80
81<span class="special">}</span> <span class="special">}</span> <span class="special">}</span>
82</pre>
83<p>
84      </p>
85<p>
86        The second one is a factory class <code class="computeroutput"><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">controller_factory</span></code>
87        which constructs the controller from the tolerances and the stepper. In our
88        dummy implementation this class is
89      </p>
90<p>
91</p>
92<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">numeric</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">odeint</span> <span class="special">{</span>
93
94<span class="keyword">template</span><span class="special">&lt;&gt;</span>
95<span class="keyword">struct</span> <span class="identifier">controller_factory</span><span class="special">&lt;</span> <span class="identifier">custom_stepper</span> <span class="special">,</span> <span class="identifier">custom_controller</span> <span class="special">&gt;</span>
96<span class="special">{</span>
97    <span class="identifier">custom_controller</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">double</span> <span class="identifier">abs_tol</span> <span class="special">,</span> <span class="keyword">double</span> <span class="identifier">rel_tol</span> <span class="special">,</span> <span class="keyword">const</span> <span class="identifier">custom_stepper</span> <span class="special">&amp;</span> <span class="special">)</span> <span class="keyword">const</span>
98    <span class="special">{</span>
99        <span class="keyword">return</span> <span class="identifier">custom_controller</span><span class="special">();</span>
100    <span class="special">}</span>
101
102    <span class="identifier">custom_controller</span> <span class="keyword">operator</span><span class="special">()(</span> <span class="keyword">double</span> <span class="identifier">abs_tol</span> <span class="special">,</span> <span class="keyword">double</span> <span class="identifier">rel_tol</span> <span class="special">,</span> <span class="keyword">double</span> <span class="identifier">max_dt</span> <span class="special">,</span>
103                                  <span class="keyword">const</span> <span class="identifier">custom_stepper</span> <span class="special">&amp;</span> <span class="special">)</span> <span class="keyword">const</span>
104    <span class="special">{</span>
105        <span class="comment">// version with maximal allowed step size max_dt</span>
106        <span class="keyword">return</span> <span class="identifier">custom_controller</span><span class="special">();</span>
107    <span class="special">}</span>
108<span class="special">};</span>
109
110<span class="special">}</span> <span class="special">}</span> <span class="special">}</span>
111</pre>
112<p>
113      </p>
114<p>
115        This is all to use the <code class="computeroutput"><span class="identifier">make_controlled</span></code>
116        mechanism. Now you can use your controller via
117      </p>
118<p>
119</p>
120<pre class="programlisting"><span class="keyword">auto</span> <span class="identifier">stepper5</span> <span class="special">=</span> <span class="identifier">make_controlled</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">custom_stepper</span><span class="special">()</span> <span class="special">);</span>
121</pre>
122<p>
123      </p>
124<p>
125        For the dense_output_stepper everything works similar. Here you have to specialize
126        <code class="computeroutput"><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">get_dense_output</span></code> and <code class="computeroutput"><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">dense_output_factory</span></code>.
127        These two classes have the same syntax as their relatives <code class="computeroutput"><span class="identifier">get_controller</span></code>
128        and <code class="computeroutput"><span class="identifier">controller_factory</span></code>.
129      </p>
130<p>
131        All controllers and dense-output steppers in odeint can be used with these
132        mechanisms. In the table below you will find, which steppers is constructed
133        from <code class="computeroutput"><span class="identifier">make_controlled</span></code> or
134        <code class="computeroutput"><span class="identifier">make_dense_output</span></code> if applied
135        on a stepper from odeint:
136      </p>
137<div class="table">
138<a name="boost_numeric_odeint.odeint_in_detail.generation_functions.generation_functions_make_controlled__abs_error___rel_error___stepper__"></a><p class="title"><b>Table 1.7. Generation functions make_controlled( abs_error , rel_error , stepper
139        )</b></p>
140<div class="table-contents"><table class="table" summary="Generation functions make_controlled( abs_error , rel_error , stepper
141        )">
142<colgroup>
143<col>
144<col>
145<col>
146</colgroup>
147<thead><tr>
148<th>
149                <p>
150                  Stepper
151                </p>
152              </th>
153<th>
154                <p>
155                  Result of make_controlled
156                </p>
157              </th>
158<th>
159                <p>
160                  Remarks
161                </p>
162              </th>
163</tr></thead>
164<tbody>
165<tr>
166<td>
167                <p>
168                  <code class="computeroutput"><span class="identifier">runge_kutta_cash_karp54</span></code>
169                </p>
170              </td>
171<td>
172                <p>
173                  <code class="computeroutput"><span class="identifier">controlled_runge_kutta</span><span class="special">&lt;</span> <span class="identifier">runge_kutta_cash_karp54</span>
174                  <span class="special">,</span> <span class="identifier">default_error_checker</span><span class="special">&lt;...&gt;</span> <span class="special">&gt;</span></code>
175                </p>
176              </td>
177<td>
178                <p>
179                  <span class="emphasis"><em>a<sub>x</sub>=1</em></span>, <span class="emphasis"><em>a<sub>dxdt</sub>=1</em></span>
180                </p>
181              </td>
182</tr>
183<tr>
184<td>
185                <p>
186                  <code class="computeroutput"><span class="identifier">runge_kutta_fehlberg78</span></code>
187                </p>
188              </td>
189<td>
190                <p>
191                  <code class="computeroutput"><span class="identifier">controlled_runge_kutta</span><span class="special">&lt;</span> <span class="identifier">runge_kutta_fehlberg78</span>
192                  <span class="special">,</span> <span class="identifier">default_error_checker</span><span class="special">&lt;...&gt;</span> <span class="special">&gt;</span></code>
193                </p>
194              </td>
195<td>
196                <p>
197                  <span class="emphasis"><em>a<sub>x</sub>=1</em></span>, <span class="emphasis"><em>a<sub>dxdt</sub>=1</em></span>
198                </p>
199              </td>
200</tr>
201<tr>
202<td>
203                <p>
204                  <code class="computeroutput"><span class="identifier">runge_kutta_dopri5</span></code>
205                </p>
206              </td>
207<td>
208                <p>
209                  <code class="computeroutput"><span class="identifier">controlled_runge_kutta</span><span class="special">&lt;</span> <span class="identifier">runge_kutta_dopri5</span>
210                  <span class="special">,</span> <span class="identifier">default_error_checker</span><span class="special">&lt;...&gt;</span> <span class="special">&gt;</span></code>
211                </p>
212              </td>
213<td>
214                <p>
215                  <span class="emphasis"><em>a <sub>x</sub>=1</em></span>, <span class="emphasis"><em>a<sub>dxdt</sub>=1</em></span>
216                </p>
217              </td>
218</tr>
219<tr>
220<td>
221                <p>
222                  <code class="computeroutput"><span class="identifier">rosenbrock4</span></code>
223                </p>
224              </td>
225<td>
226                <p>
227                  <code class="computeroutput"><span class="identifier">rosenbrock4_controlled</span><span class="special">&lt;</span> <span class="identifier">rosenbrock4</span>
228                  <span class="special">&gt;</span></code>
229                </p>
230              </td>
231<td>
232                <p>
233                  -
234                </p>
235              </td>
236</tr>
237</tbody>
238</table></div>
239</div>
240<br class="table-break"><div class="table">
241<a name="boost_numeric_odeint.odeint_in_detail.generation_functions.generation_functions_make_dense_output__abs_error___rel_error___stepper__"></a><p class="title"><b>Table 1.8. Generation functions make_dense_output( abs_error , rel_error , stepper
242        )</b></p>
243<div class="table-contents"><table class="table" summary="Generation functions make_dense_output( abs_error , rel_error , stepper
244        )">
245<colgroup>
246<col>
247<col>
248<col>
249</colgroup>
250<thead><tr>
251<th>
252                <p>
253                  Stepper
254                </p>
255              </th>
256<th>
257                <p>
258                  Result of make_dense_output
259                </p>
260              </th>
261<th>
262                <p>
263                  Remarks
264                </p>
265              </th>
266</tr></thead>
267<tbody>
268<tr>
269<td>
270                <p>
271                  <code class="computeroutput"><span class="identifier">runge_kutta_dopri5</span></code>
272                </p>
273              </td>
274<td>
275                <p>
276                  <code class="computeroutput"><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>
277                  <span class="special">,</span> <span class="identifier">default_error_checker</span><span class="special">&lt;...&gt;</span> <span class="special">&gt;</span>
278                  <span class="special">&gt;</span></code>
279                </p>
280              </td>
281<td>
282                <p>
283                  <span class="emphasis"><em>a <sub>x</sub>=1</em></span>, <span class="emphasis"><em>a<sub>dxdt</sub>=1</em></span>
284                </p>
285              </td>
286</tr>
287<tr>
288<td>
289                <p>
290                  <code class="computeroutput"><span class="identifier">rosenbrock4</span></code>
291                </p>
292              </td>
293<td>
294                <p>
295                  <code class="computeroutput"><span class="identifier">rosenbrock4_dense_output</span><span class="special">&lt;</span> <span class="identifier">rosenbrock4_controller</span><span class="special">&lt;</span> <span class="identifier">rosenbrock4</span>
296                  <span class="special">&gt;</span> <span class="special">&gt;</span></code>
297                </p>
298              </td>
299<td>
300                <p>
301                  -
302                </p>
303              </td>
304</tr>
305</tbody>
306</table></div>
307</div>
308<br class="table-break">
309</div>
310<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
311<td align="left"></td>
312<td align="right"><div class="copyright-footer">Copyright © 2009-2015 Karsten Ahnert and Mario Mulansky<p>
313        Distributed under the Boost Software License, Version 1.0. (See accompanying
314        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>)
315      </p>
316</div></td>
317</tr></table>
318<hr>
319<div class="spirit-nav">
320<a accesskey="p" href="steppers.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="integrate_functions.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
321</div>
322</body>
323</html>
324