ODE: $$\frac{dy}{dt} = f(y,t),$$ $$y(t=0) = y_0.$$
where the $\mathcal{O}(\Delta t^2)$ term is the local error of the EE method. When we expand this we get
$$y_{k+1} = y_k + \Delta t y^{\prime}_{k+1/2}+\mathcal{O}(\Delta t^3) + \mathcal{O}(\Delta t^3) = y_k + \Delta ty^{\prime}_{k+1/2}+\mathcal{O}(\Delta t^3),$$
so there is no overall change in the global order of the method.
where $f_{y,k}$ is the derivative of $f$ with respect to $y$ evaluated at point $k$.
* Now, $$(y^{\prime})^{\prime} = \left.\frac{\partial f}{\partial t}\right|_k = \left.\frac{\partial f}{\partial y}\frac{dy}{dt}\right|_k = f_{y,k}f_k.$$
* Hence:
<font color='red'>
$$y_{k+1} = y_k + f_kh + \frac{1}{2}h^2f_{y,k}f_k + \mathcal{O}(h^3).$$
</font>
Recall our 2nd order method: \begin{align*} y_{k+1} = &y_k + h(c_1S_1 + c_2S_2), \\ &S_1 = f(y_k), \\ &S_2 = f(y_k + \beta hS_1). \end{align*}
import Plots as plt
function odeRK4(f, y0, t)
ns = length(t)-1
y = zeros(ns+1)
y[1] = y0
for k in 1:ns
h = t[k+1]-t[k]
S1 = f(y[k],t[k])
S2 = f(y[k]+0.5*h*S1, t[k]+0.5*h)
S3 = f(y[k]+0.5*h*S2, t[k]+0.5*h)
S4 = f(y[k]+ h*S3, t[k]+ h)
y[k+1] = y[k] + h/6*(S1 + 2*S2 + 2*S3 + S4)
end
return y
end
odeRK4 (generic function with 1 method)
function odeEE(f, y0, t)
ns = length(t)-1
y = zeros(ns+1)
y[1] = y0
for k in 1:ns
h = t[k+1]-t[k]
y[k+1] = y[k] + h*f(y[k],t[k])
end
return y
end
odeEE (generic function with 1 method)
f(y,t) = -y
#----------------------
y0 = 1.0
tend = 5.0
t = LinRange(0,tend,11)
#----------------------
y_RK4 = odeRK4(f,y0,t)
y_EE = odeEE(f,y0,t)
tt = LinRange(0,tend,100)
y_Exact = exp.(-tt);
plt.resetfontsizes(); plt.scalefontsizes(1.5)
plt.plot(tt,y_Exact, label="exact", color="black")
plt.scatter!(t, y_RK4, label="RK4")
plt.scatter!(t, y_EE, label="EE", markershape=:utriangle)
plt.plot!(background_color_legend=nothing, foreground_color_legend=nothing)
plt.plot!(ylabel="y", xlabel="t")