## modules
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

## Q1
a, b, y_0, n =

## Q2
def euler_logistique(a,b,y_0,n,r,K):
    h =
    t, y = [...], [...]
    for k in range(...):
        y.append(y[k] + ...)
        t.append(t[k] + ...)
    return ...

## Q3
r, K = ...

def f(t):
    return ...

t,y = euler_logistique(a,b,y_0,n,r,K)
plt.plot(...,...,marker="+",label="Euler")

abs = np.linspace(a, b, 300)
plt.plot(..., ..., label=...)

plt.legend(loc = "best") # optionnel
plt.show()


## Q4
fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.25)

# tracé initial
n = 10
t, y = euler_logistique(a, b, y_0, n, r, K)
ligne_euler, = ax.plot(t, y, label="Euler")

abscisses = np.linspace(a, b, 300)
ax.plot(abscisses, [f(x) for x in abscisses], label="f")

ax.set_xlabel("t")
ax.set_ylabel("y")
ax.legend(loc="best")

# --- curseur ---
ax_slider = plt.axes([0.25, 0.1, 0.5, 0.03])
n_slider = Slider(ax_slider, "n", 2, 100, valinit=n, valstep=1)

def update(val):
    n = int(n_slider.val)
    t, y = euler_logistique(a, b, y_0, n, r, K)
    ligne_euler.set_data(t, y)
    ax.relim()
    ax.autoscale_view()
    fig.canvas.draw_idle()

n_slider.on_changed(update)
plt.show()

## Q5
def euler(F,a,b,y_0,n):
    t = [...]
    y = [...]
    h = ...
    for k in range(...):
        t.append(...)
        y.append(...)
    return ...

## Q6
def F(t,y):
    return ...

## Q7
a, b, y_0 = ...

def g(x):
    return ...

for n in [...]:
    ... = euler(F,a,b,y_0,n)
    legende = "n = " + str(n) # redaction de la legende
    plt.plot(t,y,label=legende)

abscisses = np.linspace(a,b,500)
ord = ...
plt.plot(..., ...,label="g")

plt.legend(loc = "best") # place les legendes a la meilleure place
plt.show()

## Q9
def heun(F,a,b,y_0,n):
    ...
    return ...

def rk4(F,a,b,y_0,n):
    ...
    return ...

## Q10
a, b, y_0 = ...

n = ...

..., ... = euler(F,a,b,y_0,n)
plt.plot(t1,y1,label="Euler")

t2, y2 = ...
plt.plot(t2,y2,label="Heun")

t3, y3 = ...
plt.plot(...)

abscisses = np.linspace(a,b,500)
ord = ...
plt.plot(abscisses,ord,label=...)

...
...

## Q11
fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.25)

# tracé initial
n = 10
t1, y1 = euler(F,a,b,y_0,n)
t2, y2 = heun(F,a,b,y_0,n)
t3, y3 = rk4(F,a,b,y_0,n)

ligne_euler, = ax.plot(t1, y1, label="Euler")
ligne_heun, = ax.plot(t2, y2, label="Heun")
ligne_rk4, = ax.plot(t3, y3, label="RK4")

abscisses = np.linspace(a, b, 1000)
ax.plot(abscisses, g(abscisses), label="g")

ax.set_xlabel("t")
ax.set_ylabel("y")
ax.legend(loc="best")

# --- curseur ---
ax_slider = plt.axes([0.25, 0.1, 0.5, 0.03])
n_slider = Slider(ax_slider, "n", 10, 500, valinit=n, valstep=1)

def update(val):
    n = int(n_slider.val)
    t1, y1 = euler(F,a,b,y_0,n)
    t2, y2 = heun(F,a,b,y_0,n)
    t3, y3 = rk4(F,a,b,y_0,n)
    ligne_euler.set_data(t1, y1)
    ligne_heun.set_data(t2, y2)
    ligne_rk4.set_data(t3, y3)
    ax.relim()
    ax.autoscale_view()
    fig.canvas.draw_idle()

n_slider.on_changed(update)
plt.show()
































