Résoudre le problème de Cauchy $$ y’(t) = f(t, y(t)) $$ $$ y(0) = y_0 $$
en trouvant une solution sur l’intervalle $[0, T]$ grâce au schéma d’Euler explicite.
import math
import numpy as np
import matplotlib.pyplot as plt
Ce schéma est discrétisé à pas constant $h=N/T$ en prenant : $$y_{n+1} = y_n + h f(t_n, y_n)$$
def euler_explicite(f, N, T, y0=0.0):
t = np.linspace(0, T, N)
h = T / N
y = np.zeros(N)
y[0] = y0
for i in range(N - 1):
y[i+1] = y[i] + h * f(t[i], y[i])
return t, y
def plot_euler_explicite(func, T=1.0, y0=0.0, title=None):
steps = 5
for i in range(10):
N = (i+1) * steps
t,y = euler_explicite(func, N, T, y0=y0)
plt.plot(t,y, label=f"N = {N}")
plt.legend()
if title:
plt.title(title)
plt.show()
plot_euler_explicite(lambda t,y: 1 - 2 * t * t - 2 * y, title="$y' = 1 - 2t^2 - 2y$ | $y_0 = 0$")
plot_euler_explicite(lambda t,y: 1 - 5 * t * t - 10 * y, y0=0.5, title="$y' = 1 - 5t^2 - 10y$ | $y_0 = 0.5$")
plot_euler_explicite(lambda t,y: 1 - 5 * math.cos(t) - 2 * y, T=5.0, title="$y' = 1 - 5 \cos(t) - 2y$ | $y_0 = 0$")