]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/math/example/bessel_zeros_interator_example.cpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / math / example / bessel_zeros_interator_example.cpp
CommitLineData
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
25This example demonstrates summing zeros of the Bessel functions.
26To 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`
32to create a sum of ['1/zeros[super 2]] by defining a custom output iterator:
33*/
34
35template <class T>
36struct 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 }
51private:
52 T* p_sum;
53};
54
55//] [/bessel_zeros_iterator_example_1]
56
57int 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*/