How to resolve the algorithm Euler method step by step in the F# programming language
How to resolve the algorithm Euler method step by step in the F# 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 F# programming language
Source code in the fsharp programming language
let euler f (h : float) t0 y0 =
(t0, y0)
|> Seq.unfold (fun (t, y) -> Some((t,y), ((t + h), (y + h * (f t y)))))
let newtonCoolíng _ y = -0.07 * (y - 20.0)
[<EntryPoint>]
let main argv =
let f = newtonCoolíng
let a = 0.0
let y0 = 100.0
let b = 100.0
let h = 10.0
(euler newtonCoolíng h a y0)
|> Seq.takeWhile (fun (t,_) -> t <= b)
|> Seq.iter (printfn "%A")
0
You may also check:How to resolve the algorithm 15 puzzle game step by step in the Quackery programming language
You may also check:How to resolve the algorithm First power of 2 that has leading decimal digits of 12 step by step in the Sidef programming language
You may also check:How to resolve the algorithm Fusc sequence step by step in the AppleScript programming language
You may also check:How to resolve the algorithm Pick random element step by step in the Run BASIC programming language
You may also check:How to resolve the algorithm Fortunate numbers step by step in the Wren programming language