from IPython.core.display import HTML
css_file = './custom.css'
HTML(open(css_file, "r").read())
import sys #only needed to determine Python version number
print('Python version ' + sys.version)
On modélise la croissance d'une population d'effectif $y(t)\ge0$ par l'équation différentielle \begin{equation} y'(t)=a y(t), \qquad a\in\mathbb{R}. \end{equation} Dans ce modèle la variation de population est proportionnelle à la population elle-même: le coefficient $a$ est appelé paramètre de Malthus ou potentiel biologique et représente la différence entre le nombre de nouveaux nés par individu en une unité de temps et la fraction d'individus qui meurent en une unité de temps. On s'intéresse à l'unique solution de cette équation vérifiant $y(t_0)=y_0$ où $y_0$ et $t_0$ sont des réels donnés.
Correction
L'unique solution du problème de Cauchy $\begin{cases}y'(t)=a y(t)\\y(t_0)=y_0>0\end{cases}$ pour $t\ge t_0$ est la fonction $y(t)=y_0e^{at}$. On a $$ \lim_{t\to+\infty}y(t)= \begin{cases} +\infty &\text{si } a>0,\\ y_0 &\text{si } a=0,\\ 0^+ &\text{si } a<0, \end{cases} $$
Pour $a=1$, $t_0=0$ et $y_0=1$, la solution exacte est $y(t)=e^t$.
On subdivise l'intervalle $[t_0;T]$ en $N$ intervalles $[t_{n};t_{n+1}]$ de largeur $h=(T-t_0)/N$ avec $t_n=t_0+nh$ pour $n=0,\dots,N$.
Pour chaque nœud $t_n$, on note $y_n=y(t_n)$; l'ensemble des valeurs $\{y_0, y_1,\dots , y_{N} \}$ représente la solution exacte discrète.
Pour chaque nœud $t_n$, on cherche la valeur inconnue $u_n$ qui approche la valeur exacte $y_n$.
L'ensemble des valeurs $\{u_0 = y_0, u_1,\dots , u_{N} \}$ représente la solution numérique.
Dans la méthode d'Euler explicite, cette solution approchée est obtenue en construisant une suite récurrente comme suit $$\begin{cases} u_0=y_0,\\ u_{n+1}=u_{n}+h\varphi(t_{n},u_{n}). \end{cases}$$ En utilisant ce schéma pour notre EDO on obtient $$\begin{cases} u_0=y_0,\\ u_{n+1}=(1+ah)u_n \end{cases}$$ soit encore $u_n=(1+ah)^{n}u_0=\left(1+\frac{2}{5}\right)^n$.
%reset -f
%matplotlib inline
from matplotlib.pylab import *
def EE(phi,tt,y0):
uu = [y0]
h=tt[1]-tt[0]
for i in range(len(tt)-1):
uu.append(uu[i]+h*phi(tt[i],uu[i]))
return uu
phi = lambda t,y : a*y # EDO
sol_exacte = lambda t : y0*math.exp(a*t) # SOLUTION EXACTE
# INITIALISATION
a = 1
Nh = 5
t0, y0 = 0, 1
tfinal = 2
# CALCUL SOLUTION APPROCHEE
tt1 = linspace(t0,tfinal,Nh+1)
uu1 = EE(phi,tt1,y0)
# CALCUL SOLUTION EXACTE POUR PLOT
yy = [sol_exacte(t) for t in tt1]
# PLOT
plot(tt1,yy,'m-',tt1,uu1,'go-')
legend(['Exacte','Euler explicite'],loc='upper left')
# PRINT
h1=tt1[1]-tt1[0]
for n in range(Nh):
print ('y_%1d=%1.14f u_%1d=%1.14f (1+h)^%1d=%1.14f' %(n,yy[n],n,uu1[n],n,(1.+h1)**n))
On compare les approximations de $y(2)$ avec plusieurs valeurs de $N_h$: $$ u_{N_h}=(1+ah)^{N_h}u_0=\left(1+\frac{2}{N_h}\right)^{N_h}\xrightarrow[N_h\to+\infty]{}e^2=y(2). $$
# MAIN
y_2=sol_exacte(tfinal)
print ('\nSolution exacte en t=2:')
print ('y(2) =',y_2)
print ('\nSolution approchee en t=2 avec N points:')
print ('N\t sol_approx\t\t\t |erreur|')
for i in range(3,15):
N=2**i
tt = linspace(t0,tfinal,N+1)
uu = EE(phi,tt,y0)
print (N,'\t',uu[-1], '\t',abs(uu[-1]-y_2))
Vérifions la convergence linéaire:
error=[]
H=[]
N=arange(200,1000,100)
for n in N:
tt=linspace(t0,tfinal,n+1)
H.append(tt[1]-tt[0])
yy=[sol_exacte(t) for t in tt]
uu = EE(phi,tt,y0)
error_vec=[abs(uu[i]-yy[i]) for i in range(len(uu))]
error.append(max(error_vec))
# ESTIMATION ORDRES DE CONVERGENCE par regression
print ('Pente par regression lineaire', polyfit(log(H),log(error), 1)[0])
# PLOT ERREUR
loglog(H,error,'*-');
Dans le modèle logistique, on suppose que la croissance de la population d'effectif $y(t)\ge0$ est modélisée par l'équation différentielle: \begin{equation} y'(t)=(a-by(t))y(t), \qquad a,b>0. \end{equation} Ce modèle prend en compte une éventuelle surpopulation. En effet, le taux de croissance de la population est désormais de la forme $a-by(t)$: c'est la différence entre un taux de fertilité $a$ et un taux de mortalité de la forme $by(t)$ qui augmente avec l'effectif de la population.
Correction
On cherche l'unique solution du problème de Cauchy $\begin{cases}y'(t)=(a-by(t))y(t)\\y(t_0)=y_0\ge0\end{cases}$ pour $t\ge t_0$.
On écrit l'EDO sous la forme $y'(t) = -b y(t) \big( y(t)-\frac{a}{b} \big).$
Si $y(t)=A$ pour tout $t>0$ est solution de l'EDO, alors on doit avoir $A=(a-bA)A$. Donc, soit $A=0$ soit $A=\frac{a}{b}$.
Ainsi la solution constante $y(t)=\frac{a}{b}>0$ représente l'effectif d'équilibre de la population, directement liée aux contraintes environnementale (densité, ressources, etc.).
De plus, les solutions sont des fonctions strictement croissantes si $y(t)\in]0,a/b[$ et décroissantes si $y(t)>a/b$.
Calculons la solution exacte en remarquant qu'il s'agit d'une EDO à variables séparables. Pour $y(t)\neq0$ et $y(t)\neq\frac{a}{b}$, on remarque que $$ -b=\frac{y'(t)}{ \left( y(t)-\frac{a}{b} \right) y(t) } =\frac{\frac{b}{a}y'(t)}{y(t)-\frac{a}{b}y'(t)}-\frac{\frac{b}{a}}{y(t)}. $$ On doit alors calculer $$ \int\frac{1}{y-\frac{a}{b}}\mathrm{d}y-\int\frac{1}{y}\mathrm{d}y=-a\int 1 \mathrm{d}t. $$ On obtient $$ \ln\left( 1-\frac{b/a}{y} \right)=-at+C $$ et on en déduit $$ y(t)=\frac{a/b}{1-De^{-at}}. $$ En imposant la condition initiale $y(0)=y_0$ on trouve la constante d'intégration $D$ et on conclut que toutes les solutions du problème de Cauchy pour $t\ge0$ sont $$ y(t)= \begin{cases} 0 & \text{si } y_0=0,\\[0.5em] \dfrac{a}{b} & \text{si } y_0=\dfrac{a}{b},\\[0.5em] \dfrac {1}{\left(\frac{1}{y_0}-\frac{b}{a}\right) e^{-at}+\frac{b}{a}} &\text{sinon.} \end{cases} $$ Remarquons que $\lim_{t\to+\infty}y(t)=\frac{a}{b}$: une population qui évolue à partir de $y_0$ individus à l'instant initiale tend à se stabiliser vers un nombre d'individus d'environ $a/b$, ce qui représente la capacité de l'environnement.
La méthode d'Euler explicite (ou progressive) est une méthode d'intégration numérique d'EDO du premier ordre de la forme $y'(t)=\varphi(t,y(t))$.
On subdivise l'intervalle $[t_0;T]$ en $N$ intervalles $[t_{n};t_{n+1}]$ de largeur $h=\dfrac{T-t_0}{N}$ avec $t_n=t_0+nh$ pour $n=0,\dots,N$.
La longueur $h$ est appelé le pas de discrétisation.
Pour chaque nœud $t_n$, on note $y_n=y(t_n)$; l'ensemble des valeurs $\{y_0, y_1,\dots , y_{N} \}$ représente la solution exacte discrète.
Pour chaque nœud $t_n$, on cherche la valeur inconnue $u_n$ qui approche la valeur exacte $y_n$.
L'ensemble des valeurs $\{u_0 = y_0, u_1,\dots , u_{N_h} \}$ représente la solution numérique.
Dans la méthode d'Euler explicite, cette solution approchée est obtenue en construisant une suite récurrente comme suit $$\begin{cases} u_0=y_0,\\ u_{n+1}=u_{n}+h\varphi(t_{n},u_{n}). \end{cases}$$ En utilisant cette construction pour notre EDO on obtient $$\begin{cases} u_0=y_0,\\ u_{n+1}=u_{n}+h(a-bu_n)u_n \end{cases}$$
from matplotlib.pylab import *
def EE(phi,tt,y0):
h=tt[1]-tt[0]
uu = [y0]
for i in range(len(tt)-1):
uu.append(uu[i]+h*phi(tt[i],uu[i]))
return uu
phi = lambda t,y : (a-b*y)*y
def sol_exacte(t,y0):
if abs(y0-0.)<=1.e-10: # avec des float on ne peut pas
return 0
elif abs(y0-a/b)<=1.e-10:
return a/b
else:
return 1./((1./y0-b/a)*exp(-a*t)+b/a)
# INITIALISATION
a = 0.5
b = 0.5
t0 = 0
tfinal = 20
yy_0=[0.001, 0.1,0.5,1,1.5,2]
leg=[]
for y0 in yy_0:
leg.append('y_0='+str(y0))
# MAIN
figure(1, figsize=(15, 5))
subplot(1,3,1)
tt=linspace(t0,tfinal,25)
for i in range(len(yy_0)):
uu=EE(phi,tt,yy_0[i])
plot(tt,uu,'.-')
axis([t0,tfinal,0,2.])
title('25 noeuds')
grid()
legend(leg)
subplot(1,3,2)
tt=linspace(t0,tfinal,100)
for i in range(len(yy_0)):
uu=EE(phi,tt,yy_0[i])
plot(tt,uu,'.-')
title('100 noeuds')
axis([t0,tfinal,0,2.])
grid()
legend(leg)
subplot(1,3,3)
for i in range(len(yy_0)):
yy=[sol_exacte(t,yy_0[i]) for t in tt]
plot(tt,yy,'-')
axis([t0,tfinal,0,2.])
title('Exacte')
grid()
legend(leg);
L'évolution de la concentration de certaines réactions chimiques au cours du temps peut être décrite par l'équation différentielle $$ y'(t)=-\frac{1}{1+t^2}y(t). $$ Sachant qu'à l'instant $t=0$ la concentration est $y(0)=5$, déterminer la concentration à $t=2$ à l'aide de la méthode d'Euler implicite avec un pas $h=0.5$.
Correction
Dans ce cas, le schéma d'Euler implicite s'écrit $$ u_{n+1}=u_n-\frac{h}{1+t_{n+1}^2}u_{n+1}. $$ Elle peut être résolue algébriquement et cela donne la suite $$ u_{n+1}=\frac{u_n}{1+\frac{h}{1+t_{n+1}^2}}. $$ Si à l'instant $t=0$ la concentration est $y(0)=5$, et si $h=1/2$, alors $t_n=n/2$ et $$ u_{n+1}=\frac{4+(n+1)^2}{6+(n+1)^2}u_n. $$ On obtient donc $$ \begin{array}{ccc} n & t_n & u_n \\ \hline 0 & 0 & 5 \\ 1 & 0.5 & \frac{4+1^2}{6+1^2}5 =\frac{5}{7}5 =\frac{25}{7}\approx3.57\\ 2 & 1.0 & \frac{4+2^2}{6+2^2}\frac{25}{7} =\frac{8}{10}\frac{25}{7}=\frac{20}{7}\approx2.86\\ 3 & 1.5 & \frac{4+3^2}{6+3^2}\frac{20}{7} =\frac{13}{15}\frac{20}{7}=\frac{52}{21}\approx2.48\\ 4 & 2.0 & \frac{4+4^2}{6+4^2}\frac{52}{21}=\frac{20}{22}\frac{52}{21}=\frac{520}{231}\approx2.25\\ % 5 & 2.5 & \sfrac{15080}{7161}\approx2.11\\ % 6 & 3.0 & \sfrac{301600}{150381}\approx2.01 \end{array} $$ La concentration à $t=2$ est d'environ $2.25$ qu'on peut comparer avec le calcul exact $y(2)=5e^{-\arctan(2)}\approx1.652499838$.
Soit le problème de Cauchy: $$\begin{cases} y'(t)+10y(t)=0, & \forall t \in \mathbb{R},\\ y(0)=y_0>0. \end{cases}$$
- Montrer qu'il existe une unique solution globale $y$ $\in$ $\mathscr{C}^\infty(\mathbb{R},\mathbb{R})$ que vous préciserez explicitement.
- Soit $(u_n)_{n\in \mathbb{N}}$ la suite obtenue avec le schéma numérique de Crank-Nicolson. Montrer que $(u_n)_{n\in \mathbb{N}}$ est une suite géométrique dont on précisera la raison. Donner l'expression de $u_n$ en fonction de $n$.
- Montrer que la raison $r$ de la suite vérifie $|r|<1$ pour tout $h>0$. Ce schéma est-il inconditionnellement A-stable?
- Sous quelle condition sur $h>0$ le schéma génère-t-il une suite positive?
C'est un problème deCauchy du type $$\begin{cases} y'(t)=\varphi(t,y(t)), & \forall t \in \mathbb{R},\\ y(0)=y_0>0, \end{cases}$$ avec $\varphi(t,y)=g(y)=-10y$.
On montre d'abord qu'il existe une et une seule solution locale (ie sur $[-T;T]$) de classe $\mathscr{C}^1([-T,T],\mathbb{R})$.
On montre ensuite que cette solution est de classe $\mathscr{C}^\infty([-T,T],\mathbb{R})$.
On montre enfin que la solution admet un prolongement sur $\mathbb{R}$.
Pour en calculer la solution, on remarque qu'il s'agit d'une EDO à variables séparables. L'unique solution constante est $y(t)\equiv0$, toutes les autres solutions sont du type $y(t)=C e^{-10t}$. En prenant en compte la condition initiale on conclut que l'unique solution du problème de Cauchy est $$ y(t)=y_0e^{-10t} $$ définie pour tout $t$ $\in$ $\mathbb{R}$.
%matplotlib inline
from matplotlib.pylab import *
y0=1
exacte = lambda t : y0*exp(-10*t)
tt=linspace(0,3,101)
yy=[exacte(t) for t in tt]
plot(tt,yy);
Le schéma de Crank-Nicolson construit la suite $(u_n)_{n\in \mathbb{N}}$ selon la relation $$ u_{n+1}=u_n-5h(u_{n+1}+u_n), \qquad \forall n \in \mathbb{N}, $$ pour $h>0$ fixé. On obtient une formule de récurrence rendue explicite par un calcul élémentaire: $$ u_{n+1}=-5hu_{n+1}-5hu_n+u_n $$ d'où $$ u_{n+1}=\frac{1-5h}{1+5h}u_n. $$ Par récurrence on obtient $$ u_{n}=\left(\frac{1-5h}{1+5h}\right)^nu_0. $$ Il s'agit d'une suite géométrique de raison $$ r=\frac{1-5h}{1+5h}. $$
Pour tout $h>0$ on a $$ r=\frac{1-5h}{1+5h}=1-\frac{10h}{1+5h} $$ et $$-1<1-\frac{10h}{1+5h}<1. $$ Ce schéma est donc inconditionnellement A-stable car $|u_{n+1}|=|r^{n+1}u_0|\le|u_0|$.
Le schéma génère une suite positive ssi $$ 1-\frac{10h}{1+5h}>0 $$ c'est-à-dire ssi $$ h<\frac{1}{5}. $$
%matplotlib inline
from matplotlib.pylab import *
N=6
tt=linspace(0,1,N+1)
y0=1
exacte = lambda t : y0*exp(-10*t)
yy=[exacte(t) for t in tt]
phi = lambda t,y : -y**5
def schema(phi,tt,y0):
h=tt[1]-tt[0]
uu=[y0]
for i in range(len(tt)-1):
uu.append((1-5*h)/(1+5*h)*uu[i])
return uu
plot(tt,yy,label=("Exacte"))
plot(tt,schema(phi,tt,y0),"-.",label=("Schéma"))
legend();
Soit le problème de Cauchy: $$\begin{cases} y'(t)+\dfrac{\sqrt{y(t)}}{2}=0, & \forall t \in \mathbb{R}^+,\\ y(0)=y_0>0. \end{cases}$$
- Soit le schéma numérique défini par la suite $(u_n)_{n\in \mathbb{N}}$ suivante $$ \frac{u_{n+1}-u_n}{h}+\frac{u_{n+1}}{2\sqrt{u_n}}=0, \qquad \forall n \in \mathbb{N}, $$ pour $h>0$ fixé. Expliciter l'expression de $u_{n+1}$ en fonction de $u_n$.
- Montrer que la suite $(u_n)_{n\in \mathbb{N}}$ est une suite positive, décroissante et convergente vers $0$.
C'est un problème de Cauchy du type $$\begin{cases} y'(t)=\varphi(t,y(t)), & \forall t \in \mathbb{R},\\ y(0)=y_0>0, \end{cases}$$ avec $\varphi(t,y)=g(y)=-\frac{\sqrt{y}}{2}$.
Pour $h>0$ fixé on obtient une formule de récurrence rendue explicite par un calcul élémentaire: $$ u_{n+1}=\frac{u_n}{1 + \frac{h}{2\sqrt{u_n}}}=\frac{2(u_n)^{3/2}}{2\sqrt{u_n}+h}, \qquad \forall n \in \mathbb{N}. $$
On étudie la suite $$\begin{cases} u_0>0,\\ u_{n+1}=\frac{2(u_n)^{3/2}}{2\sqrt{u_n}+h}, \qquad \forall n \in \mathbb{N}, \end{cases}$$ pour $h>0$ fixé.
Par récurrence on montre que si $u_0>0$ alors $u_n>0$ pour tout $n$ $\in$ $\mathbb{N}$. De plus, $\frac{u_{n+1}}{u_{n}}=\frac{1}{1 + \frac{h}{2\sqrt{u_n}}}<1$ pour tout $n$ $\in$ $\mathbb{N}$: la suite est monotone décroissante. On a alors une suite décroissante et bornée par zéro, donc elle converge. Soit $\ell$ la limite de cette suite, alors $\ell\ge0$ et $\ell= \frac{2\ell^{3/2}}{2\sqrt{\ell}+h}$ donc $\ell=0$.
%matplotlib inline
from matplotlib.pylab import *
y0=1
phi = lambda t,y : -0.5*sqrt(y)
exacte = lambda t: 0 if t>=4*sqrt(y0) else (sqrt(y0)-t/4)**2
N=10
tt=linspace(0,10,N+1)
def schema(phi,tt,y0):
h=tt[1]-tt[0]
uu=[y0]
for i in range(len(tt)-1):
uu.append(2*(uu[i])**(3/2)/(h+2*sqrt(uu[i])))
return uu
yy=[exacte(t) for t in tt]
plot(tt,yy,'r-',label=('Exacte'))
plot(tt,schema(phi,tt,y0),'b*',label=("Schéma"))
legend();
Soit le problème de Cauchy: $$\begin{cases} y'(t)+y^5(t)=0, & \forall t \in \mathbb{R}^+,\\ y(0)=y_0>0. \end{cases}$$
- Montrer qu'il existe une unique solution globale $y$ $\in$ $\mathscr{C}^\infty(\mathbb{R}^+,\mathbb{R}^+)$.
- Soit le schéma numérique défini par la suite $(u_n)_{n\in \mathbb{N}}$ suivante $$ \frac{u_{n+1}-u_n}{h}+u_{n+1}u_n^4=0, \qquad \forall n \in \mathbb{N}, $$ pour $h>0$ fixé. Expliciter l'expression de $u_{n+1}$ en fonction de $u_n$.
- Montrer que la suite $(u_n)_{n\in \mathbb{N}}$ est une suite décroissante et convergente vers $0$ pour tout $h>0$ fixé.
C'est un problème deCauchy du type $$\begin{cases} y'(t)=\varphi(t,y(t)), & \forall t \in \mathbb{R},\\ y(0)=y_0>0, \end{cases}$$ avec $\varphi(t,y)=g(y)=-y^5$.
On montre d'abord qu'il existe une et une seule solution locale (ie sur $[0;T]$) de classe $\mathscr{C}^1([0,T],\mathbb{R})$.
On montre ensuite que cette solution est de classe $\mathscr{C}^\infty([0,T],\mathbb{R})$.
On montre enfin que la solution admet un prolongement sur $\mathbb{R}$.
Pour en calculer la solution, on remarque qu'il s'agit d'une EDO à variables séparables. L'unique solution du problème de Cauchy est $$ y(t)=y_0(4ty_0^4+1)^{-1/4} $$
y0=1
exacte = lambda t : y0*(4*t*y0**4+1)**(-0.25)
tt=linspace(0,10,101)
yy=[exacte(t) for t in tt]
plot(tt,yy);
Pour $h>0$ fixé on obtient une formule de récurrence rendue explicite par un calcul élémentaire: $$ u_{n+1}=\frac{u_n}{1 + u_n^4 h}, \qquad \forall n \in \mathbb{N}. $$
On étudie la suite $$\begin{cases} u_0=y_0>0,\\ u_{n+1}=\frac{u_n}{1 + u_n^4 h}, \qquad \forall n \in \mathbb{N}, \end{cases}$$ pour $h>0$ fixé.
Par récurrence on montre que si $u_0>0$ alors $u_n>0$ pour tout $n$ $\in$ $\mathbb{N}$. De plus, $\frac{u_{n+1}}{u_{n}}=\frac{1}{1 + u_n^4 h}<1$ pour tout $n$ $\in$ $\mathbb{N}$: la suite est monotone décroissante. On a alors une suite décroissante et bornée par zéro, donc elle converge. Soit $\ell$ la limite de cette suite, alors $\ell\ge0$ et $\ell= \frac{\ell}{1 + \ell^4 h}$ donc $\ell=0$. Ce schéma est donc inconditionnellement A-stable.
N=50
tt=linspace(0,10,N+1)
y0=1
exacte = lambda t : y0*(4*t*y0**4+1)**(-0.25)
yy=[exacte(t) for t in tt]
phi = lambda t,y : -y**5
def schema(phi,tt,y0):
h=tt[1]-tt[0]
uu=[y0]
for i in range(len(tt)-1):
uu.append(uu[i]/(1+h*uu[i]**4))
return uu
plot(tt,yy,label=("Exacte"),lw=2)
plot(tt,schema(phi,tt,y0),'o',label=("Schéma"))
legend();
Soit le problème de Cauchy: $$\begin{cases} y'(t)+\sin(y(t))=0, & \forall t \in \mathbb{R},\\ y(0)=y_0>0. \end{cases}$$
- Montrer qu'il existe une unique solution globale $y$ $\in$ $\mathscr{C}^\infty(\mathbb{R},\mathbb{R})$.
- Écrire le schéma le schéma d'Euler explicite pour ce problème.
- Montrer que la suite $(u_n)_{n\in \mathbb{N}}$ construite par ce schéma vérifie $$ |u_{n+1}|\le |u_n|+h, \qquad \forall n \in \mathbb{N}, $$ où $h>0$ est le pas de la suite.
- En déduire que $$ |u_{n}|\le |u_0|+nh, \qquad \forall n \in \mathbb{N}. $$
C'est un problème deCauchy du type $$\begin{cases} y'(t)=\varphi(t,y(t)), & \forall t \in \mathbb{R},\\ y(0)=y_0>0, \end{cases}$$ avec $\varphi(t,y)=g(y)=-\sin(y)$.
On montre d'abord qu'il existe une et une seule solution locale (ie sur $[0;T]$) de classe $\mathscr{C}^1([0,T],\mathbb{R})$.
On montre ensuite que cette solution est de classe $\mathscr{C}^\infty([0,T],\mathbb{R})$.
On montre enfin que la solution admet un prolongement sur $\mathbb{R}$.
Soit $h>0$ fixé et $t_n=nh$ pour tout $n\in\mathbb{Z}$. Le schéma d'Euler explicite pour l'EDO donnée construit la suite $$ u_{n+1}=u_n - h \sin(u_n), \qquad \forall n \in \mathbb{N}. $$
Comme $|a+b|\le |a|+|b|$ et comme $|-\sin(x)|\le1$ pour tout $x\in\mathbb{R}$, on conclut que $$ |u_{n+1}|=|u_n - h \sin(u_n)| \le |u_n| + |h \sin(u_n)| \le |u_n| + h $$ pour $h>0$ fixé.
Par récurrence: $|u_{n+1}|\le |u_n| + h \le |u_{n-1}| + 2h \le\dots\le |u_0| + (n+1)h$.
N=100
tt=linspace(0,10,N+1)
phi = lambda t,y : -sin(y)
def schema(phi,tt,y0):
h=tt[1]-tt[0]
uu=[y0]
for i in range(len(tt)-1):
uu.append(uu[i]-h*sin(uu[i]))
return uu
plot(tt,schema(phi,tt,y0),'o',label=("Schéma"))
legend();
Un modèle pour la diffusion d'une épidémie se base sur l'hypothèse que sa vitesse de propagation est proportionnelle au nombre d'individus infectés et au nombre d'individus sains.
Si on note $I(t)\ge0$ le nombre d'individus infectés à l'instant $t\ge0$ et $A>0$ le nombre d'individus total, il existe une constante $k$ $\in$ $\mathbb{R}^+$ telle que $I'(t)=k I(t)(A-I(t))$.
- Montrer qu'il existe $T>0$ et une unique solution $I$ $\in$ $\mathscr{C}^\infty([0,T])$ au problème de Cauchy: $$\begin{cases} I'(t)=k I(t)(A-I(t)),\\ I(0)=I_0>0. \end{cases}$$ Montrer que si $0<I_0<A$ alors $0<I(t)<A$ pour tout $t>0$.
Montrer que si $0<I_0<A$ alors $I(t)$ est croissante sur $\mathbb{R}^+$.- Soit $0<I_0<A$. On considère le schéma semi-implicite $$ \frac{I_{n+1}-I_n}{h}=kI_n(A-I_{n+1}). $$ Montrer que $I_n\to A$ lorsque $n\to+\infty$ indépendamment du pas $h>0$ fixé.
- Calculer la solution exacte
C'est un problème deCauchy du type $$\begin{cases} I'(t)=\varphi(t,I(t)), & \forall t \in \mathbb{R}^+,\\ I(0)=I_0>0, \end{cases}$$ avec $\varphi(t,I(t))=g(I(t))=kI(t)(A-I(t))$.
Soit $0<I_0<A$. On considère le schéma semi-implicite $$ \frac{I_{n+1}-I_n}{h}=kI_n(A-I_{n+1}) $$ pour $h>0$ fixé. On obtient une formule de récurrence rendue explicite par un calcul élémentaire: $$ I_{n+1}=\frac{1+kAh}{1+kI_nh}I_n. $$ Si $0<I_0<A$ alors
donc $I_n\to A$ lorsque $n\to+\infty$ indépendamment du pas $h>0$ choisi.
On a déjà observé qu'il y a deux solutions constantes de l'EDO: la fonction $I(t)\equiv0$ et la fonction $I(t)\equiv A$.
Pour chercher toutes les solutions non constantes on remarque qu'il s'agit d'une EDO à variables séparables donc on a \begin{align*} % I'(t)=k I(t)(5000-I(t))\\ % \frac{I'(t)}{I(t)(5000-I(t))}&=k\\ % \frac{\mathrm{d}\,I}{I(5000-I)}&=k\mathrm{d}\,t\\ % \int\frac{1}{I(5000-I)}\mathrm{d}\,I&=k\int\mathrm{d}\,t\\ % \int\frac{1}{I}\mathrm{d}\,I-\int\frac{1}{5000-I}\mathrm{d}\,I&=5000k\int\mathrm{d}\,t\\ % \ln(I)+\ln(5000-I)&=5000kt+c\\ % \ln\frac{I}{5000-I}&=5000kt+c\\ % \frac{I}{5000-I}&=De^{5000kt}\\ % I(t)&=\frac{5000De^{5000 k t}}{1+De^{5000 k t}}\\ I(t)&=\frac{A}{De^{-A k t}+1} \end{align*}
La valeur numérique de la constante d'intégration $D$ est obtenue grâce à la CI: \begin{align*} % I(0)&=\frac{A}{De^{0}+1}\\ D&=\frac{A-I_0}{I_0} \end{align*}
Exemple avec $A=5000$, $I_0=160$, $k=\frac{\ln(363/38)}{35000}$ et $h=1$:
A=5000
I0=160
k=log(363/38)/35000
D=(A-I0)/I0
exacte = lambda t : A/(D*exp(-A*k*t)+1)
h=1
tt=arange(0,30,h)
yy=[exacte(t) for t in tt]
phi = lambda t,I : k*I*(A-I)
def schema(phi,tt,y0):
uu=[I0]
for i in range(len(tt)-1):
uu.append((1+k*A*h)/(1+k*uu[-1]*h)*uu[-1])
return uu
plot(tt,yy,label=("Exacte"))
plot(tt,schema(phi,tt,y0),label=("Schéma"))
legend();
Soit le problème de Cauchy: $$\begin{cases} y''(t)+1001y'(t)+1000y(t)=0, & \forall t \in \mathbb{R},\\ y(0)=1,\\ y'(0)=0. \end{cases}$$
- Écrire le problème comme un système de 2 EDO d'ordre 1 et en calculer la solution.
- Écrire le schéma le schéma d'Euler explicite pour ce problème.
- Pour quelles valeurs de $h$ le schéma est A-stable?
Soit $\mathbf{z}(t)=(y(t),y'(t))^T$ alors $y''(t)+1001y'(t)+1000y(t)=0$ se réécrit $$ \mathbf{z}'(t)= -\begin{pmatrix} 0&-1\\ 1000&1001 \end{pmatrix} \mathbf{z}(t) $$ Cette matrice a pour valeurs propres $\lambda_1=1$ et $\lambda_2=1000$ et pour vecteurs propres associés $\mathbf{v}_1=(-1,1)^T$ et $\mathbf{v}_2=(0,1000)^T$ (ci dessous le calcul formel des valeurs et vecteurs propes). Ainsi $$ \mathbf{z}(t)=c_1\mathbf{v}_1e^{-\lambda_1t}+c_2\mathbf{v}_2e^{-\lambda_2t} $$ et $$ y(t)=-c_1e^{-t}-c_2e^{-1001t}. $$ Il s'agit d'un problème stiff!
%reset -f
import sympy as symb
symb.init_printing()
symb.var('t')
M = symb.Matrix(((0,-1), (1000,1001)))
M
p=M.charpoly(t)
symb.factor(p)
P, D = M.diagonalize()
P,D
symb.simplify(P*D*P**-1)
Soit $h>0$ fixé et $t_n=nh$ pour tout $n\in\mathbb{Z}$. Le schéma d'Euler explicite pour le système donné construit la suite $$ \begin{aligned} \mathbf{u}_{n+1} &= \mathbf{u}_n -h \begin{pmatrix} 0&-1\\ 1000&1001 \end{pmatrix} \mathbf{u}_n \\ &= \begin{pmatrix} 1 & h\\ -1000h & 1-1001h \end{pmatrix} \mathbf{u}_n \\ &= \begin{pmatrix} 1 & h\\ -1000h & 1-1001h \end{pmatrix}^{n+1} \mathbf{u}_0,\\ &= \begin{pmatrix} -1 & -1\\ 1000 & 1 \end{pmatrix} \begin{pmatrix} 1-1000h & 0\\ 0 & 1-h \end{pmatrix}^{n+1} \begin{pmatrix} -1 & -1\\ 1000 & 1 \end{pmatrix}^{-1} \mathbf{u}_0\\ &= \begin{pmatrix} -1 & -1\\ 1000 & 1 \end{pmatrix} \begin{pmatrix} (1-1000h)^{n+1} & 0\\ 0 & (1-h)^{n+1} \end{pmatrix} \begin{pmatrix} -1 & -1\\ 1000 & 1 \end{pmatrix}^{-1} \mathbf{u}_0, \qquad \forall n \in \mathbb{N}. \end{aligned} $$
symb.var('h')
M = symb.Matrix(((1,h), (-1000*h,1-1001*h)))
M
P, D = M.diagonalize()
P , D
Le schéma est A-stable si $\lim_{n\to+\infty}\mathbf{u}_{n+1}=\mathbf{0}$. Il faut donc que $$\begin{cases} |1-1000h|<1\\ |1-h|<1 \end{cases}$$ d'où la condition $h<\frac{2}{1000}$.
Pour calculer la solution approchée du problème de Cauchy $$\begin{cases} y(t_0)=y_0,\\ y'(t)=\varphi(t,y(t)). \end{cases}$$ considérons la $\vartheta$-méthode suivante: $$\begin{cases} u_0=y_0,\\ u_{n+1}=u_{n}+h\left(\vartheta\varphi(t_{n+1},u_{n+1})+(1-\vartheta)\varphi(t_{n},u_{n})\right). \end{cases}$$ avec $\vartheta \in [0;1]$.
Soit $\varphi(t,y(t))=-\beta y(t)$ avec $\beta>0$. Donner une condition sur $h$ pour que la $\vartheta$-méthode soit A-stable. Pour quelles valeurs de $\vartheta$ la méthode est inconditionnellement A-stable?
Remarque: pour $\vartheta=0$ on retrouve la méthode d’Euler explicite, pour $\vartheta=1$ la méthode d’Euler implicite, pour $\vartheta=\frac{1}{2}$ la méthode de Crank-Nicholson.
Par induction $$ u_n=\left(1-\frac{\beta h }{1+\beta h \vartheta}\right)^n y_0 $$ Il s'agit d'une suite géométrique de raison $q=1-\frac{\beta h }{1+\beta h \vartheta}$.
La suite tends à zéro ssi $|q|<1$ (la convergence est monotone ssi $0\le q<1$):
$$-1<1-\frac{\beta h }{1+\beta h \vartheta}<1
\iff
0<\frac{\beta h }{1+\beta h \vartheta}<2
\iff
(1-2\vartheta)\beta h < 2
$$
Pour $\vartheta\ge \frac{1}{2}$ la méthode est inconditionnellement A-stable,
pour $\vartheta< \frac{1}{2}$ la méthode est A-stable ssi $h<\frac{2}{(1-2\vartheta)\beta}$.
Écrire le schéma predictor-corrector basé sur AM-3 AB-2. Attention à bien initialiser la suite récurrente.
Correction
Une méthode numérique à un pas a été utilisée pour résoudre une équation différentielle avec condition initiale. Les résultats obtenus par cette méthode en prenant des pas de temps $h = 0.1$, $h = 0.05$ et $h = 0.025$ sont donnés dans le tableau suivant (remarque: une valeur sur deux est affichée pour $h = 0.05$ et une valeur sur quatre est affichée pour $h = 0.025$) $$\begin{array}{|c|c|c|c|} \hline t_i &y_i\text{ pour }h=0.1 &y_i\text{ pour }h=0.05 &y_i\text{ pour }h=0.025\\ \hline 1.0 &0.500000 &0.500000 &0.500000\\ 1.1 &0.512084 &0.512242 &0.512280\\ 1.2 &0.511698 &0.512101 &0.512196\\ 1.3 &0.500927 &0.501559 &0.501704\\ 1.4 &0.482686 &0.483447 &0.483619\\ 1.5 &0.459861 &0.460633 &0.460804\\ \hline \end{array} $$ En calculant le rapport des erreurs et sachant que $y(1.5)=0.460857$, déterminer l’ordre de la méthode numérique utilisée.
Correction
La méthode utilisée est d’ordre $2$, en effet, pour $t=1.5$ nous avons
$$
\frac{E(h = 0. 05)}{E(h = 0. 025)}=\frac{|0.460633 - 0.460857|}{|0.460804 - 0.460857|}= 4.226\simeq2^2.
$$
Si on a accès à polyfit
on peut tracer la courbe d'erreur en echèlle logaritmique et estimer la pente:
%reset -f
%matplotlib inline
%autosave 300
from matplotlib.pylab import *
H=[0.1,0.05,0.025]
err=[]
y=0.460857
err.append(abs(y-0.459861))
err.append(abs(y-0.460633))
err.append(abs(y-0.460804))
print ('Ordre\t %1.2f' %(polyfit(log(H),log(err), 1)[0]))
subplot(1,2,1)
loglog(H,err, 'r-o');
grid()
subplot(1,2,2)
plot(log(H),log(err), 'r-o');
Construire une méthode de quadrature comme suit: $$ \int_{0}^{1}f(\tau)\mathrm{d}\tau \approx \int_{0}^{1}p(\tau)\mathrm{d}\tau. $$ NB: on intègre sur $[0,1]$ mais on interpole en $-1$, $0$ et $1$.
À l'aide d'un changement de variable affine entre l'intervalle $[0,1]$ et l'intervalle $[a,b]$, en déduire une formule de quadrature pour l'intégrale
$$
\int_{a}^{b}f(x) \mathrm{d}x
$$
lorsque $f$ est une fonction de classe $\mathcal{C}^1([2a-b,b])$.
Remarque: $[2a-b,b]=[a-(b-a),a+(b-a)]$
Considérons le problème de Cauchy: trouver $y \colon [t_0,T]\subset \mathbb{R} \to \mathbb{R}$ tel que $$\begin{cases} y'(t) = \varphi(t,y(t)), &\forall t \in [t_0,T],\\ y(t_0) = y_0, \end{cases}$$ dont on suppose l'existence d'une unique solution $y$.
On subdivise l'intervalle $[t_0;T]$ en $N$ intervalles $[t_{n};t_{n+1}]$ de largeur $h=\dfrac{T-t_0}{N}$ avec $t_n=t_0+nh$ pour $n=0,\dots,N$. Utiliser la formule obtenue au point 3 pour approcher l'intégrale $$ \int_{t_n}^{t_{n+1}}\varphi(t,y(t))\mathrm{d}t. $$ En déduire un schéma à deux pas implicite pour l'approximation de la solution du problème de Cauchy.
Correction
On cherche les coefficients $\alpha$, $\beta$ et $\gamma$ du polynôme $p(\tau)=\alpha+\beta \tau+\gamma \tau^2$ tels que $$ \begin{cases} p(-1)=f(-1),\\ p(0) =f(0),\\ p(1) =f(1), \end{cases} \qquad\text{c'est à dire}\qquad \begin{cases} \alpha-\beta+\gamma=f(-1),\\ \alpha=f(0),\\ \alpha+\beta+\gamma=f(1). \end{cases} $$ Donc $\alpha=f(0)$, $\beta=\frac{f(1)-f(-1)}{2}$ et $\gamma=\frac{f(1)-2f(0)+f(-1)}{2}$.
import sympy as symb
symb.init_printing()
symb.var('f_0,f_1,f_m1,t')
p=symb.interpolate([(1,f_1),(0,f_0),(-1,f_m1)], t).factor(t)
p
On en déduit la méthode de quadrature $$ \int_{0}^{1}f(\tau)\mathrm{d}\tau\approx\int_{0}^{1}p(\tau)\mathrm{d}\tau=\alpha+\frac{\beta}{2}+\frac{\gamma}{3}=\frac{-f(-1)+8f(0)+5f(1)}{12}. $$
q=(symb.integrate(p,(t,0,1)).simplify())
q
Soit $x=m\tau+q$, alors $$ \int_{a}^{b} f(x)\mathrm{d}x=m\int_{0}^{1}f(m\tau+q)\mathrm{d}\tau \quad\text{avec}\quad \begin{cases} a=q,\\ b=m+q, \end{cases} \quad\text{i.e.}\quad \begin{cases} m=b-a,\\ q=a, \end{cases} $$ d'où le changement de variable $x=(b-a)\tau+a$. On en déduit la formule de quadrature $$ \int_{a}^{b}\!\!\!\!f(x)\mathrm{d}x=(b-a)\int_{0}^{1}f\left((b-a)\tau+a\right)\mathrm{d}\tau\approx(b-a)\frac{-f(2a-b)+8f(a)+5f(b)}{12}. $$
On pose $a=t_n$ et $b=t_{n+1}$ d'où la formule de quadrature $$\int_{t_{n}}^{t_{n+1}}\!\!\!\!f(t)\mathrm{d}t\approx(t_{n+1}-t_{n}) \frac{-f(2t_{n}-t_{n+1})+8f(t_{n})+5f(t_{n+1})}{12}=h \frac{-f(t_{n-1})+8f(t_{n})+5f(t_{n+1})}{12}.$$
En utilisant la formule de quadrature pour l'intégration de l'EDO $y'(t)=\varphi(t,y(t))$ entre $t_n$ et $t_{n+1}$ on obtient $$ y(t_{n+1})=y(t_n)+\int_{t_n}^{t_{n+1}} \varphi(t,y(t))\mathrm{d}t\approx h \dfrac{-\varphi(t_{n-1},y(t_{n-1}))+8\varphi(t_{n},y(t_{n}))+5\varphi(t_{n+1},y(t_{n+1}))}{12}. $$
Si on note $u_n$ une approximation de la solution $y$ au temps $t_n$, on obtient le schéma à deux pas implicite suivant: $$ \begin{cases} u_0=y(t_0)=y_0,\\ u_1\text{ à définir},\\ u_{n+1}=u_n+ h \dfrac{-\varphi(t_{n-1},u_{n-1})+8\varphi(t_{n},u_{n})+5\varphi(t_{n+1},u_{n+1})}{12} & n=1,2,\dots N-1 \end{cases} $$ On peut utiliser une pédiction d'Euler explicite pour initialiser $u_1$: $$ \begin{cases} u_0=y(t_0)=y_0,\\ u_1=u_0+h\varphi(t_0,u_0),\\ u_{n+1}=u_n+ h \dfrac{-\varphi(t_{n-1},u_{n-1})+8\varphi(t_{n},u_{n})+5\varphi(t_{n+1},u_{n+1})}{12} & n=1,2,\dots N-1 \end{cases} $$
Correction $p(x)=\dfrac{f(a)-f(a-h)}{a-(a-h)}(x-a)+f(a)=\dfrac{f(a)-f(a-h)}{h}(x-a)+f(a)$.
import sympy as symb
symb.init_printing()
symb.var('a,h,f_a,f_amh,t')
p=symb.interpolate([(a,f_a),(a-h,f_amh)], t).factor(t)
p
On en déduit la méthode de quadrature \begin{align*} \int_{a}^{a+h}f(x)\mathrm{d}x &\approx \int_{a}^{a+h}p(x)\mathrm{d}x \\&= \dfrac{f(a)-f(a-h)}{h}\left[ \frac{(x-a)^2}{2} \right]_a^{a+h}+f(a)\left[ x \right]_a^{a+h} \\&= \dfrac{f(a)-f(a-h)}{2h}\left((a+h-a)^2-(a-a)^2 \right)+f(a)(a+h-a) \\&= \dfrac{f(a)-f(a-h)}{2h} h^2 + hf(a) \\&= h \dfrac{3f(a)-f(a-h)}{2}. \end{align*}
q=(symb.integrate(p,(t,a,a+h)).simplify())
q
On pose $a=t_n$ et $a+h=t_{n+1}$ d'où la formule de quadrature $$ \int_{t_{n}}^{t_{n+1}}\!\!\!\!f(t)\mathrm{d}t\approx(t_{n+1}-t_{n}) \frac{3f(t_n)-f(2t_{n}-t_{n+1})}{2}=h \frac{3f(t_n)-f(t_{n-1})}{2}. $$ En utilisant la formule de quadrature pour l'intégration de l'EDO $y'(t)=\varphi(t,y(t))$ entre $t_n$ et $t_{n+1}$ on obtient $$ y(t_{n+1})=y(t_n)+\int_{t_n}^{t_{n+1}} \varphi(t,y(t))\mathrm{d}t\approx h \dfrac{3\varphi(t_{n},y(t_{n}))-\varphi(t_{n-1},y(t_{n-1}))}{2}. $$ Si on note $u_n$ une approximation de la solution $y$ au temps $t_n$, on obtient le schéma à deux pas implicite suivant: $$ \begin{cases} u_0=y(t_0)=y_0,\\ u_1\text{ à définir},\\ u_{n+1}=u_n+ h \dfrac{3\varphi(t_{n},u_{n})-\varphi(t_{n-1},u_{n-1})}{2} & n=1,2,\dots N-1 \end{cases} $$ On peut utiliser une prédiction d'Euler explicite pour initialiser $u_1$: $$ \begin{cases} u_0=y(t_0)=y_0,\\ u_1=u_0+h\varphi(t_0,u_0),\\ u_{n+1}=u_n+ h \dfrac{3\varphi(t_{n},u_{n})-\varphi(t_{n-1},u_{n-1})}{2} & n=1,2,\dots N-1 \end{cases} $$
Considérons le problème de Cauchy
trouver une fonction $y \colon I\subset \mathbb{R} \to \mathbb{R}$ définie sur un intervalle $I=[t_0,T]$ telle que $$\begin{cases} y'(t) = \varphi(t,y(t)), &\forall t \in I=[t_0,T],\\ y(t_0) = y_0, \end{cases}$$ avec $y_0$ une valeur donnée et supposons que l'on ait montré l'existence et l'unicité d'une solution $y$ pour $t\in I$.
On subdivise l'intervalle $I=[t_0;T]$, avec $T<+\infty$, en $N$ intervalles $[t_{n};t_{n+1}]$ de largeur $h=(T-t_0)/N$ avec $t_n=t_0+nh$ pour $n=0,\dots,N$.
Pour chaque nœud $t_n$, on note $y_n=y(t_n)$ et on cherche la valeur inconnue $u_n$ qui approche la valeur exacte $y_n$
Si nous intégrons l'EDO $y'(t)=\varphi(t,y(t))$ entre $t_{n-2}$ et $t_{n+1}$ nous obtenons $$ y_{n+1}-y_{n-2}=\int_{t_{n-2}}^{t_{n+1}} \varphi(t,y(t))dt. $$ Écrire le schéma obtenu en approchant l'intégrale $\int_{t_{n-2}}^{t_{n+1}} \varphi(t,y(t))\mathrm{d}t$ par l'intégrale $\int_{t_{n-2}}^{t_{n+1}} p(t) \mathrm{d}t$ où $p$ est le polynôme interpolant $\varphi$ en $t_{n}$ et $t_{n-1}$ (attention à bien initialiser la suite définie par récurrence pour qu'on puisse effectivement calculer tous les termes). Le schéma obtenu est-il explicite?
Correction Le polynôme interpolant $\varphi$ en $t_{n}$ et $t_{n-1}$ a équation $$ p(t) = \frac{\varphi(t_n,y_n)-\varphi(t_{n-1},y_{n-1})}{t_n-t_{n-1}}(t-t_n)+ \varphi(t_n,y_n). $$ On intègre ce polynôme entre $t_{n-2}$ et $t_{n+1}$: \begin{align*} \int_{t_{n-2}}^{t_{n+1}} p(t) \mathrm{d}t &= \frac{\varphi(t_n,y_n)-\varphi(t_{n-1},y_{n-1})}{h}\left[\frac{(t-t_n)^2}{2}\right]_{t_{n-2}}^{t_{n+1}}+ \varphi(t_n,y_n)\left[t\right]_{t_{n-2}}^{t_{n+1}} \\ &=\frac{\varphi(t_n,y_n)-\varphi(t_{n-1},y_{n-1})}{2h}\left[ (t_{n+1}-t_n)^2-(t_{n-2}-t_n)^2 \right]+ \varphi(t_n,y_n)\left[t_{n+1}-t_{n-2}\right] \\ &=\frac{3}{2}h\left(\varphi(t_n,y_n)+\varphi(t_{n-1},y_{n-1})\right). \end{align*} On obtient le schéma explicite $$\begin{cases} u_0=y_0,\\ u_1=u_0+h\varphi(t_0,u_0), \\ u_{n+1}=u_{n-2}+\frac{3}{2}h\left(\varphi(t_n,u_n)+\varphi(t_{n-1},u_{n-1})\right). \end{cases}$$