TheAlgorithms/C++
1.0.0
All the algorithms implemented in C++
Toggle main menu visibility
Loading...
Searching...
No Matches
midpoint_integral_method.cpp
Go to the documentation of this file.
1
21
#include <cassert>
22
#include <cmath>
23
#include <cstdint>
24
#include <cstdlib>
25
#include <functional>
26
#include <iostream>
27
#include <map>
28
33
namespace
numerical_methods
{
40
namespace
midpoint_rule
{
52
double
midpoint
(
const
std::int32_t N,
const
double
h
,
const
double
a,
53
const
std::function<
double
(
double
)>& func) {
54
std::map<int, double>
55
data_table;
// Contains the data points, key: i, value: f(xi)
56
double
xi = a;
// Initialize xi to the starting point x0 = a
57
58
// Create the data table
59
// Loop from x0 to xN-1
60
double
temp = NAN;
61
for
(std::int32_t i = 0; i < N; i++) {
62
temp = func(xi +
h
/ 2);
// find f(xi+h/2)
63
data_table.insert(
64
std::pair<std::int32_t, double>(i, temp));
// add i and f(xi)
65
xi +=
h
;
// Get the next point xi for the next iteration
66
}
67
68
// Evaluate the integral.
69
// Remember: {f(x0+h/2) + f(x1+h/2) + ... + f(xN-1+h/2)}
70
double
evaluate_integral = 0;
71
for
(std::int32_t i = 0; i < N; i++) evaluate_integral += data_table.at(i);
72
73
// Multiply by the coefficient h
74
evaluate_integral *=
h
;
75
76
// If the result calculated is nan, then the user has given wrong input
77
// interval.
78
assert(!std::isnan(evaluate_integral) &&
79
"The definite integral can't be evaluated. Check the validity of "
80
"your input.\n"
);
81
// Else return
82
return
evaluate_integral;
83
}
84
90
double
f
(
double
x) {
return
std::sqrt(x) + std::log(x); }
97
double
g
(
double
x) {
return
std::exp(-x) * (4 - std::pow(x, 2)); }
103
double
k
(
double
x) {
return
std::sqrt(2 * std::pow(x, 3) + 3); }
109
double
l
(
double
x) {
return
x + std::log(2 * x + 1); }
110
111
}
// namespace midpoint_rule
112
}
// namespace numerical_methods
113
123
static
void
test
(std::int32_t N,
double
h
,
double
a,
double
b,
124
bool
used_argv_parameters) {
125
// Call midpoint() for each of the test functions f, g, k, l
126
// Assert with two decimal point precision
127
double
result_f =
numerical_methods::midpoint_rule::midpoint
(
128
N,
h
, a,
numerical_methods::midpoint_rule::f
);
129
assert((used_argv_parameters || (result_f >= 4.09 && result_f <= 4.10)) &&
130
"The result of f(x) is wrong"
);
131
std::cout <<
"The result of integral f(x) on interval ["
<< a <<
", "
<< b
132
<<
"] is equal to: "
<< result_f << std::endl;
133
134
double
result_g =
numerical_methods::midpoint_rule::midpoint
(
135
N,
h
, a,
numerical_methods::midpoint_rule::g
);
136
assert((used_argv_parameters || (result_g >= 0.27 && result_g <= 0.28)) &&
137
"The result of g(x) is wrong"
);
138
std::cout <<
"The result of integral g(x) on interval ["
<< a <<
", "
<< b
139
<<
"] is equal to: "
<< result_g << std::endl;
140
141
double
result_k =
numerical_methods::midpoint_rule::midpoint
(
142
N,
h
, a,
numerical_methods::midpoint_rule::k
);
143
assert((used_argv_parameters || (result_k >= 9.06 && result_k <= 9.07)) &&
144
"The result of k(x) is wrong"
);
145
std::cout <<
"The result of integral k(x) on interval ["
<< a <<
", "
<< b
146
<<
"] is equal to: "
<< result_k << std::endl;
147
148
double
result_l =
numerical_methods::midpoint_rule::midpoint
(
149
N,
h
, a,
numerical_methods::midpoint_rule::l
);
150
assert((used_argv_parameters || (result_l >= 7.16 && result_l <= 7.17)) &&
151
"The result of l(x) is wrong"
);
152
std::cout <<
"The result of integral l(x) on interval ["
<< a <<
", "
<< b
153
<<
"] is equal to: "
<< result_l << std::endl;
154
}
155
162
int
main
(
int
argc,
char
** argv) {
163
std::int32_t N =
164
16;
166
double
a = 1, b = 3;
168
double
h
= NAN;
169
170
bool
used_argv_parameters =
171
false
;
// If argv parameters are used then the assert must be omitted
172
// for the test cases
173
174
// Get user input (by the command line parameters or the console after
175
// displaying messages)
176
if
(argc == 4) {
177
N = std::atoi(argv[1]);
178
a = std::atof(argv[2]);
179
b = std::atof(argv[3]);
180
// Check if a<b else abort
181
assert(a < b &&
"a has to be less than b"
);
182
assert(N > 0 &&
"N has to be > 0"
);
183
if
(N < 4 || a != 1 || b != 3) {
184
used_argv_parameters =
true
;
185
}
186
std::cout <<
"You selected N="
<< N <<
", a="
<< a <<
", b="
<< b
187
<< std::endl;
188
}
else
{
189
std::cout <<
"Default N="
<< N <<
", a="
<< a <<
", b="
<< b
190
<< std::endl;
191
}
192
193
// Find the step
194
h
= (b - a) / N;
195
196
test
(N,
h
, a, b, used_argv_parameters);
// run self-test implementations
197
198
return
0;
199
}
test
void test()
Definition
caesar_cipher.cpp:100
main
int main()
Main function.
Definition
generate_parentheses.cpp:110
h
int h(int key)
Definition
hash_search.cpp:45
numerical_methods::midpoint_rule::midpoint
double midpoint(const std::int32_t N, const double h, const double a, const std::function< double(double)> &func)
Main function for implementing the Midpoint Integral Method implementation.
Definition
midpoint_integral_method.cpp:52
numerical_methods::midpoint_rule::f
double f(double x)
A function f(x) that will be used to test the method.
Definition
midpoint_integral_method.cpp:90
numerical_methods::midpoint_rule::l
double l(double x)
A function l(x) that will be used to test the method.
Definition
midpoint_integral_method.cpp:109
numerical_methods::midpoint_rule::g
double g(double x)
A function g(x) that will be used to test the method.
Definition
midpoint_integral_method.cpp:97
numerical_methods::midpoint_rule::k
double k(double x)
A function k(x) that will be used to test the method.
Definition
midpoint_integral_method.cpp:103
midpoint_rule
Functions for the Midpoint Integral method implementation.
numerical_methods
for assert
numerical_methods
midpoint_integral_method.cpp
Generated by
1.18.0