Algorithms_in_C++ 1.0.0
Set of algorithms implemented in C++.
Loading...
Searching...
No Matches
integral_approximation.cpp File Reference

Compute integral approximation of the function using Riemann sum More...

#include <cassert>
#include <cmath>
#include <functional>
#include <iostream>
Include dependency graph for integral_approximation.cpp:

Namespaces

namespace  math
 for IO operations
 

Functions

double math::integral_approx (double lb, double ub, const std::function< double(double)> &func, double delta=.0001)
 Computes integral approximation.
 
void math::test_eval (double approx, double expected, double threshold)
 Wrapper to evaluate if the approximated value is within .XX% threshold of the exact value.
 
static void test ()
 
int main ()
 Main function.
 

Detailed Description

Compute integral approximation of the function using Riemann sum

In mathematics, a Riemann sum is a certain kind of approximation of an integral by a finite sum. It is named after nineteenth-century German mathematician Bernhard Riemann. One very common application is approximating the area of functions or lines on a graph and the length of curves and other approximations. The sum is calculated by partitioning the region into shapes (rectangles, trapezoids, parabolas, or cubics) that form a region similar to the region being measured, then calculating the area for each of these shapes, and finally adding all of these small areas together. This approach can be used to find a numerical approximation for a definite integral even if the fundamental theorem of calculus does not make it easy to find a closed-form solution. Because the region filled by the small shapes is usually not the same shape as the region being measured, the Riemann sum will differ from the area being measured. This error can be reduced by dividing up the region more finely, using smaller and smaller shapes. As the shapes get smaller and smaller, the sum approaches the Riemann integral.

Author
Benjamin Walton
Shiqi Sheng

Function Documentation

◆ main()

int main ( void )

Main function.

Returns
0 on exit
122 {
123 test(); // run self-test implementations
124 return 0;
125}
void test()
Definition caesar_cipher.cpp:100
Here is the call graph for this function:

◆ test()

static void test ( )
static
64 {
66 3.24, 7.56, [](const double x) { return log(x) + exp(x) + x; });
67 std::cout << "Test Case 1" << std::endl;
68 std::cout << "function: log(x) + e^x + x" << std::endl;
69 std::cout << "range: [3.24, 7.56]" << std::endl;
70 std::cout << "value: " << test_1 << std::endl;
71 math::test_eval(test_1, 1924.80384023549, .001);
72 std::cout << "Test 1 Passed!" << std::endl;
73 std::cout << "=====================" << std::endl;
74
75 double test_2 = math::integral_approx(0.023, 3.69, [](const double x) {
76 return x * x + cos(x) + exp(x) + log(x) * log(x);
77 });
78 std::cout << "Test Case 2" << std::endl;
79 std::cout << "function: x^2 + cos(x) + e^x + log^2(x)" << std::endl;
80 std::cout << "range: [.023, 3.69]" << std::endl;
81 std::cout << "value: " << test_2 << std::endl;
82 math::test_eval(test_2, 58.71291345202729, .001);
83 std::cout << "Test 2 Passed!" << std::endl;
84 std::cout << "=====================" << std::endl;
85
87 10.78, 24.899, [](const double x) { return x * x * x - x * x + 378; });
88 std::cout << "Test Case 3" << std::endl;
89 std::cout << "function: x^3 - x^2 + 378" << std::endl;
90 std::cout << "range: [10.78, 24.899]" << std::endl;
91 std::cout << "value: " << test_3 << std::endl;
92 math::test_eval(test_3, 93320.65915078377, .001);
93 std::cout << "Test 3 Passed!" << std::endl;
94 std::cout << "=====================" << std::endl;
95
96 double test_4 = math::integral_approx(
97 .101, .505,
98 [](const double x) { return cos(x) * tan(x) * x * x + exp(x); },
99 .00001);
100 std::cout << "Test Case 4" << std::endl;
101 std::cout << "function: cos(x)*tan(x)*x^2 + e^x" << std::endl;
102 std::cout << "range: [.101, .505]" << std::endl;
103 std::cout << "value: " << test_4 << std::endl;
104 math::test_eval(test_4, 0.566485986311631, .001);
105 std::cout << "Test 4 Passed!" << std::endl;
106 std::cout << "=====================" << std::endl;
107
108 double test_5 = math::integral_approx(
109 -1, 1, [](const double x) { return exp(-1 / (x * x)); });
110 std::cout << "Test Case 5" << std::endl;
111 std::cout << "function: e^(-1/x^2)" << std::endl;
112 std::cout << "range: [-1, 1]" << std::endl;
113 std::cout << "value: " << test_5 << std::endl;
114 math::test_eval(test_5, 0.1781477117815607, .001);
115 std::cout << "Test 5 Passed!" << std::endl;
116}
T cos(T... args)
T endl(T... args)
T exp(T... args)
static void test_1()
Definition heavy_light_decomposition.cpp:505
static void test_2()
Definition heavy_light_decomposition.cpp:549
static void test_3()
Definition heavy_light_decomposition.cpp:592
T log(T... args)
void test_eval(double approx, double expected, double threshold)
Wrapper to evaluate if the approximated value is within .XX% threshold of the exact value.
Definition integral_approximation.cpp:51
double integral_approx(double lb, double ub, const std::function< double(double)> &func, double delta=.0001)
Computes integral approximation.
Definition integral_approximation.cpp:31
T tan(T... args)