TheAlgorithms/C++
1.0.0
All the algorithms implemented in C++
Toggle main menu visibility
Loading...
Searching...
No Matches
integral_approximation.cpp
Go to the documentation of this file.
1
23
#include <cassert>
24
#include <cmath>
25
#include <cstdint>
26
#include <functional>
27
#include <iostream>
28
33
namespace
math
{
42
double
integral_approx
(
double
lb,
double
ub,
43
const
std::function<
double
(
double
)>& func,
44
double
delta = .0001) {
45
double
result = 0;
46
uint64_t numDeltas =
static_cast<
uint64_t
>
((ub - lb) / delta);
47
for
(
int
i = 0; i < numDeltas; i++) {
48
double
begin = lb + i * delta;
49
double
end = lb + (i + 1) * delta;
50
result += delta * (func(begin) + func(end)) / 2;
51
}
52
return
result;
53
}
54
62
void
test_eval
(
double
approx,
double
expected,
double
threshold) {
63
assert(approx >= expected * (1 - threshold));
64
assert(approx <= expected * (1 + threshold));
65
}
66
73
}
// namespace math
74
75
static
void
test
() {
76
double
test_1 =
math::integral_approx
(
77
3.24, 7.56, [](
const
double
x) {
return
log
(x) +
exp
(x) + x; });
78
std::cout <<
"Test Case 1"
<< std::endl;
79
std::cout <<
"function: log(x) + e^x + x"
<< std::endl;
80
std::cout <<
"range: [3.24, 7.56]"
<< std::endl;
81
std::cout <<
"value: "
<< test_1 << std::endl;
82
math::test_eval
(test_1, 1924.80384023549, .001);
83
std::cout <<
"Test 1 Passed!"
<< std::endl;
84
std::cout <<
"====================="
<< std::endl;
85
86
double
test_2 =
math::integral_approx
(0.023, 3.69, [](
const
double
x) {
87
return
x * x + cos(x) +
exp
(x) +
log
(x) *
log
(x);
88
});
89
std::cout <<
"Test Case 2"
<< std::endl;
90
std::cout <<
"function: x^2 + cos(x) + e^x + log^2(x)"
<< std::endl;
91
std::cout <<
"range: [.023, 3.69]"
<< std::endl;
92
std::cout <<
"value: "
<< test_2 << std::endl;
93
math::test_eval
(test_2, 58.71291345202729, .001);
94
std::cout <<
"Test 2 Passed!"
<< std::endl;
95
std::cout <<
"====================="
<< std::endl;
96
97
double
test_3 =
math::integral_approx
(
98
10.78, 24.899, [](
const
double
x) {
return
x * x * x - x * x + 378; });
99
std::cout <<
"Test Case 3"
<< std::endl;
100
std::cout <<
"function: x^3 - x^2 + 378"
<< std::endl;
101
std::cout <<
"range: [10.78, 24.899]"
<< std::endl;
102
std::cout <<
"value: "
<< test_3 << std::endl;
103
math::test_eval
(test_3, 93320.65915078377, .001);
104
std::cout <<
"Test 3 Passed!"
<< std::endl;
105
std::cout <<
"====================="
<< std::endl;
106
107
double
test_4 =
math::integral_approx
(
108
.101, .505,
109
[](
const
double
x) {
return
cos(x) * tan(x) * x * x +
exp
(x); },
110
.00001);
111
std::cout <<
"Test Case 4"
<< std::endl;
112
std::cout <<
"function: cos(x)*tan(x)*x^2 + e^x"
<< std::endl;
113
std::cout <<
"range: [.101, .505]"
<< std::endl;
114
std::cout <<
"value: "
<< test_4 << std::endl;
115
math::test_eval
(test_4, 0.566485986311631, .001);
116
std::cout <<
"Test 4 Passed!"
<< std::endl;
117
std::cout <<
"====================="
<< std::endl;
118
119
double
test_5 =
math::integral_approx
(
120
-1, 1, [](
const
double
x) {
return
exp
(-1 / (x * x)); });
121
std::cout <<
"Test Case 5"
<< std::endl;
122
std::cout <<
"function: e^(-1/x^2)"
<< std::endl;
123
std::cout <<
"range: [-1, 1]"
<< std::endl;
124
std::cout <<
"value: "
<< test_5 << std::endl;
125
math::test_eval
(test_5, 0.1781477117815607, .001);
126
std::cout <<
"Test 5 Passed!"
<< std::endl;
127
}
128
133
int
main
() {
134
test
();
// run self-test implementations
135
return
0;
136
}
test
void test()
Definition
caesar_cipher.cpp:100
main
int main()
Main function.
Definition
generate_parentheses.cpp:110
lru_tests::log
void log(T msg)
A function to print given message on console.
Definition
lru_cache.cpp:149
ciphers::elliptic_curve_key_exchange::exp
uint256_t exp(uint256_t number, uint256_t power, const uint256_t &mod)
This function calculates number raised to exponent power under modulo mod using Modular Exponentiatio...
Definition
elliptic_curve_key_exchange.cpp:78
math
for assert
math::test_eval
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:62
math::integral_approx
double integral_approx(double lb, double ub, const std::function< double(double)> &func, double delta=.0001)
Computes integral approximation.
Definition
integral_approximation.cpp:42
math
integral_approximation.cpp
Generated by
1.18.0