]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // Copyright Christopher Kormanyos 2013. |
2 | // Copyright Paul A. Bristow 2013. | |
3 | // Copyright John Maddock 2013. | |
4 | ||
5 | // Distributed under the Boost Software License, Version 1.0. | |
6 | // (See accompanying file LICENSE_1_0.txt or | |
7 | // copy at http://www.boost.org/LICENSE_1_0.txt). | |
8 | ||
9 | #ifdef _MSC_VER | |
10 | # pragma warning (disable : 4512) // assignment operator could not be generated. | |
11 | # pragma warning (disable : 4996) // assignment operator could not be generated. | |
12 | #endif | |
13 | ||
14 | #include <iostream> | |
15 | #include <limits> | |
16 | #include <vector> | |
17 | #include <algorithm> | |
18 | #include <iomanip> | |
19 | #include <iterator> | |
20 | ||
21 | //[bessel_zeros_iterator_example_1 | |
22 | ||
23 | /*`[h5 Using Output Iterator to sum zeros of Bessel Functions] | |
24 | ||
25 | This example demonstrates summing zeros of the Bessel functions. | |
26 | To use the functions for finding zeros of the functions we need | |
27 | */ | |
28 | ||
29 | #include <boost/math/special_functions/bessel.hpp> | |
30 | ||
31 | /*`We use the `cyl_bessel_j_zero` output iterator parameter `out_it` | |
32 | to create a sum of ['1/zeros[super 2]] by defining a custom output iterator: | |
33 | */ | |
34 | ||
35 | template <class T> | |
36 | struct output_summation_iterator | |
37 | { | |
38 | output_summation_iterator(T* p) : p_sum(p) | |
39 | {} | |
40 | output_summation_iterator& operator*() | |
41 | { return *this; } | |
42 | output_summation_iterator& operator++() | |
43 | { return *this; } | |
44 | output_summation_iterator& operator++(int) | |
45 | { return *this; } | |
46 | output_summation_iterator& operator = (T const& val) | |
47 | { | |
48 | *p_sum += 1./ (val * val); // Summing 1/zero^2. | |
49 | return *this; | |
50 | } | |
51 | private: | |
52 | T* p_sum; | |
53 | }; | |
54 | ||
55 | //] [/bessel_zeros_iterator_example_1] | |
56 | ||
57 | int main() | |
58 | { | |
59 | try | |
60 | { | |
61 | //[bessel_zeros_iterator_example_2 | |
62 | ||
63 | /*`The sum is calculated for many values, converging on the analytical exact value of `1/8`. | |
64 | */ | |
65 | using boost::math::cyl_bessel_j_zero; | |
66 | double nu = 1.; | |
67 | double sum = 0; | |
68 | output_summation_iterator<double> it(&sum); // sum of 1/zeros^2 | |
69 | cyl_bessel_j_zero(nu, 1, 10000, it); | |
70 | ||
71 | double s = 1/(4 * (nu + 1)); // 0.125 = 1/8 is exact analytical solution. | |
72 | std::cout << std::setprecision(6) << "nu = " << nu << ", sum = " << sum | |
73 | << ", exact = " << s << std::endl; | |
74 | // nu = 1.00000, sum = 0.124990, exact = 0.125000 | |
75 | //] [/bessel_zeros_iterator_example_2] | |
76 | } | |
77 | catch (std::exception ex) | |
78 | { | |
79 | std::cout << "Thrown exception " << ex.what() << std::endl; | |
80 | } | |
81 | return 0; | |
82 | } // int_main() | |
83 | ||
84 | /* | |
85 | Output: | |
86 | ||
87 | nu = 1, sum = 0.12499, exact = 0.125 | |
88 | */ |