53void problem(
const double &x, std::valarray<double> *y,
54 std::valarray<double> *dy) {
55 const double omega = 1.F;
57 dy[0][1] = -omega * omega * y[0][0];
67 y[0][0] = std::cos(x);
68 y[0][1] = -std::sin(x);
86 std::valarray<double> *y, std::valarray<double> *dy) {
88 double tmp_x = x + 0.5 * dx;
90 std::valarray<double> tmp_y = y[0] + dy[0] * (0.5 * dx);
108 std::valarray<double> *y,
bool save_to_file =
false) {
109 std::valarray<double> dy = y[0];
113 fp.open(
"midpoint_euler.csv", std::ofstream::out);
115 std::perror(
"Error! ");
119 std::size_t L = y->size();
122 std::clock_t t1 = std::clock();
125 if (save_to_file && fp.is_open()) {
128 for (
int i = 0; i < L - 1; i++) {
129 fp << y[0][i] <<
",";
131 fp << y[0][L - 1] <<
"\n";
136 }
while (x <= x_max);
138 std::clock_t t2 = std::clock();
143 return static_cast<double>(t2 - t1) / CLOCKS_PER_SEC;
157 const double &step_size,
158 const std::valarray<double> &Y0) {
160 std::valarray<double> y = Y0;
162 std::ofstream fp(
"exact.csv", std::ostream::out);
164 std::perror(
"Error! ");
167 std::cout <<
"Finding exact solution\n";
169 std::clock_t t1 = std::clock();
172 for (
int i = 0; i < y.size() - 1; i++) {
175 fp << y[y.size() - 1] <<
"\n";
180 }
while (x <= X_MAX);
182 std::clock_t t2 = std::clock();
183 double total_time =
static_cast<double>(t2 - t1) / CLOCKS_PER_SEC;
184 std::cout <<
"\tTime = " << total_time <<
" ms\n";
192int main(
int argc,
char *argv[]) {
195 std::valarray<double> Y0 = {1.f, 0.f};
199 std::cout <<
"\nEnter the step size: ";
200 std::cin >> step_size;
203 step_size = std::atof(argv[1]);
207 double total_time =
midpoint_euler(step_size, X0, X_MAX, &Y0,
true);
208 std::cout <<
"\tTime = " << total_time <<
" ms\n";
double midpoint_euler(double dx, double x0, double x_max, std::valarray< double > *y, bool save_to_file=false)
Compute approximation using the midpoint-Euler method in the given limits.
void midpoint_euler_step(const double dx, const double &x, std::valarray< double > *y, std::valarray< double > *dy)
Compute next step approximation using the midpoint-Euler method.
void save_exact_solution(const double &X0, const double &X_MAX, const double &step_size, const std::valarray< double > &Y0)
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...
void exact_solution(const double &x, std::valarray< double > *y)
Exact solution of the problem. Used for solution comparison.