Solve ODEs Backwards in Time with C++ Euler Method

Click For Summary
SUMMARY

The discussion focuses on modifying a C++ implementation of the Euler method for solving ordinary differential equations (ODEs) to run backwards in time. The original code solves the ODE y' = x - y with an initial condition y(0) = 1 from t=0 to t=1. To adapt the code for backward time integration, the user needs to change the step size "dist" to a negative value and adjust the time loop condition to ensure it iterates correctly from t=1 to t=0.

PREREQUISITES
  • C++ programming fundamentals
  • Understanding of ordinary differential equations (ODEs)
  • Familiarity with the Euler method for numerical integration
  • Basic knowledge of loops and conditionals in C++
NEXT STEPS
  • Implement backward time integration in C++ using the modified Euler method
  • Explore advanced numerical methods for solving ODEs, such as Runge-Kutta methods
  • Learn about stability and convergence in numerical solutions of ODEs
  • Investigate the use of C++ libraries for numerical analysis, such as Eigen or Boost
USEFUL FOR

Beginner C++ programmers, students studying numerical methods, and anyone interested in solving ordinary differential equations using programming techniques.

amr07
Messages
5
Reaction score
0
Hi Everybody
I am beginner in c++ and I need your help please. I implemented euler method for solving simple ODEs (y' = x -y, y(0)=1)and it is forward in time(from t=0 to t=1) and it worked well, my question is : I want to run this code backward in time(t=1 to t=0) what i have to change in my code?
code:

Code:
/* Euler for a set of first order differential equations */

#include <stdio.h>
#include <math.h>
#define dist 0.2               /* stepsize in t*/
#define MAX 1.0                /* max for t */
int N=1;
void euler(double x, double y[], double step); /* Euler function */

double f(double x, double y[], int i);          /* function for derivatives */

main()
{
double t, y[N];
int j;

y[0]=1.0;                                       /* initial condition */

 
for (j=0; j*dist<=MAX ;j++)                     /* time loop */
{
   t=j*dist;
   printf("j =  %d,t = %f y[0] = %f\n", j,t, y[0]);
   euler(t, y, dist);

}

}

void euler(double x, double y[], double step)
{
double  s[N];      /* for euler */
int i;
{
for (i=0;i<N;i++)
 {     s[i]=step*f(x, y, i);
}
}

{
for (i=0;i<N;i++) 
     y[i]+=s[i];
}
}
double  f(double x, double y[], int i)
{
    return(x-y[0]);                 /* derivative of first equation */
}
many thanks in advance!
 
Last edited:
Technology news on Phys.org
The main change is just to make "dist" a negative value.

You will also need to change the test in the time loop

for (j=0; j*dist<=MAX ;j++)

(and you might want to change the constant MAX to MIN).
 

Similar threads

  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 36 ·
2
Replies
36
Views
6K
Replies
22
Views
5K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 5 ·
Replies
5
Views
3K
Replies
1
Views
2K
  • · Replies 1 ·
Replies
1
Views
1K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 6 ·
Replies
6
Views
12K
  • · Replies 17 ·
Replies
17
Views
2K