How to resolve the algorithm Euler method step by step in the jq programming language
How to resolve the algorithm Euler method step by step in the jq programming language
Table of Contents
Problem Statement
Euler's method numerically approximates solutions of first-order ordinary differential equations (ODEs) with a given initial value. It is an explicit method for solving initial value problems (IVPs), as described in the wikipedia page. The ODE has to be provided in the following form: with an initial value To get a numeric solution, we replace the derivative on the LHS with a finite difference approximation: then solve for
y ( t + h )
{\displaystyle y(t+h)}
: which is the same as The iterative solution rule is then: where
h
{\displaystyle h}
is the step size, the most relevant parameter for accuracy of the solution. A smaller step size increases accuracy but also the computation cost, so it has always has to be hand-picked according to the problem at hand.
Example: Newton's Cooling Law Newton's cooling law describes how an object of initial temperature
T (
t
0
)
T
0
{\displaystyle T(t_{0})=T_{0}}
cools down in an environment of temperature
T
R
{\displaystyle T_{R}}
: or
It says that the cooling rate
d T ( t )
d t
{\displaystyle {\frac {dT(t)}{dt}}}
of the object is proportional to the current temperature difference
Δ T
( T ( t ) −
T
R
)
{\displaystyle \Delta T=(T(t)-T_{R})}
to the surrounding environment. The analytical solution, which we will compare to the numerical approximation, is
Implement a routine of Euler's method and then to use it to solve the given example of Newton's cooling law with it for three different step sizes of: and to compare with the analytical solution.
A reference solution (Common Lisp) can be seen below. We see that bigger step sizes lead to reduced approximation accuracy.
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Euler method step by step in the jq programming language
Source code in the jq programming language
# euler_method takes a filter (df), initial condition
# (x1,y1), ending x (x2), and step size as parameters;
# it emits the y values at each iteration.
# df must take [x,y] as its input.
def euler_method(df; x1; y1; x2; h):
h as $h
| [x1, y1]
| recurse( if ((.[0] < x2 and x1 < x2) or
(.[0] > x2 and x1 > x2)) then
[ (.[0] + $h), (.[1] + $h*df) ]
else empty
end )
| .[1] ;
# We could now solve the task by writing for each step-size, $h
# euler_method(-0.07 * (.[1]-20); 0; 100; 100; $h)
# but for clarity, we shall define a function named "cooling":
# [x,y] is input
def cooling: -0.07 * (.[1]-20);
# The following solves the task:
# (2,5,10) | [., [ euler_method(cooling; 0; 100; 100; .) ] ]
def euler_solution(df; x1; y1; x2; h):
def recursion(exp): reduce recurse(exp) as $x (.; $x);
h as $h
| [x1, y1]
| recursion( if ((.[0] < x2 and x1 < x2) or
(.[0] > x2 and x1 > x2)) then
[ (.[0] + $h), (.[1] + $h*df) ]
else empty
end )
| .[1] ;
(1,2,5,10,20) | [., [ euler_solution(cooling; 0; 100; 100; .) ] ]
$ jq -M -n -c -f Euler_method.jq
[1,[20.05641373347389]]
[2,[20.0424631833732]]
[5,[20.01449963666907]]
[10,[20.000472392]]
[20,[19.180799999999998]]
You may also check:How to resolve the algorithm Sierpinski carpet step by step in the Java programming language
You may also check:How to resolve the algorithm Run-length encoding step by step in the M2000 Interpreter programming language
You may also check:How to resolve the algorithm Hello world/Text step by step in the Nit programming language
You may also check:How to resolve the algorithm Averages/Root mean square step by step in the Morfa programming language
You may also check:How to resolve the algorithm Y combinator step by step in the Tailspin programming language