from IPython.display import display, Latex
from IPython.core.display import HTML
css_file = './custom.css'
HTML(open(css_file, "r").read())
Considérons le problème de Cauchy
trouver une fonction $y \colon I\subset \R \to \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$.
Pour $h>0$ soit $t_n\stackrel{\text{déf.}}{=} t_0+nh$ avec $n=0,1,2,\dots,N_h$ une suite de $N_h+1$ nœuds de $I$ induisant une discrétisation de $I$ en $N_h$ sous-intervalles $I_n=[t_n;t_{n+1}]$ chacun de longueur $h>0$ (appelé le pas de discrétisation).
Pour chaque nœud $t_n$, on cherche la valeur inconnue $u_n$ qui approche la valeur exacte $y_n\equiv y(t_n)$.
Les schémas qu'on va construire permettent de calculer (explicitement ou implicitement) $u_{n+1}$ à partir de $u_n, u_{n-1},..., u_{n-k}$ et il est donc possible de calculer successivement $u_1$, $u_2$,..., en partant de $u_0$ par une formule de récurrence de la forme \begin{cases} u_0=y_0,\\ u_{n+1}=\Phi(u_{n+1},u_n, u_{n-1}, ..., u_{n-k}),&\forall n\in\N. \end{cases} Les schémas qu'on va construire permettent ainsi de calculer (explicitement ou implicitement) $u_{n+1}$ à partir de $u_n, u_{n-1}, ..., u_{n-k}$ et il est donc possible de calculer successivement $u_1$, $u_2$,\dots, en partant de $u_0$.
Méthodes explicites et méthodes implicites
Une méthode est dite explicite si la valeur $u_{n+1}$ peut être calculée directement à l'aide des valeurs précédentes $u_k$, $k\le n$ (ou d'une partie d'entre elles).
Une méthode est dite implicite si $u_{n+1}$ n'est défini que par une relation implicite faisant intervenir la fonction $\varphi$.
Méthodes à un pas et méthodes multi-pas
Une méthode numérique pour l'approximation du problème de Cauchy est dite à un pas si pour tout $n\in\N$, $u_{n+1}$ ne dépend que de $u_n$ et éventuellement de lui-même.
Autrement, on dit que le schéma est une méthode multi-pas (ou à pas multiples).
Dans la suite nous allons écrire explicitement ces schémas.
Pour vérifier nos calculs d'interpolation puis intégration, nous allons utiliser le package de calcul formel SymPy
.
import sympy as symb
symb.init_printing()
symb.var('h,t,t_n')
symb.var('phi_np1,phi_n,phi_nm1,phi_nm2,phi_nm3,phi_nm4,phi_nm5')
symb.var(' y_np1, y_n, y_nm1, y_nm2, y_nm3, y_nm4, y_nm5')
t_np1=t_n+h
t_nm1=t_n-h
t_nm2=t_n-2*h
t_nm3=t_n-3*h
t_nm4=t_n-4*h
t_nm5=t_n-5*h
Si nous intégrons l'EDO $y'(t)=\varphi(t,y(t))$ entre $t_n$ et $t_{n+1}$ nous obtenons $$ y_{n+1}-y_n=\int_{t_n}^{t_{n+1}} \varphi(t,y(t))dt. $$ On peut construire différentes schémas selon la formule de quadrature utilisée pour approcher le membre de droite. Cette solution approchée sera obtenue en construisant une suite récurrente comme suit: \begin{cases} u_0=y_0,\\ u_{n+1}=u_n+\displaystyle\int_{t_n}^{t_{n+1}} \text{un polynôme d'interpolation de }\varphi(t,u) \dt. \end{cases} Les schémas d'Adam approchent l'intégrale $\int_{t_n}^{t_{n+1}} \varphi(t,y(t))\dt$ par l'intégrale d'un polynôme $p$ interpolant $\varphi$ en des points donnés qui peuvent être à l'extérieur de l'intervalle d'intégration $[t_{n};t_{n+1}]$. On peut construire différentes schémas selon les points d'interpolation choisis. Ils se divisent en deux familles: les méthodes d'Adam-Bashforth qui sont explicites et les méthodes d'Adam-Moulton qui sont implicites:
Notons que, pour calculer successivement $u_{q}$, $u_{q+1}$, ..., il faut d'abord initialiser $u_0,u_1,\dots,u_{q-1}$. Cette initialisation doit être faite par des approximations adéquates car seul $u_0$ est donné.
Remarque: la condition de A-stabilité est de plus en plus contraignante quand l’ordre augmente.
On a
p=symb.interpolate([(t_n,phi_n)], t)
symb.integrate(p,(t,t_n,t_np1)).simplify()
On a
p=symb.interpolate([(t_n,phi_n),(t_nm1,phi_nm1)], t)
symb.integrate(p,(t,t_n,t_np1)).simplify()
On a
p=symb.interpolate([(t_n,phi_n),(t_nm1,phi_nm1),(t_nm2,phi_nm2)], t)
symb.integrate(p,(t,t_n,t_np1)).simplify()
On a
p=symb.interpolate([(t_n,phi_n),(t_nm1,phi_nm1),(t_nm2,phi_nm2),(t_nm3,phi_nm3)], t)
symb.integrate(p,(t,t_n,t_np1)).simplify()
On a
p=symb.interpolate([(t_np1,phi_np1)], t)
symb.integrate(p,(t,t_n,t_np1)).simplify()
On a
+\varphi(t_{n},y_{n})\frac{t-t_{n+1}}{t_n-t_{n+1}}$
p=symb.interpolate([(t_np1,phi_np1),(t_n,phi_n)], t)
symb.integrate(p,(t,t_n,t_np1)).simplify()
On a
+\varphi(t_{n},y_{n})\frac{(t-t_{n+1})(t-t_{n-1})}{(t_n-t_{n+1})(t_n-t_{n-1})}
+\varphi(t_{n-1},y_{n-1})\frac{(t-t_{n+1})(t-t_{n})}{(t_{n-1}-t_{n+1})(t_{n+1}-t_{n})}$
p=symb.interpolate([(t_np1,phi_np1),(t_n,phi_n),(t_nm1,phi_nm1)], t)
symb.integrate(p,(t,t_n,t_np1)).simplify()
import sympy as symb
symb.init_printing()
symb.var('h,t,t_n')
symb.var('phi_np1,phi_n,phi_nm1,phi_nm2,phi_nm3,phi_nm4,phi_nm5')
symb.var(' y_np1, y_n, y_nm1, y_nm2, y_nm3, y_nm4, y_nm5')
t_np1=t_n+h
t_nm1=t_n-h
t_nm2=t_n-2*h
t_nm3=t_n-3*h
t_nm4=t_n-4*h
t_nm5=t_n-5*h
Points=[(t_n,phi_n),(t_nm1,phi_nm1),(t_nm2,phi_nm2),(t_nm3,phi_nm3),(t_nm4,phi_nm4),(t_nm5,phi_nm5)]
for q in range(1,len(Points)):
p=symb.interpolate(Points[0:q+1], t)
AB=(symb.integrate(p,(t,t_n,t_np1)).simplify())
print("AB-",q)
display(AB)
print("\n")
print("\n")
Points=[(t_np1,phi_np1),(t_n,phi_n),(t_nm1,phi_nm1),(t_nm2,phi_nm2),(t_nm3,phi_nm3),(t_nm4,phi_nm4),(t_nm5,phi_nm5)]
for q in range(len(Points)):
p=symb.interpolate(Points[0:q+1], t)
AM=(symb.integrate(p,(t,t_n,t_np1)).simplify())
print("AM-",q)
display(AM)
print("\n")
Les méthodes d'Adam peuvent être facilement généralisées en intégrant l'EDO $y'(t)=\varphi(t,y(t))$ entre $t_{n-r}$ et $t_{n+1}$ avec $r\ge1$.
Avec $r=1$, si nous intégrons l'EDO $y'(t)=\varphi(t,y(t))$ entre $t_{n-1}$ et $t_{n+1}$ nous obtenons $$ y_{n+1}-y_{n-1}=\int_{t_{n-1}}^{t_{n+1}} \varphi(t,y(t))dt. $$ On peut construire différentes schémas selon la formule de quadrature utilisée pour approcher le membre de droite. Cette solution approchée sera obtenue en construisant une suite récurrente comme suit: \begin{cases} u_0=y_0,\\ u_1=?,\\ u_{n+1}=u_{n-1}+\displaystyle\int_{t_{n-1}}^{t_{n+1}} \text{un polynôme d'interpolation de }\varphi(t,u) \dt. \end{cases}
On obtient les schémas de Nyström, qui sont explicites, et les schémas de Milne-Simpson, qui sont implicites:
On a
p=symb.interpolate([(t_n,phi_n)], t).simplify()
symb.integrate(p,(t,t_nm1,t_np1)).simplify()
On a
p=symb.interpolate([(t_n,phi_n),(t_nm1,phi_nm1)], t).simplify()
symb.integrate(p,(t,t_nm1,t_np1)).simplify()
On a
p=symb.interpolate([(t_n,phi_n),(t_nm1,phi_nm1),(t_nm2,phi_nm2)], t).simplify()
symb.integrate(p,(t,t_nm1,t_np1)).simplify()
On a
p=symb.interpolate([(t_np1,phi_np1)], t).simplify()
symb.integrate(p,(t,t_nm1,t_np1)).simplify()
On a
+\varphi(t_{n},y_{n})\frac{t-t_{n+1}}{t_n-t_{n+1}}$
p=symb.interpolate([(t_np1,phi_np1),(t_n,phi_n)], t).simplify()
symb.integrate(p,(t,t_nm1,t_np1)).simplify()
On a
+\varphi(t_{n},y_{n})\frac{(t-t_{n+1})(t-t_{n-1})}{(t_n-t_{n+1})(t_n-t_{n-1})}
+\varphi(t_{n-1},y_{n-1})\frac{(t-t_{n+1})(t-t_{n})}{(t_{n-1}-t_{n+1})(t_{n+1}-t_{n})}$
p=symb.interpolate([(t_np1,phi_np1),(t_n,phi_n),(t_nm1,phi_nm1)], t).simplify()
symb.integrate(p,(t,t_nm1,t_np1)).simplify()
import sympy as symb
symb.init_printing()
symb.var('h,t,t_n')
symb.var('phi_np1,phi_n,phi_nm1,phi_nm2,phi_nm3,phi_nm4,phi_nm5')
symb.var(' y_np1, y_n, y_nm1, y_nm2, y_nm3, y_nm4, y_nm5')
t_np1=t_n+h
t_nm1=t_n-h
t_nm2=t_n-2*h
t_nm3=t_n-3*h
t_nm4=t_n-4*h
t_nm5=t_n-5*h
Points=[(t_n,phi_n),(t_nm1,phi_nm1),(t_nm2,phi_nm2),(t_nm3,phi_nm3),(t_nm4,phi_nm4),(t_nm5,phi_nm5)]
for q in range(1,len(Points)):
p=symb.interpolate(Points[0:q+1], t)
N=(symb.integrate(p,(t,t_nm1,t_np1)).simplify())
print("N-",q)
display(N)
print("\n")
print("\n")
Points=[(t_np1,phi_np1),(t_n,phi_n),(t_nm1,phi_nm1),(t_nm2,phi_nm2),(t_nm3,phi_nm3),(t_nm4,phi_nm4),(t_nm5,phi_nm5)]
for q in range(len(Points)):
p=symb.interpolate(Points[0:q+1], t)
MS=(symb.integrate(p,(t,t_nm1,t_np1)).simplify())
print("MS-",q)
display(MS)
print("\n")
Si nous interpolons la fonction inconnue $t\mapsto y(t)$ par un polynôme $p$ en des points donnés $$ \{t_{n+1},t_n,\dots, t_{n+1-i}\}\text{ avec } q\ge 1, $$ nous obtenons $y(t) \simeq p(t)$ et nous pouvons écrire $$ \varphi(t,y) = y'(t) \simeq p'(t). $$ En évaluant cette relation en $t_{n+1}$ nous obtenons la relation $$ \varphi(t_{n+1},y_{n+1}) \simeq p'(t_{n+1}). $$ On peut construire différents schémas (implicites) selon les points d'interpolation utilisés pour approcher la fonction inconnue $t\mapsto y(t)$. Cette solution approchée sera obtenue en construisant une suite récurrente comme suit: $$ \begin{cases} u_0=y_0,\\ u_{n+1} \text{ solution de l'équation }\varphi(t_{n+1},u_{n+1}) \simeq p'(t_{n+1}). \end{cases} $$
Remarque: la condition de A-stabilité est de plus en plus contraignante quand l’ordre augmente.
On a
p=symb.interpolate([(t_np1,y_np1),(t_n,y_n)], t).factor()
print("p(t)")
display(p)
dp=symb.diff(p,t).subs(t,t_np1)
print("p'(t)")
display(dp)
print("y_np1=")
symb.solve(dp-phi_np1,y_np1)[0]
On a
p(t)&=y_{n+1}\frac{(t-t_n)(t-t_{n-1})}{(t_{n+1}-t_n)(t_{n+1}-t_{n-1})}
+y_{n}\frac{(t-t_{n+1})(t-t_{n-1})}{(t_{n}-t_{n+1})(t_{n}-t_{n-1})}
+y_{n-1}\frac{(t-t_{n+1})(t-t_{n})}{(t_{n-1}-t_{n+1})(t_{n-1}-t_{n})}
\\
&=\frac{(t-t_{n})(t-t_{n-1})}{2h^2}y_{n+1}
+\frac{(t-t_{n+1})(t-t_{n-1})}{-h^2}y_{n}
+\frac{(t-t_{n+1})(t-t_{n})}{-2h^2}y_{n-1}
\end{aligned}$
p=symb.interpolate([(t_np1,y_np1),(t_n,y_n),(t_nm1,y_nm1)], t).simplify()
print("p(t)")
display(p)
dp=symb.diff(p,t).subs(t,t_np1)
print("p'(t)")
display(dp)
print("y_np1=")
symb.solve(dp-phi_np1,y_np1)[0]
import sympy as symb
symb.init_printing()
symb.var('h,t,t_n')
symb.var('phi_np1')
symb.var(' u_np1, u_n, u_nm1, u_nm2, u_nm3, u_nm4, u_nm5')
t_np1=t_n+h
t_nm1=t_n-h
t_nm2=t_n-2*h
t_nm3=t_n-3*h
t_nm4=t_n-4*h
t_nm5=t_n-5*h
Points=[(t_np1,u_np1),(t_n,u_n),(t_nm1,u_nm1),(t_nm2,u_nm2),(t_nm3,u_nm3),(t_nm4,u_nm4),(t_nm5,u_nm5)]
for q in range(1,len(Points)):
print("BDF-",q)
p=symb.interpolate(Points[0:q+1], t)
dp=symb.diff(p,t).subs(t,t_np1)
sol=symb.solve(dp-phi_np1,u_np1)
display(sol)
print("\n")
Lorsqu'on utilise une méthode implicite, pour calculer $u_{n+1}$ on doit résoudre une équation (en générale non-linéaire), par exemple avec une méthode de point fixe.
Une approche différente qui permet de s'affranchir de cette étape est donnée par les méthodes predictor-corrector. Une méthode predictor-corrector est une méthode qui permet de calculer $u_{n+1}$ de façon explicite à partir d'une méthode implicite comme suit.
On considère une méthode implicite $u_{n+1}=u_n+hG(u_{n+1};u_n,...)$:
Remarque
Ces méthodes héritent de l’ordre de précision du correcteur. Cependant, étant explicites, elles sont soumises à une condition de stabilité qui est typiquement celle du prédicteur. Elles ne sont donc pas adaptées à la résolution des problèmes de Cauchy sur des intervalles non bornés ou des problèmes stiff.
La méthode de Heun \begin{cases} u_0 = y_0 \\ \tilde u_{n+1} = u_n + h\varphi(t_n,u_n) & n=1,2,\dots N-1\\ u_{n+1} = u_n + \frac{h}{2} \left(\varphi(t_{n},u_{n})+\varphi(t_{n+1},\tilde u_{n+1})\right) & n=1,2,\dots N-1 \end{cases} est construite par les deux étapes suivantes:
Des méthodes de type predictor-corrector sont souvent construites en utilisant une prédiction d'Adam-Bashforth suivie d'une correction d'Adam-Moulton.
Par exemple, si on considère les deux étapes suivantes
u_0 = y_0 \\
u_1 = u_0 +h\varphi(t_0,u_0),\\
\tilde u_{n+1} = u_n +\frac{3}{2}h\left( \varphi(t_n,un)-\varphi(t{n-1},u_{n-1}) \right)& n=2,3,\dots N-1\
u_{n+1} = u_{n}+\frac{h}{12}\left(5\varphi(t_{n+1},\tilde u_{n+1})+8\varphi(t_n,u_n)-\varphi(t_{n-1},u_{n-1}\right) & n=2,3,\dots N-1
\end{cases} Construire une méthode de quadrature comme suit: $$ \int_{0}^{1}f(\tau)\dtau \approx \int_{0}^{1}p(\tau)\dtau. $$ 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) \dx
$$
lorsque $f$ est une fonction de classe $\CC^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 \R \to \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))\dt. $$ En déduire un schéma à deux pas implicite pour l'approximation de la solution du problème de Cauchy.
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,')
p=symb.interpolate([(1,f_1),(0,f_0),(-1,f_m1)], t).factor(t)
p
q=(symb.integrate(p,(t,0,1)).simplify())
q
Soit $x=m\tau+q$, alors $$
m\int_{0}^{1}f(m\tau+q)\dtau \quad\text{avec}\quad \begin{cases} a=q,\\ b=m+q, \end{cases} \quad\text{\ie}\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 $$
(b-a)\int_{0}^{1}f\left((b-a)\tau+a\right)\dtau \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)\dt \approx
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(tn)+\int{tn}^{t{n+1}} \varphi(t,y(t))\dt \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} $$
$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')
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)\dx &\approx \int_{a}^{a+h}p(x)\dx \\&= \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)\dt \approx
h \frac{3f(tn)-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(tn)+\int{tn}^{t{n+1}} \varphi(t,y(t))\dt \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 \R \to \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))\dt$ par l'intégrale $\int_{t_{n-2}}^{t_{n+1}} p(t) \dt$ 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?
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) \dt &= \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}
Écrire le schéma predictor-corrector basé sur AM-3 AB-2. Attention à bien initialiser la suite récurrente.
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.
%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');