✍ Deposer votre notebook .ipynb sur Moodle (dépôt de devoir)
Dans le sujet il y a plusieurs paramètres. Pour les fixer, remplacez mon nom et prénom par les votres dans les cellules indiquées et vous obtiendrez un choix pour chaque paramètre.
Comparer la solution exacte, la solution approchée obtenue par la méthode d’Euler explicite (EE) et la solution obtenue avec la méthode d’Euler exponentielle (EEx) avec \(N+1\) points.
Comparer ensuite empiriquement les ordres de convergence.
La donnée initiale \(y_0\), la constante \(a\), la fonction \(t\mapsto b(t)\) et le nombre de points \(N\) sont donnés dans la cellule ci-dessous (modifiér nom et prénom).
Code
%reset -f%matplotlib inlineimport 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 sympy.init_printing()from IPython.display import display, Mathprlat =lambda*args: display(Math(''.join( sympy.latex(arg) for arg in args )))nom ="Faccanoni"prenom ="Gloria"print("Paramètres de l'exercice 1")S =sum([ord(c) for c in nom+prenom])L =list(range(1,5))idx = S%len(L)y0 = L[idx]prlat("y_0 = ",y0)L = [ (-10,1), (-10,3), (-10,5), (-5,1), (-5,3) ]idx = S%len(L)a,d = L[idx]c,N =-a, 1-aprlat("a = ",a)prlat("b(t) = ",c,"t+",d)prlat("N = ",N)
Q1 [3 points] Comparer la solution exacte, la solution approchée obtenue par la méthode d’Euler explicite (EE) et la solution obtenue avec la méthode d’Euler exponentielle (EEx) avec \(N+1\) points.
Écrire la suite définie par réccurence associée à ce schéma.
Étudier théoriquement l’ordre du schéma.
Étudier théoriquement la A-stabilité du schéma.
Considérons le problème de Cauchy \(y'(t)=-50y(t)\) pour \(t\in]0,1]\) et \(y(0)=1\). Vérifier empiriquement qu’avec \(N=8\) (i.e. 9 points de discrétisation) le schéma est instable et avec \(N=21\) il est stable.
Q2 [3 points] Étudier théoriquement l’ordre du schéma.
Soit \(\omega\) l’ordre de la méthode.
C’est un schéma implicite à \(3\) étages (\(s=3\)) donc \(\omega\le2s=6\)
Code
%reset -f%matplotlib inlineimport 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 sympy.init_printing()from IPython.display import display, Math, Markdownprlat=lambda*args: display(Math(''.join( sympy.latex(arg) for arg in args )))
Code
def ordre_RK(s, A=None, b=None, c=None): j = sympy.symbols('j')if A isNone: A = sympy.MatrixSymbol('a', s, s)else: A = sympy.Matrix(A)if c isNone: c = sympy.symbols(f'c_0:{</span>s<span class="sc">}') if b isNone: b = sympy.symbols(f'b_0:{</span>s<span class="sc">}') display(Markdown("**Matrice de Butcher**")) But = matrice_Butcher(s, A, b, c) Eqs = []# display(Markdown(f"**On a {s+1} conditions pour avoir consistance = pour être d'ordre 1**"))# ordre_1(s, A, b, c, j) display(Markdown("**On doit ajouter 1 condition pour être d'ordre 2**")) Eq_2 = ordre_2(s, A, b, c, j) Eqs.append(Eq_2) display(Markdown("**On doit ajouter 2 conditions pour être d'ordre 3**")) Eq_3 = ordre_3(s, A, b, c, j) Eqs.extend(Eq_3) display(Markdown("**On doit ajouter 4 conditions pour être d'ordre 4**")) Eq_4 = ordre_4(s, A, b, c, j) Eqs.extend(Eq_4)return Eqsdef matrice_Butcher(s, A, b, c): But = sympy.Matrix(A) But = But.col_insert(0, sympy.Matrix(c)) last = [sympy.Symbol(" ")] last.extend(b) But = But.row_insert(s,sympy.Matrix(last).T) display(Math(sympy.latex(sympy.Matrix(But))))return Butdef ordre_1(s, A, b, c, j): texte ="\sum_{j=1}^s b_j ="+f"{</span><span class="bu">sum</span>(b)<span class="sc">.</span>simplify()<span class="sc">}" texte +=r"\text{ doit être égale à }1" display(Math(texte))for i inrange(s): somma = sympy.summation(A[i,j],(j,0,s-1)).simplify() texte =r'\sum_{j=1}^s a_{'</span><span class="op">+</span><span class="bu">str</span>(i)<span class="op">+</span><span class="vs">r'j}='+ sympy.latex( somma ) texte +=r"\text{ doit être égale à }"+sympy.latex(c[i]) display(Math( texte ))returnNonedef ordre_2(s, A, b, c, j): texte ='\sum_{j=1}^s b_j c_j='+sympy.latex(sum([b[i]*c[i] for i inrange(s)]).simplify()) texte +=r"\text{ doit être égale à }\frac{1}{2}" display(Math(texte)) Eq_2 = sympy.Eq( sum([b[i]*c[i] for i inrange(s)]).simplify(), sympy.Rational(1,2) )return Eq_2def ordre_3(s, A, b, c, j): texte ='\sum_{j=1}^s b_j c_j^2=' texte += sympy.latex( sum([b[i]*c[i]**2for i inrange(s)]).simplify() ) texte +=r"\text{ doit être égale à }\frac{1}{3}" display(Math(texte)) Eq_3_1 = sympy.Eq( sum([b[i]*c[i]**2for i inrange(s)]).simplify(), sympy.Rational(1,3) ) texte =r'\sum_{i,j=1}^s b_i a_{ij} c_j=' somma =sum([b[i]*A[i,j]*c[j] for j inrange(s) for i inrange(s)]).simplify() texte = texte + sympy.latex(somma) texte +=r"\text{ doit être égale à }\frac{1}{6}" display(Math(texte)) Eq_3_2 = sympy.Eq( sum([b[i]*A[i,j]*c[j] for j inrange(s) for i inrange(s)]).simplify(), sympy.Rational(1,6) )return [Eq_3_1, Eq_3_2]def ordre_4(s, A, b, c, j): texte ='\sum_{j=1}^s b_j c_j^3=' texte += sympy.latex( sum([b[i]*c[i]**3for i inrange(s)]).simplify() ) texte +=r"\text{ doit être égale à }\frac{1}{4}" display(Math(texte)) Eq_4_1 = sympy.Eq( sum([b[i]*c[i]**3for i inrange(s)]).simplify(), sympy.Rational(1,4) ) texte =r'\sum_{i,j=1}^s b_i c_i a_{ij} c_j=' somma =sum([b[i]*c[i]*A[i,j]*c[j] for j inrange(s) for i inrange(s)]).simplify() texte = texte + sympy.latex(somma) texte +=r"\text{ doit être égale à }\frac{1}{8}" display(Math(texte)) Eq_4_2 = sympy.Eq( sum([b[i]*c[i]*A[i,j]*c[j] for j inrange(s) for i inrange(s)]).simplify(), sympy.Rational(1,8) ) texte =r'\sum_{i,j=1}^s b_i a_{ij} c_j^2=' somma =sum([b[i]*A[i,j]*c[j]**2for j inrange(s) for i inrange(s)]).simplify() texte = texte + sympy.latex(somma) texte +=r"\text{ doit être égale à }\frac{1}{12}" display(Math(texte)) Eq_4_3 = sympy.Eq( sum([b[i]*A[i,j]*c[j]**2for j inrange(s) for i inrange(s)]).simplify(), sympy.Rational(1,12) ) texte =r'\sum_{i,j,k=1}^s b_i a_{ij} a_{jk} c_k=' somma =sum([b[i]*A[i,j]*A[j,k]*c[k] for k inrange(s) for j inrange(s) for i inrange(s)]).simplify() texte = texte + sympy.latex(somma) texte +=r"\text{ doit être égale à }\frac{1}{24}" display(Math(texte)) Eq_4_4 = sympy.Eq( sum([b[i]*A[i,j]*A[j,k]*c[k] for k inrange(s) for j inrange(s) for i inrange(s)]).simplify(), sympy.Rational(1,24) )return [Eq_4_1, Eq_4_2, Eq_4_3, Eq_4_4]################################################### Conditions avec s étages##################################################c = [0,sympy.Rational(1,2),1]b = [sympy.Rational(1,6),sympy.Rational(2,3),sympy.Rational(1,6)]A = [ [0,0,0], [sympy.Rational(5,24),sympy.Rational(1,3),-sympy.Rational(1,24)], [0,1,0]]s =len(c)Eqs = ordre_RK(s, A, b, c)# for eq in Eqs:# display(eq)#
En effet, si on note \(x=\beta h\), par induction on obtient \(
u_{n}=\left(-\frac{x^3-5x^2+16x-24}{x^2+8x+24}\right)^nu_0.
\) Par conséquent, \(\lim\limits_{n\to+\infty}u_n=0\) si et seulement si \(
\left|\frac{x^3-5x^2+16x-24}{x^2+8x+24}\right|<1.
\)
L’étude de la fonction \(x\mapsto\frac{x^3-5x^2+16x-24}{x^2+8x+24}\) pour \(x>0\) montre que le schéma est A-stable ssi \(h<\frac{6}{\beta}\).
Code
sympy.var('u_n, h, β, K1, K2, K3') g =lambda y : -β*yeq1 = sympy.Eq( K1 , g(u_n))eq2 = sympy.Eq( K2 , g(u_n+h*5/24*K1+h/3*K2-h/24*K3) )eq3 = sympy.Eq( K3 , g(u_n+h*K2) )sol = sympy.solve([eq1,eq2,eq3],[K1,K2,K3])display(sol)RHS = u_n+h/6*(K1+2*K2+K3)RHS = RHS.subs(sol).simplify()texte ='u_{n+1}='+ sympy.latex(RHS)display(Math(texte)) print(r"Notons x=hβ>0. On trouve donc")x = sympy.Symbol('x',positive=True)RHS = RHS.subs(h*β,x).simplify()texte ='u_{n+1}='+ sympy.latex(RHS)display(Math(texte)) texte =r"\text{La méthode est A-stable ssi }|q(x)|<1\text{ avec }q(x)=\frac{u_{n+1</span><span class="sc">}}{u_n}="texte += sympy.latex(RHS/u_n)display(Math(texte)) sympy.solve([-1<RHS/u_n,RHS/u_n<1])
Elle est strictement croissante sur \([0,+\infty[\), \(q(0)=-1\) et \(\lim\limits_{x\to+\infty}q(x)=+\infty\). Il existe donc un et un seul \(x_0\) tel que \(q(x_0)=1\). En résolvant l’équation on trouve \(x_0=6\).
La condition de stabilité est donc satisfaite ssi \(0<x<6\), donc ssi \(
h<\frac{6}{\beta}.
\)
Q4 [3 points] Considérons le problème de Cauchy \(y'(t)=-50y(t)\) pour \(t\in]0,1]\) et \(y(0)=1\).
Vérifier empiriquement qu’avec \(N=8\) (i.e. 9 points de discrétisation) le schéma est instable et avec \(N=21\) il est stable.
Soit \(H\colon (y,z)\mapsto H(y,z)\) une fonction de deux variables régulière et posons \(\varphi_1(t,y,z)=\dfrac{\partial H}{\partial z}\) et \(\varphi_2(t,y,z)=-\dfrac{\partial H}{\partial y}\).
Notons \(\mathcal{H}\colon t \mapsto H(y(t),z(t))\). Montrer que \(\mathcal{H}\) est constante.
Posons \(H(y,z)=\dfrac{(ay)^2+(bz)^2}{2}\) où \(a\) et \(b\) sont des constantes fixées dans la cellule précédente.
Calculer la solution exacte (les données initiales sont fixées dans la cellule précédente).
Dans la suite on posera \(T=4\pi/(ab)\) et, pour les affichages, on chosira \(N+1\) points avec \(N=48\).
Dans trois répères différents afficher
\(t\mapsto y(t)\) et \(t\mapsto z(t)\) dans le même répère,
\(y\mapsto z(y)\),
\(t\mapsto\mathcal{H}(t)\).
Dans la suite on notera \(u_n\approx y(t_n)\), \(w_n\approx z(t_n)\) et \(J_n\approx\mathcal{H}(t_n)\). Calculer la solution approchée obtenue par la méthode suivante appelée méthode d’Euler symplectique. \( \text{(ES) }\begin{cases}
u_0=y_0,\\
w_0=z_0,\\
u_{n+1}=u_n+h\varphi_1\left(t_n,u_n,w_n\right),\\
w_{n+1}=w_n+h\varphi_2\left(t_{n+1},u_{n+1},w_{n+1}\right).
\end{cases} \)
Nota bene: le choix particulier de \(\varphi_1\) et \(\varphi_2\) permet de réécrire le schéma sous forme explicite.
Dans trois répère différents afficher, en comparant solution exacte et solution approchée,
\(\{(t_i,u_i)\}\) et \(\{(t_i,w_i)\}\) dans un même répère,
\(\{(u_i,w_i)\}\),
\(\{(t_i,J_i)\}\) où \(J_i=H(u_i,w_i)\).
Q1 [1 point] Notons \(\mathcal{H}\colon t \mapsto H(y(t),z(t))\). Montrer que \(\mathcal{H}\) est constante.
On a \(
\mathcal{H}'(t)=
\frac{d }{dt}H(y(t),z(t))=
\frac{\partial H}{\partial y}y'(t)+\frac{\partial H}{\partial z}z'(t)=
-z'(t)y'(t)+y'(t)z'(t)=0.
\)
Code
%reset -f%matplotlib inlineimport 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 sympy.init_printing()from IPython.display import display, Mathprlat=lambda*args: display(Math(''.join( sympy.latex(arg) for arg in args )))nom ="Faccanoni"prenom ="Gloria"print("Paramètres de l'exercice 3")L = [ (-1,0),(1,0),(0,1),(0,-1) ]idx =sum([ord(c) for c in nom+prenom])%len(L)y0,z0 = L[idx]prlat("y_0 = ",y0)prlat("z_0 = ",z0)L = [ (1,2),(2,1),(3,2),(2,3),(3,1),(1,3) ]idx =sum([ord(c) for c in nom+prenom])%len(L)(a,b) = L[idx]prlat("a = ",a)prlat("b = ",b)
Paramètres de l'exercice 3
\(\displaystyle \mathtt{\text{y\_0 = }}-1\)
\(\displaystyle \mathtt{\text{z\_0 = }}0\)
\(\displaystyle \mathtt{\text{a = }}3\)
\(\displaystyle \mathtt{\text{b = }}1\)
Q2 [2 point] Posons \(H(y,z)=\dfrac{(ay)^2+(bz)^2}{2}\) où \(a\) et \(b\) sont des constantes fixées dans la cellule précédente.
Calculer la solution exacte (les données initiales sont fixées dans la cellule précédente).
Dans la suite on posera \(T=4\pi/(ab)\) et, pour les affichages, on chosira \(N+1\) points avec \(N=48\).
Dans trois répères différents afficher
\(t\mapsto y(t)\) et \(t\mapsto z(t)\) dans le même répère,
Nota bene: le choix particulier de \(\varphi_1\) et \(\varphi_2\) permet de réécrire le schéma sous forme explicite.
Dans trois répère différents afficher, en comparant solution exacte et solution approchée,
\(\{(t_i,u_i)\}\) et \(\{(t_i,w_i)\}\) dans un même répère,
\(\{(u_i,w_i)\}\),
\(\{(t_i,J_i)\}\) où \(J_i=H(u_i,w_i)\).
Pour l’affichage des solutions exactes VS approchées, on peut écrire une fonction qui prend en paramètres la discrétisation tt, les deux listes solution exacte yy et zz, les deux listes solution approchée uu et ww, puis une chaîne de caractères s qui contient le nom du schéma, et pour finir HH la liste qui contient le calcul de l’Hamiltonien exact et HH_num celui approché.