In this section we’ll take a brief look at a fairly simple method for approximating solutions to differential equations. We derive the formulas used by Euler’s Method and give a brief discussion of the errors in the approximations of the solutions.

Let’s recall the very basic aspect of Differential Equation.

We know,          $\frac{\text{d}y(x)}{\text{d}x}=f(x,y)$

It can be expressed as,       $\frac{\text{d}y(x)}{\text{d}x}\sim \frac {y(x+h)-y(x)}{h}$

Combining both the equations, we get,       $\frac{\text{d}y(x)}{\text{d}x}\sim \frac {y(x+h)-y(x)}{h}=f(x,y)$

Summarizing the equation as,     $y(x+h)= y(x)+h.f(x,y)$

Thus, we arrive at,      $y_{n+1}= y_{n}+h.f(x_{n},y_{n})$.

where $h$ is the step size (the smaller, the better), $f(x,y)$ is right side of the differential equation.

Example 1:            $\frac{\text{d}y}{\text{d}x}=2y$ with the initial condition as    $y(0)=1$.

Here, we have two approaches to find the solution of the Differential Equation, which are as follows:

1) Analytical Solution: This is the exact solution of an ordinary differential equation.

Integrating both sides, $\int_{}{}\frac{\text{d}y}{ y}=\int_{}{}{d}x$

We get, $\ln y = x + \ln C$

Therefore, $y(x) = e^{x}$

2) Numerical Solution: This is just an approximation of the solution.

We require this formula, $y(x+h)= y(x)+h.f(x,y)$

along with initial conditions,     $x_{0}=0$ and $y_{0}=1$

Let’s continue with Example 1,  to find the Numerical Solution.

Example 1:            $\frac{\text{d}y}{\text{d}x}=2y$ with the initial condition as   $y(0)=1$ and step-size $h=2$.

We know the formula,  $y_{n+1}= y_{n}+h.f(x_{n},y_{n})$.

In this equation we put the values of $x_{n}$ at interval of $2$ because of Step-Size ($h=2$) and obtain the value of $y_{n}.$ By initial conditions, we know $x_{0}=0$ and $y_{0}=1$

Here, we are assuming the slope to be same between two consecutive points of $x$ and $y$, whereas in the exact case the slope is changing constantly.

Example 2:  Find approximate value of ‘$y$‘ at $x=1$ in five steps by taking h=0.2 for the DE     $\frac{\text{d}y}{\text{d}x}= x+y$ where $y(0)=1$.

SOLUTION:           $\frac{\text{d}y}{\text{d}x}=x+y$ and $y(0)=1$

Hence,  $f(x,y)=x+y$ and $x_{0} = 0$ , $y_{0} = 1$

We know the formula,  $y_{n+1}= y_{n}+h.f(x_{n},y_{n})$

Therefore, equation can be modified as $y_{n+1}= y_{n}+h.(x_{n}+y_{n})$

Calculations required is put into a tabular form as shown below in Table 2.

The approximate value of $y$ at $x=1$ , i.e $y(1)= 2.976664$.

Code:

				
// Euler's Method
// Solving dy/dx = x + y by Euler's method

%use s2

// Defining function f(x,y) for this case
val f: BivariateRealFunction = object : AbstractBivariateRealFunction() {
override fun evaluate(x: Double, y: Double): Double {
return x+y
}
}

val x_at_0 = 0.0
val y_at_0 = 1.0
val h = 0.2

// Evaluation of h*f(x(n),y(n))
val e_term: BivariateRealFunction = object : AbstractBivariateRealFunction() {
override fun evaluate(h: Double, f_at_n: Double): Double {
return h*f_at_n
}
}

// y(n+1) = y(n) + h*f(x(n),y(n))      ..........Euler's Method
val Y_at_n_plus_1: BivariateRealFunction = object : AbstractBivariateRealFunction() {
override fun evaluate(y_at_n: Double, e_term: Double): Double {
return y_at_n + e_term
}
}

val h_term: BivariateRealFunction = object : AbstractBivariateRealFunction() {
override fun evaluate(h: Double, t: Double): Double {
return h*t
}
}

val xn: BivariateRealFunction = object : AbstractBivariateRealFunction() {
override fun evaluate(x_at_0: Double, h_term: Double): Double {
return x_at_0 + h_term
}
}

println("Solution of Differential Equation by Euler's Method")
val steps = mutableListOf(0.0, 1.0, 2.0, 3.0, 4.0)    //no. of steps = 5
var y_n = y_at_0
for (index in steps){
val h_n = h_term.evaluate(h,index)
val x_n = xn.evaluate(x_at_0,h_n)
val f_n = f.evaluate(x_n,y_n)
val e_n = e_term.evaluate(h,f_n)
val y = Y_at_n_plus_1.evaluate(y_n,e_n)
y_n = y
println("Value of y at n=%f: %f".format(index,y))
}
println("The approximate value of y at x=1 is %f".format(y_n))



Output: