%reset -f%matplotlib inline%autosave 300import sys #only needed to determine Python version numberprint('Python version '+ sys.version)import numpy as npimport matplotlib.pyplot as pltplt.rcParams.update({<span class="st">'font.size'</span>: <span class="dv">12</span>})from scipy.optimize import fsolveimport sympy as symsym.init_printing()
Autosaving every 300 seconds
Python version 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
1 Exercice
Considérons le problème de Cauchy :
trouver la fonction \(y \colon I\subset \mathbb{R} \to \mathbb{R}\) telle que
On sait que la solution de ce problème de Cauchy est tout simplement \(y(t)=e^{t}\).
Compléter l’implémentation et estimer l’ordre de convergence des schémas indiqués.
Résultats attendus:
Les méthodes multipas explicites \(\text{AB}_q\) pas et \(\text{N}_q\) à \(q\) convergent à l’ordre \(q\).
Les méthodes multipas implicites \(\text{AM}_q\) et \(\text{MS}_q\) à \(q\) pas convergent à l’ordre \(q+1\) si \(q\) est impair et \(q+2\) si \(q\) est pair.
Les méthodes multipas implicites \(\text{BDF}_q\) à \(q\) pas convergent à l’ordre \(q\).
Les méthodes predictor-corrector où le schéma predictor (explicite) a ordre \(\omega_E\) et le corrector (implicite) a ordre \(\omega_I\) convergent à l’ordre \(\min(\omega_E+1,\omega_I)\).
Les méthodes Runge-Kutta à \(s\) étages ont ordre au mieux \(s\) si elles sont explicites et \(2s\) si elles sont implicites (bornes supérieures).
Remarque: puisque la fonction \(\varphi(t,y)=y\) est linéaire, toute méthode implicite peut être rendue explicite par un calcul élémentaire en explicitant directement pour chaque schéma l’expression de \(u_{n+1}\). Cependant, nous pouvons utiliser le module SciPy sans modifier l’implémentation des schémas (mais on payera l’ordre de convergence de fsolve).
Attention: les schémas multistep ont besoin d’initialiser plusieurs pas de la suite définie pas récurrence pour pouvoir démarrer. Dans cette étude, au lieu d’utiliser un schéma d’ordre inférieur pour initialiser la suite, on utilisera la solution exacte (en effet, l’utilisation d’un schéma d’ordre inférieur dégrade l’ordre de précision).
Rappels de la démarche pour le calcul de l’orde de convergence.
On écrit les schémas numériques :
les nœuds d’intégration \([t_0,t_1,\dots,t_{N}]\) sont contenus dans le vecteur tt (qui change en fonction de h)
les valeurs \([u_0,u_1,\dots,u_{N}]\) pour chaque méthode sont contenues dans le vecteur uu.
Pour chaque schéma, on calcule la solution approchée avec différentes valeurs de \(h_k=1/N_k\). On sauvegarde les valeurs de \(h_k\) dans le vecteur H.
Pour chaque valeur de \(h_k\), on calcule le maximum de la valeur absolue de l’erreur et on sauvegarde toutes ces erreurs dans le vecteur err_schema de sort que err_schema[k] contient \(e_k=\max_{i=0,\dots,N_k}|y(t_i)-u_{i}|\).
Pour afficher l’ordre de convergence on utilise une échelle logarithmique, i.e. on représente \(\ln(h)\) sur l’axe des abscisses et \(\ln(\text{err})\) sur l’axe des ordonnées.
En effet, si \(\text{err}=Ch^p\) alors \(\ln(\text{err})=\ln(C)+p\ln(h)\).
En échelle logarithmique, \(p\) représente donc la pente de la ligne droite \(\ln(\text{err})\).
2 Schémas explicites
2.1 Schéma de Adam-Bashforth à 1 pas = schéma d’Euler progressif
On initialise le problème de Cauchy, on définit l’équation différentielle (phi est une fonction python qui contient la fonction mathématique \(\varphi(t, y)\) dépendant des variables \(t\) et \(y\)) et enfin on définit la solution exacte:
Pour chaque schéma, on calcule la solution approchée avec différentes valeurs de \(h_k=1/N_k\); on sauvegarde les valeurs de \(h_k\) dans le vecteur H.
Pour chaque valeur de \(h_k\), on calcule le maximum de la valeur absolue de l’erreur et on sauvegarde toutes ces erreurs dans le vecteur err_schema de sort que err_schema[k] contient \(e_k=\max_{i=0,...,N_k}|y(t_i)-u_{i}|\).
Nous pouvons utiliser deux méthodes différentes pour stocker ces informations.
5.1 Méthode 1
La première méthode est celle utilisée lors des deux premiers TP: on crée autant de listes que de solutions approchées.
Pour estimer l’ordre de convergence on estime la pente de la droite qui relie l’erreur au pas \(k\) à l’erreur au pas \(k+1\) en echelle logarithmique en utilisant la fonction polyfit basée sur la régression linéaire.
\(\omega_{[C]}\) l’ordre du corrector (schéma implicite)
\(\omega_{[P]}\) l’ordre du predictor (schéma explicite)
alors l’ordre du schéma predictor-corrector est \(\omega_{[PC]}=\min\{\omega_{[C]},\omega_{[P]}+1\}\)
Pour les schémas AM4-ABx, le schéma corrector est d’ordre \(p=5\), pour ne pas perdre en ordre convergence il faut choisir un schéma predictor d’ordre \(p-1\) (ici AB4).
Pour afficher l’ordre de convergence on utilise une échelle logarithmique : on représente \(\ln(h)\) sur l’axe des abscisses et \(\ln(\text{err})\) sur l’axe des ordonnées. Le but de cette représentation est clair: si \(\text{err}=Ch^p\) alors \(\ln(\text{err})=\ln(C)+p\ln(h)\). En échelle logarithmique, \(p\) représente donc la pente de la ligne droite \(\ln(\text{err})\).