TheAlgorithms/C++
1.0.0
All the algorithms implemented in C++
Toggle main menu visibility
Loading...
Searching...
No Matches
ode_forward_euler.cpp
Go to the documentation of this file.
1
38
39
#include <cmath>
40
#include <ctime>
41
#include <fstream>
42
#include <iostream>
43
#include <valarray>
44
54
void
problem
(
const
double
&x, std::valarray<double> *y,
55
std::valarray<double> *dy) {
56
const
double
omega = 1.F;
// some const for the problem
57
(*dy)[0] = (*y)[1];
// x dot // NOLINT
58
(*dy)[1] = -omega * omega * (*y)[0];
// y dot // NOLINT
59
}
60
67
void
exact_solution
(
const
double
&x, std::valarray<double> *y) {
68
y[0][0] = std::cos(x);
69
y[0][1] = -std::sin(x);
70
}
71
86
void
forward_euler_step
(
const
double
dx,
const
double
x,
87
std::valarray<double> *y, std::valarray<double> *dy) {
88
problem
(x, y, dy);
89
*y += *dy * dx;
90
}
91
102
double
forward_euler
(
double
dx,
double
x0,
double
x_max,
103
std::valarray<double> *y,
bool
save_to_file =
false
) {
104
std::valarray<double> dy = *y;
105
106
std::ofstream fp;
107
if
(save_to_file) {
108
fp.open(
"forward_euler.csv"
, std::ofstream::out);
109
if
(!fp.is_open()) {
110
std::perror(
"Error! "
);
111
}
112
}
113
114
std::size_t L = y->size();
115
116
/* start integration */
117
std::clock_t t1 = std::clock();
118
double
x = x0;
119
120
do
{
// iterate for each step of independent variable
121
if
(save_to_file && fp.is_open()) {
122
// write to file
123
fp << x <<
","
;
124
for
(
int
i = 0; i < L - 1; i++) {
125
fp << y[0][i] <<
","
;
// NOLINT
126
}
127
fp << y[0][L - 1] <<
"\n"
;
// NOLINT
128
}
129
130
forward_euler_step
(dx, x, y, &dy);
// perform integration
131
x += dx;
// update step
132
}
while
(x <= x_max);
// till upper limit of independent variable
133
/* end of integration */
134
std::clock_t t2 = std::clock();
135
136
if
(fp.is_open()) {
137
fp.close();
138
}
139
140
return
static_cast<
double
>
(t2 - t1) / CLOCKS_PER_SEC;
141
}
142
144
153
void
save_exact_solution
(
const
double
&X0,
const
double
&X_MAX,
154
const
double
&step_size,
155
const
std::valarray<double> &Y0) {
156
double
x = X0;
157
std::valarray<double> y(Y0);
158
159
std::ofstream fp(
"exact.csv"
, std::ostream::out);
160
if
(!fp.is_open()) {
161
std::perror(
"Error! "
);
162
return
;
163
}
164
std::cout <<
"Finding exact solution\n"
;
165
166
std::clock_t t1 = std::clock();
167
do
{
168
fp << x <<
","
;
169
for
(
int
i = 0; i < y.size() - 1; i++) {
170
fp << y[i] <<
","
;
// NOLINT
171
}
172
fp << y[y.size() - 1] <<
"\n"
;
// NOLINT
173
174
exact_solution
(x, &y);
175
176
x += step_size;
177
}
while
(x <= X_MAX);
178
179
std::clock_t t2 = std::clock();
180
double
total_time =
static_cast<
double
>
(t2 - t1) / CLOCKS_PER_SEC;
181
std::cout <<
"\tTime = "
<< total_time <<
" ms\n"
;
182
183
fp.close();
184
}
185
189
int
main
(
int
argc,
char
*argv[]) {
190
double
X0 = 0.f;
/* initial value of x0 */
191
double
X_MAX = 10.F;
/* upper limit of integration */
192
std::valarray<double> Y0{1.f, 0.f};
/* initial value Y = y(x = x_0) */
193
double
step_size = NAN;
194
195
if
(argc == 1) {
196
std::cout <<
"\nEnter the step size: "
;
197
std::cin >> step_size;
198
}
else
{
199
// use commandline argument as independent variable step size
200
step_size = std::atof(argv[1]);
201
}
202
203
// get approximate solution
204
double
total_time =
forward_euler
(step_size, X0, X_MAX, &Y0,
true
);
205
std::cout <<
"\tTime = "
<< total_time <<
" ms\n"
;
206
207
/* compute exact solution for comparion */
208
save_exact_solution
(X0, X_MAX, step_size, Y0);
209
210
return
0;
211
}
main
int main()
Main function.
Definition
generate_parentheses.cpp:110
forward_euler_step
void forward_euler_step(const double dx, const double x, std::valarray< double > *y, std::valarray< double > *dy)
Compute next step approximation using the forward-Euler method.
Definition
ode_forward_euler.cpp:86
forward_euler
double forward_euler(double dx, double x0, double x_max, std::valarray< double > *y, bool save_to_file=false)
Compute approximation using the forward-Euler method in the given limits.
Definition
ode_forward_euler.cpp:102
save_exact_solution
void save_exact_solution(const double &X0, const double &X_MAX, const double &step_size, const std::valarray< double > &Y0)
Definition
ode_forward_euler.cpp:153
problem
void problem(const double &x, std::valarray< double > *y, std::valarray< double > *dy)
Problem statement for a system with first-order differential equations. Updates the system differenti...
Definition
ode_forward_euler.cpp:54
exact_solution
void exact_solution(const double &x, std::valarray< double > *y)
Exact solution of the problem. Used for solution comparison.
Definition
ode_forward_euler.cpp:67
numerical_methods
ode_forward_euler.cpp
Generated by
1.18.0