integrate_function_adapt_simp_ex.cpp 3.05 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// The contents of this file are in the public domain.  See
// LICENSE_FOR_EXAMPLE_PROGRAMS.txt

/*

    This example demonstrates the usage of the numerical quadrature function 
    integrate_function_adapt_simpson.  This function takes as input a single variable 
    function, the endpoints of a domain over which the function will be integrated, and a 
    tolerance parameter.  It outputs an approximation of the integral of this function 
    over the specified domain.  The algorithm is based on the adaptive Simpson method outlined in: 

    Numerical Integration method based on the adaptive Simpson method in
    Gander, W. and W. Gautschi, "Adaptive Quadrature – Revisited,"
    BIT, Vol. 40, 2000, pp. 84-101

*/

#include <iostream>
#include <stdint.h>
#include <dlib/matrix.h>
#include <dlib/numeric_constants.h>
#include <dlib/integrate_function_adapt_simpson.h>

using namespace std;
using namespace dlib;

// Here we define a class that consists of the set of functions that we 
// wish to integrate and comment in the domain of integration.

30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
// x in [0,1]
static double gg1(double x)
{
    return pow(e,x);
}   

// x in [0,1]
static double gg2(double x)
{
    return x*x;
}

// x in [0, pi]
static double gg3(double x)
{
    return 1/(x*x + cos(x)*cos(x));
}

// x in [-pi, pi]
static double gg4(double x)
{
    return sin(x);
}

// x in [0,2]
static double gg5(double x)
{
    return 1/(1 + x*x);
}
59
60
61
62

// Examples 
int main()
{
63
    // We first define a tolerance parameter.  Roughly speaking, a lower tolerance will
64
65
66
67
68
69
70
71
    // result in a more accurate approximation of the true integral.  However, there are 
    // instances where too small of a tolerance may yield a less accurate approximation
    // than a larger tolerance.  We recommend taking the tolerance to be in the
    // [1e-10, 1e-8] region.
    
    double tol = 1e-10;

    // Here we instantiate a class which contains the numerical quadrature method.
72
    //    adapt_simp ad;
73
74
75
76

    // Here we compute the integrals of the five functions defined above using the same 
    // tolerance level for each.

77
78
79
80
81
    double m1 = integrate_function_adapt_simp(&gg1, 0.0, 1.0, tol);
    double m2 = integrate_function_adapt_simp(&gg2, 0.0, 1.0, tol);
    double m3 = integrate_function_adapt_simp(&gg3, 0.0, pi, tol);
    double m4 = integrate_function_adapt_simp(&gg4, -pi, pi, tol);
    double m5 = integrate_function_adapt_simp(&gg5, 0.0, 2.0, tol);
82
83
84
85

    // We finally print out the values of each of the approximated integrals to ten
    // significant digits.

86
87
88
89
90
    cout << "\nThe integral of exp(x) for x in [0,1] is "          << std::setprecision(10) <<  m1  << endl; 
    cout << "The integral of x^2 for in [0,1] is "                 << std::setprecision(10) <<  m2  << endl; 
    cout << "The integral of 1/(x^2 + cos(x)^2) for in [0,pi] is " << std::setprecision(10) <<  m3  << endl;
    cout << "The integral of sin(x) for in [-pi,pi] is "           << std::setprecision(10) <<  m4  << endl;
    cout << "The integral of 1/(1+x^2) for in [0,2] is "           << std::setprecision(10) <<  m5  << endl;
91
92
93
94
95
    cout << "" << endl;

    return 0;
}