summaryrefslogtreecommitdiffstats
path: root/ml/dlib/examples/integrate_function_adapt_simp_ex.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ml/dlib/examples/integrate_function_adapt_simp_ex.cpp')
-rw-r--r--ml/dlib/examples/integrate_function_adapt_simp_ex.cpp89
1 files changed, 89 insertions, 0 deletions
diff --git a/ml/dlib/examples/integrate_function_adapt_simp_ex.cpp b/ml/dlib/examples/integrate_function_adapt_simp_ex.cpp
new file mode 100644
index 000000000..6d2c8f76b
--- /dev/null
+++ b/ml/dlib/examples/integrate_function_adapt_simp_ex.cpp
@@ -0,0 +1,89 @@
+// 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_simp(). 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 <dlib/matrix.h>
+#include <dlib/numeric_constants.h>
+#include <dlib/numerical_integration.h>
+
+using namespace std;
+using namespace dlib;
+
+// Here we the set of functions that we wish to integrate and comment in the domain of
+// integration.
+
+// x in [0,1]
+double gg1(double x)
+{
+ return pow(e,x);
+}
+
+// x in [0,1]
+double gg2(double x)
+{
+ return x*x;
+}
+
+// x in [0, pi]
+double gg3(double x)
+{
+ return 1/(x*x + cos(x)*cos(x));
+}
+
+// x in [-pi, pi]
+double gg4(double x)
+{
+ return sin(x);
+}
+
+// x in [0,2]
+double gg5(double x)
+{
+ return 1/(1 + x*x);
+}
+
+int main()
+{
+ // We first define a tolerance parameter. Roughly speaking, a lower tolerance will
+ // 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 compute the integrals of the five functions defined above using the same
+ // tolerance level for each.
+
+ 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);
+
+ // We finally print out the values of each of the approximated integrals to ten
+ // significant digits.
+
+ 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;
+ cout << endl;
+
+ return 0;
+}
+