TheAlgorithms/C++ 1.0.0
All the algorithms implemented in C++
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
33namespace numerical_methods {
40namespace midpoint_rule {
52double 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
90double f(double x) { return std::sqrt(x) + std::log(x); }
97double g(double x) { return std::exp(-x) * (4 - std::pow(x, 2)); }
103double k(double x) { return std::sqrt(2 * std::pow(x, 3) + 3); }
109double l(double x) { return x + std::log(2 * x + 1); }
110
111} // namespace midpoint_rule
112} // namespace numerical_methods
113
123static 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
162int 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}
static void test()
Self-test implementations.
int main()
Main function.
int h(int key)
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.
Functions for the Midpoint Integral method implementation.