2. Írjuk meg az Euler-módszer programját Nest, NestWhile stb. felhasználásával. (Például: felezzük a lépésközt, és akkor álljunk meg, amikor az utolsó két közelítés eltérése kisebb, mint ε).

A módszer kezdetiérték-feladatok numerikus megoldására alkalmas. Kezdetiérték-feladat egy
y'(x) = f (x, y (x))
alakú differenciálegyenlet, y((Subscript[x, 0])) adott, ahol
y: [a, b] → (ℝ^n) az ismeretlen függvény,
f: [a, b] × (ℝ^n) -> (ℝ^n), (Subscript[x, 0]) ∈ [a, b].
Definiálunk egy (Subscript[x, k]) = (Subscript[x, 0]) + h k rácshálót, ahol k = 0, 1,…, N(h), csak ezekben a pontokban közelítjük a megoldást, az egyes rácspontokban a közelítéseket jelölje (Subscript[z, k]).
Ekkor az explicit Euler-módszer képlete:
(Subscript[z, k+1]) =(Subscript[z, k])+hf((Subscript[x, k]),(Subscript[z, k])),(Subscript[z, 0])=y((Subscript[x, 0])) .
Azt az iterációs formulát, amely megadja, hogy az egyes rácspontokban hogy kell a közelítést számolni a korábbi közelítésekből, numerikus sémának nevezzük.
Egy numerikus séma explicit, ha (Subscript[z, k+1]) meghatározásáshoz nem kell egyenletet megoldanunk, különben implicit.

Explicit Euler-módszer

Az expEm függvény adott lépésköz mellett hajtja végre az Euler-módszert, bemenő paraméterei a h lépésköz, az x0 illetve y0 kezdeti értékek, ode az egyenlet jobb oldala, feltéve, hogy a változók x és y, xn az utolsó rácspont. Kimenete egy lista az ((Subscript[x, k]),(Subscript[z, k]))  párokkal.

expEm[h_,x0_,y0_,ode_,xn_]:=NestList[
{#[[1]]+h,#[[2]]+h ode/.{x->#[[1]],y->#[[2]]}}&,{x0,y0},Ceiling[(xn-x0)/h]
]

Például legyen a kezdetiérték-feladatunk a következő
y' = y Cos(x+y), y(0)=1 .

ListPlot[expEm[.1,0,1,y Cos[x+y],20],PlotRange->All]

expEmh[h_,x0_,y0_,ode_,xn_,epsilon_]:=Module[
{hh=h,list1,list2},
list1=expEm[hh,x0,y0,ode,xn];
list2=expEm[hh/2,x0,y0,ode,xn];
While[
Max[
Abs[
Table[
(list1[[i,2]]-
list2[[2 i-1,2]])/list1[[i,2]],
{i,1,Floor[(xn-x0)/hh]}
]
]
]>epsilon,
hh=hh/2;
list1=expEm[hh,x0,y0,ode,xn];
list2=expEm[hh/2,x0,y0,ode,xn]
];
ListPlot[expEm[hh,x0,y0,ode,xn],PlotRange->All,PlotStyle->{PointSize[hh/(xn-x0)],RGBColor[.5,.5,0]}]
]

expEmh[.2,0,1,y Cos[x+y],20,.01]