El método de Euler hacia adelante o método de Euler es un método explícito
\begin{equation*} y_{n+1} = y_{n} + h f(t_{n}, y_{n}) \end{equation*}Resolver
\begin{align*} y' &= 1 + x^{2} + x^{3} \\ y(2) &= 5 \\ y(5) &= ? \end{align*}La solución analítica es
\begin{align*} y &= x + \frac{x^{3}}{3} + \frac{x^{4}}{4} - \frac{11}{3} \\ y(5) &= 5 + \frac{5^{3}}{3} + \frac{5^{4}}{4} - \frac{11}{3} = 199.25 \end{align*}En este caso la derivada está en función de $x$
\begin{equation*} y_{n+1} = y_{n} + h f(x_{n}) \end{equation*}Para la solución numérica elegimos $n = 3$
\begin{equation*} h = \frac{x_{f} - x_{i}}{n} = \frac{5 - 2}{3} = 1 \end{equation*}xi = 2
yi = 5
xf = 5
n = 3
h = (xf - xi)/n
y = yi
x = xi
for i=1 to n do
y = y + h*(1 + x^2 + x^3)
x = x + h
end for
Ecuación diferencial
In [1]:
function f(x)
1 + x^2 + x^3
end
Out[1]:
Función Euler de un solo paso
In [2]:
function MétodoEulerAdelante(x, y , h)
y = y + h*f(x)
x = x + h
return x, y
end
Out[2]:
Programa principal
In [3]:
xi = 2
yi = 5
xf = 5
n = 50
h = (xf - xi) / n
y = yi
x = xi
@printf("%s \t %s \t %17s\n", "i", "x", "y")
@printf("%s \t %s \t %17s\n", 0, x, y)
for i= 1:n
x, y = MétodoEulerAdelante(x, y, h)
@printf("%d \t %0.15f \t %0.15f\n", i, x, y)
end
El método de Euler modificado o método del punto medio es un método implícito
\begin{equation*} y_{n+1} = y_{n} + h f \left( t_{n} + \frac{h}{2}, \frac{h}{2} (y_{n} + y_{n+1}) \right) \end{equation*}se puede aproximar con
\begin{align*} \tilde{y}_{n + \frac{1}{2}} &= y_{n} + \frac{h}{2} f(t_{n}, y_{n}) \\ y_{n+1} &= y_{n} + h f \left( t_{n + \frac{1}{2}} , \tilde{y}_{n + \frac{1}{2}} \right) \end{align*}Resolver
\begin{align*} y' &= \frac{5 - 2 y}{3 y^{2} + 2 x} \\ y(0) &= 2 \\ y(3) &= ? \end{align*}La solución analítica es:
\begin{align*} F(x,y) &= y^{3} + 2 x y - 5 x - 8 \\ y(3) &\approx 2.158 \end{align*}Para la solución numérica elegimos $n = 3$
\begin{equation*} h = \frac{x_{f} - x_{i}}{n} = \frac{3 - 0}{3} = 1 \end{equation*}
In [4]:
function dydx(x, y)
(5 - 2*y)/((3*y^2) + (2*x))
end
Out[4]:
In [5]:
function PuntoMedio(xi, yi , h)
ym = yi + (h/2)*dydx(xi, yi)
xm = xi + (h/2)
y = yi + h*dydx(xm, ym)
x = xi + h
return x, y
end
Out[5]:
In [6]:
xi = 0
yi = 2
xf = 3
n = 50
h = (xf - xi) / n
y = yi
x = xi
@printf("%s \t %s \t %17s\n", "i", "x", "y")
@printf("%s \t %s \t %17s\n", 0, x, y)
for i= 1:n
x, y = PuntoMedio(x, y, h)
@printf("%d \t %0.15f \t %0.15f\n", i, x, y)
end
El método de Euler hacia atrás es un método implícito
\begin{equation*} y_{n+1} = y_{n} + h f(t_{n+1}, y_{n+1}) \end{equation*}Puede hacerse una aproximación con
\begin{align*} \tilde{y}_{n+1} &= y_{n} + h f(t_{n}, y_{n}) \\ y_{n+1} &= y_{n} + h f(t_{n+1}, \tilde{y}_{n+1}) \end{align*}Resolver
\begin{align*} y' &= y + 2 x e^{2 x} \\ y(0) &= 1 \\ y(3) &= ? \end{align*}La solución analítica es
\begin{align*} y &= 3 e^{x} + 2 (x - 1) e^{2 x} \\ y(3) &= 3 e^{3} + 2 (3 - 1) e^{2 (3)} = 1673.972 \end{align*}Para la solución numérica elegimos $n = 3$
\begin{equation*} h = \frac{x_{f} - x_{i}}{n} = \frac{3 - 0}{3} = 1 \end{equation*}
In [7]:
function dydx(x, y)
y + 2*x*exp(2*x)
end
Out[7]:
In [8]:
function MétodoEulerAtrás(xi, yi , h)
yf = yi + h*dydx(xi, yi)
x = xi + h
y = yi + h*dydx(x, yf)
return x, y
end
Out[8]:
In [9]:
xi = 0
yi = 1
xf = 3
n = 50
h = (xf - xi) / n
y = yi
x = xi
@printf("%s \t %s \t %17s\n", "i", "x", "y")
@printf("%s \t %s \t %17s\n", 0, x, y)
for i= 1:n
x, y = MétodoEulerAtrás(x, y, h)
@printf("%d \t %0.15f \t %0.15f\n", i, x, y)
end
El método de Heun es un método implícito
\begin{equation*} y_{n+1} = y_{n} + \frac{h}{2} [f(t_{n}, y_{n}) + f(t_{n+1}, y_{n+1})] \end{equation*}Puede hacerse una aproximación en forma iterativa con el corrector
\begin{align*} \tilde{y}_{n+1} &= y_{n} + h f(t_{n}, y_{n}) & \mbox{predictor} \\ y_{n+1} &= y_{n} + \frac{h}{2} [f(t_{n}, y_{n}) + f(t_{n+1}, \tilde{y}_{n+1})] & \mbox{corrector} \end{align*}Resolver
\begin{align*} y' &= 4 e^{0.8 x} - 0.5 y \\ y(0) &= 2 \\ y(4) &= ? \end{align*}La solución analítica es
\begin{align*} y &= \frac{4}{1.3} (e^{0.8 x} - e^{-0.5 x}) + 2 e^{-0.5 x} \\ y(4) &= \frac{4}{1.3} [e^{0.8 (4)} - e^{-0.5 (4)}] + 2 e^{-0.5 (4)} = 75.33 \end{align*}Para la solución numérica elegimos $n = 4$
\begin{equation*} h = \frac{x_{f} - x_{i}}{n} = \frac{4 - 0}{4} = 1 \end{equation*}Se calculará una iteración con el corrector
\begin{align*} \tilde{y}_{1} &= y_{0} + h f(x_{0}, y_{0}) = 2 + 1[4 e^{0.8 (0)} - 0.5 (2)] = 5 \\ x_{1} &= x_{0} + h = 0 + 1 = 1 \\ y_{1} &= y_{0} + \frac{h}{2} [f(x_{0}, y_{0}) + f(x_{1}, \tilde{y}_{1})] = 2 + \frac{1}{2} [4 e^{0.8 (0)} - 0.5 (2) + 4 e^{0.8 (1)} - 0.5 (5)] = 6.701 \end{align*}
In [10]:
function g(x, y)
4*exp(0.8*x) - 0.5*y
end
Out[10]:
In [11]:
function MétodoHeun(xi, yi, h)
yf = yi + h*g(xi, yi)
x = xi + h
y = yi + (h/2)*(g(xi, yi) + g(x, yf))
return x, y
end
Out[11]:
In [12]:
xi = 0
yi = 2
xf = 4
n = 50
h = (xf - xi) / n
y = yi
x = xi
@printf("%s \t %s \t %17s\n", "i", "x", "y")
@printf("%s \t %s \t %17s\n", 0, x, y)
for i= 1:n
x, y = MétodoHeun(x, y, h)
@printf("%d \t %0.15f \t %0.15f\n",i , x, y)
end
Implementación iterativa del corrector:
In [13]:
function MétodoHeunIterativo(xi, yi, h)
es = 0.01
y = yi + h*g(xi, yi)
x = xi + h
while true
y_anterior = y
y = yi + (h/2)*(g(xi, yi) + g(x, y_anterior))
ea = ((y - y_anterior) / y) * 100
if ea <= es
break
end
end
return x, y
end
Out[13]:
In [14]:
xi = 0
yi = 2
xf = 4
n = 50
h = (xf - xi) / n
y = yi
x = xi
@printf("%s \t %s \t %17s\n", "i", "x", "y")
@printf("%s \t %s \t %17s\n", 0, x, y)
for i= 1:n
x, y = MétodoHeunIterativo(x, y, h)
@printf("%d \t %0.15f \t %0.15f\n", i, x, y)
end