On étudie un système régi par l’équation différentielle
1/ Quelles sont les solutions stationnaires de ce système ? On distinguera les cas en fonction du paramètre .
est toujours une solution stationnaire.
Si , alors est également une solution stationnaire.
On résout maintenant numériquement le système pour observer le comportement des solutions en fonction du paramètre et de la condition initiale .
2/ Mettre le système sous la forme d’un problème d’Euler, c’est-à-dire sous la forme où est une fonction à préciser puis compléter le code ci-dessous.
from scipy.integrate import solve_ivp
def f(t,y):
return ... # à compléterLa fonction est donc définie par . Ici la fonction ne dépend en pratique pas de .
Pour se familiariser avec la résolution numérique, on commence par résoudre le système pour et .
3/ Compléter le code ci-dessous pour.
r = ... # à compléter
y0 = ... # à compléter
sol = solve_ivp(f, [0,100], [y0]) # la fonction solve_ivp résout le système sur l'intervalle
# de temps [0,100] avec la condition initiale y0
t = sol.t # on récupère les valeurs de temps calculées par solve_ivp
y = sol.y[0] # et les valeurs de y correspondantes
import matplotlib.pyplot as plt
plt.plot(...) # Tracé de y en fonction de t
plt.xlabel("t")
plt.ylabel("y(t)")
plt.title("Résolution du système pour r=1 et y0=0.1")
plt.show()plt.plot() prend deux arguments : la liste des abscisses puis celle des ordonnées à tracer.r = 1 # à compléter
y0 = 0.1 # à compléter
sol = solve_ivp(f, [0,100], [y0]) # la fonction solve_ivp résout le système sur l'intervalle
# de temps [0,100] avec la condition initiale y0
t = sol.t # on récupère les valeurs de temps calculées par solve_ivp
y = sol.y[0] # et les valeurs de y correspondantes
import matplotlib.pyplot as plt
plt.plot(t,y) # Tracé de y en fonction de t
plt.xlabel("t")
plt.ylabel("y(t)")
plt.title("Résolution du système pour r=1 et y0=0.1")
plt.show()4/ En changeant les paramètres et (on essaiera des valeurs positives et négatives), qu’observe-t-on sur les limites atteintes par ?
On souhaite maintenant explorer de façon plus exhaustive l’influence de sur la limite atteinte par . On prendra valeurs pour réparties entre et . Pour chaque valeur de , on résout le système pour une conditions initiales tirée aléatoirement entre et .
5/ Compléter le code ci-dessous pour.
L_r = ... # liste contenant les valeurs de r à tester
L_limite = [] # liste qui contiendra les limites atteintes par y pour chaque valeur de r
for r in L_r:
y0 = np.random.uniform(-10,10) # tire une valeur aléatoire entre -10 et 10 pour la condition initiale
sol = solve_ivp(f, [0, 100], [y0])
limite = ... # dernière valeur de y calculée par solve_ivp (on suppose que la limite est atteinte)
L_limite.append(limite)np.linspace ou utiliser une comprehension de liste par exemple.L_r = np.linspace(-1,1,1000)# liste contenant les valeurs de r à tester
L_limite = [] # liste qui contiendra les limites atteintes par y pour chaque valeur de r
for r in L_r:
y0 = np.random.uniform(-10,10) # tire une valeur aléatoire entre -10 et 10 pour la condition initiale
sol = solve_ivp(f, [0, 100], [y0])
limite = sol.y[0][-1] # dernière valeur de y calculée par solve_ivp (on suppose que la limite est atteinte)
L_limite.append(limite)6/ Tracer les limites atteintes par en fonction de . On affichera le trace sous forme d’un nuage de points non reliés entre eux. Justifier le nom de “bifurcation fourche” donné à ce type de diagramme.
'.'.plt.plot(L_r, L_limite, ".")
plt.xlabel("r")
plt.ylabel("limite atteinte par y")
plt.grid()
plt.show()La forme de la courbe ressemble à une fourche.