2022 Contrôle Continu
- ⏱ 2H30
- ✍ Deposer votre fichier .ipynb sur Moodle (dépôt de devoir)
1 Exercice 1 : étude d’un schéma multipas
On notera \(\varphi_k\stackrel{\text{déf}}{=}\varphi(t_k,u_k)\).
Soit la méthode multipas
\( u_{n+1} = \alpha u_n + (1-\alpha) u_{n-1} +h\left(2\varphi_{n+1} -\frac{3\vartheta}{2}\varphi_{n}+\frac{\vartheta}{2} \varphi_{n-1}\right). \)
- Pour quelles valeurs des paramètres \(\alpha\) et \(\vartheta\) la méthode est zéro-stable ?
- Quel est l’ordre de convergence de la méthode?
- Nous allons maintenant fixer \(\alpha\). Pour \(\vartheta\), choisir une valeur qui garantie la convergence. Vérifier empiriquement l’ordre de convergence sur le problème de Cauchy \(\begin{cases} y'(t) = t^2-y(t), &\forall t \in I=[0,1],\\ y(0) = 2. \end{cases} \)
Q1 [2 points]
Pour quelles valeurs des paramètres \(\alpha\) et \(\vartheta\) la méthode est zéro-stable?
Le premier polynôme caractéristique est
\( \varrho(r)=r^{p+1}-\sum_{j=0}^p a_jr^{p-j}=r^2-\alpha r+(\alpha-1)=(r-1)\big(r-(\alpha-1)\big) \)
dont les racines sont
\( r_0=1,\quad r_1=\alpha-1. \)
La méthode est donc zéro-stable ssi
\( \begin{cases} |r_j|\le1 \quad\text{pour tout }j=0,1 \\ \varrho'(r_j)\neq0 \text{ si } |r_j|=1 \end{cases} \)
donc ssi \(0\le\alpha<2\).
Q2 [3 points]
Quel est l’ordre de convergence de la méthode?
On rappelle qu’une méthode est convergente ssi elle est zéro-stable et consistante. Nous allons donc étudier la consistance (puis l’ordre de consistance = ordre de convergence) pour les seules valeurs de \(\alpha\) pour lesquelles on a la zéro-stabilité.
- On a \(p=1\): c’est une méthode à \(q=p+1=2\) pas.
- La méthode est implicite car \(b_{-1}=2\neq0\).
Pour que la méthode soit consistante il faut que \(\xi(0)=\xi(1)=1\).
De plus, la première barrière de Dahlquist affirme qu’un schéma implicite à \(q=2\) pas consistante et zéro-stable peut être au mieux d’ordre \(\omega=q+2=4\).
Pour que la méthode soit
- au moins d’ordre 2 il faut qu’elle soit consistante et que \(\xi(2)=1\),
- au moins d’ordre 3 il faut qu’elle soit au moins d’ordre 2 et que \(\xi(3)=1\),
- au moins d’ordre 4 il faut qu’elle soit au moins d’ordre 2 et que \(\xi(4)=1\).
Code
q = 2
omega = 3
def xi(i, q):
sa = sum((-j)**i * aa[j] for j in range(q))
sb = b_m1 + sum((-j)**(i-1) * bb[j] for j in range(1, q))
if i == 1:
sb += bb[0]
return (sa).factor() + (i * sb).factor()
def coeff(cas,q):
if CAS_GENERAL:
aa = sympy.symbols(f'a_0:{</span>q<span class="sc">}')
bb = sympy.symbols(f'b_0:{</span>q<span class="sc">}')
b_m1 = sympy.Symbol('b_{-1}')
else : # cas particulier
α = sympy.Symbol('α')
ϑ = sympy.Symbol('ϑ')
aa = [α, 1-α]
bb = [-3*ϑ/2, ϑ/2]
b_m1 = 2
return aa, bb, b_m1
display(Markdown(f"Les conditions de consistance d'ordre {</span>omega<span class="sc">} sont :"))
CAS_GENERAL = True
aa, bb, b_m1 = coeff(CAS_GENERAL, q)
systeme = [sympy.Eq(xi(i, q),1) for i in range(omega)]
display(Markdown(r"$\begin{cases}"+' '.join([r"\xi("+str(i)+")="+sympy.latex(s)+r"\\" for i,s in enumerate(systeme)]) + r"\end{cases}$"))
display(Markdown(r"Ce qui donne le système suivant :"))
CAS_GENERAL = False
aa, bb, b_m1 = coeff(CAS_GENERAL, q)
systeme = [sympy.Eq(xi(i, q),1) for i in range(omega)]
display(Markdown(r"$\begin{cases}"+' '.join([sympy.latex(s)+r"\\" for s in systeme]) + r"\end{cases}$"))
display(Markdown(r"La solution est :"))
sol = sympy.solve(systeme)
display(sol)Les conditions de consistance d’ordre 3 sont :
\(\begin{cases}\xi(0)=a_{0} + a_{1} = 1\\ \xi(1)=- a_{1} + b_{0} + b_{1} + b_{-1} = 1\\ \xi(2)=a_{1} - 2 \left(b_{1} - b_{-1}\right) = 1\\\end{cases}\)
Ce qui donne le système suivant :
\(\begin{cases}\text{True}\\ α - ϑ + 1 = 1\\ - α - ϑ + 5 = 1\\\end{cases}\)
La solution est :
\(\displaystyle \left\{ α : 2, \ ϑ : 2\right\}\)
Dans notre cas
- la méthode est consistante ssi \(\vartheta=\alpha\) car \(a_0+a_1=\alpha+(1-\alpha)=1\) et \(-a_1+b_0+b_1+b_{-1}=-(1-\alpha)-\frac{3\vartheta}{2}+\frac{\vartheta}{2}+2=\alpha-\vartheta+1\);
- pour que la méthode sois d’ordre au moins 2 il faudrait avoir \(1= a_1-2(b_1-b_{-1})=1-\alpha-2(\frac{\alpha}{2}-2)=5-2\alpha\) ce qui n’est pas compatible avec la condition de zéro-stabilité.
Conclusion: si \(0\le\alpha=\vartheta<1\) le schéma est convergent à l’ordre 1, dans les autres cas il n’est pas convergente.
Q3 [3 points]
Nous allons maintenant fixer \(\alpha\). Pour cela, écrivez votre nom et prénom dans la cellule ci-dessous et vous obtiendrez un choix pour le paramètre \(\alpha\). Pour \(\vartheta\), choisir une valeur qui garantie la convergence.Vérifier empiriquement l’ordre de convergence sur le problème de Cauchy
\( \begin{cases} y'(t) = t^2-y(t), &\forall t \in I=[0,1],\\ y(0) = 2, \end{cases} \)
Code
\(\displaystyle \mathtt{\text{α =}}\frac{5}{8}\)
- Pour estimer les erreurs on définit la solution exacte (calculée en utilisant le module
sympyou à la main).
- On calcule la solution approchée pour différentes valeurs de \(N\). Pour le calcul de l’ordre de convergence on initialise la suite avec la solution exacte.
Code
# variables globales
t0 = 0
tfinal = 1
y0 = 2
phi = lambda t,y: t**2-y
##############################################
# solution exacte
##############################################
t = sympy.Symbol('t')
y = sympy.Function('y')
edo = sympy.Eq( sympy.diff(y(t),t) , phi(t,y(t)) )
solpar = sympy.dsolve(edo, ics={y(t0):y0}).simplify()
display(solpar)
sol_exacte = sympy.lambdify(t,solpar.rhs,'numpy')
##############################################
# schéma (initialisation avec sol exacte pour ordre de convergence)
##############################################
def multipas(phi, tt, sol_exacte):
h = tt[1] - tt[0]
uu = np.zeros_like(tt)
uu[:q] = sol_exacte(tt[:q])
for n in range(q-1,len(tt) - 1):
eq = lambda x : -x+my_alpha*uu[n]+(1-my_alpha)*uu[n-1]+h*(2*phi(tt[n+1],x)-3*my_alpha/2*phi(tt[n],uu[n])+my_alpha/2*phi(tt[n-1],uu[n-1]))
temp = fsolve( eq ,uu[n])
uu[n+1] = temp[0]
return uu
##############################################
# ordre
##############################################
H = []
err = []
N = 50
plt.figure(figsize=(16,5))
ax1 = plt.subplot(1,2,1)
ax2 = plt.subplot(1,2,2)
for k in range(4):
N += 20
tt = np.linspace(t0, tfinal, N + 1)
H.append( tt[1] - tt[0] )
yy = sol_exacte(tt)
uu = multipas(phi, tt, sol_exacte)
err.append( np.linalg.norm(uu-yy,np.inf) )
ax1.plot(tt,uu,label=f'Approchée avec N={</span>N<span class="sc">}')
ax1.plot(tt,yy,label='Exacte')
ax1.set_xlabel('$t$')
ax1.set_ylabel('$y$')
ax1.grid(True)
ax1.legend()
ax2.loglog( H, err, 'r-o')
ax2.set_xlabel('$h$')
ax2.set_ylabel('$e$')
ax2.set_title(f'Multipas ordre = {</span>np<span class="sc">.</span>polyfit(np.log(H),np.log(err),<span class="dv">1</span>)[<span class="dv">0</span>]<span class="sc">:1.2f}')
ax2.grid(True)\(\displaystyle y{\left(t \right)} = t^{2} - 2 t + 2\)

2 Exercice 2 : étude d’un système
Soit le problème de Cauchy \(\begin{cases} y'(t)=\eta z(t),\\ z'(t)=y(t)+\eta z(t),\\ y(0)=1,\\ z(0)=1. \end{cases}\)
Pour fixer \(\eta\), écrivez votre nom et prénom dans la cellule ci-dessous et vous obtiendrez un choix pour ce paramètre. Cela fixera aussi le nombre de points \(N\).
Code
%reset -f
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import fsolve
import sympy
sympy.init_printing()
from IPython.display import display, Math, Markdown
prlat= lambda *args: display(Math(''.join( sympy.latex(arg) for arg in args )))
nom = "Faccanoni"
prenom = "Gloria"
L = list(range(-5,0))
idx = sum([ord(c) for c in nom+prenom])%len(L)
eta = L[idx]
display(Math(r'\eta='+sympy.latex(eta)))
N = -15*eta
print(f'{</span>N <span class="op">=</span> <span class="sc">}')\(\displaystyle \eta=-1\)
N = 15
Q1 [1 point]
Calculer la solution exacte.
Calculons la solution exacte avec sympy par exemple:
Code
t = sympy.Symbol('t')
y = sympy.Function('y')
z = sympy.Function('z')
phi1 = lambda t,y,z : eta*z
phi2 = lambda t,y,z : y+eta*z
edo1 = sympy.Eq( sympy.diff(y(t),t) , phi1(t,y(t),z(t)) )
edo2 = sympy.Eq( sympy.diff(z(t),t) , phi2(t,y(t),z(t)) )
# display(edo1)
# display(edo2)
solpar_1, solpar_2 = sympy.dsolve([edo1,edo2],[y(t),z(t)], ics={y(t0):y0, z(t0):z0})
display(solpar_1,solpar_2)\(\displaystyle y{\left(t \right)} = - \frac{\sqrt{3} e^{- \frac{t}{2}} \sin{\left(\frac{\sqrt{3} t}{2} \right)}}{3} + e^{- \frac{t}{2}} \cos{\left(\frac{\sqrt{3} t}{2} \right)}\)
\(\displaystyle z{\left(t \right)} = \frac{\sqrt{3} e^{- \frac{t}{2}} \sin{\left(\frac{\sqrt{3} t}{2} \right)}}{3} + e^{- \frac{t}{2}} \cos{\left(\frac{\sqrt{3} t}{2} \right)}\)
On remarque que \(y(t)\xrightarrow[t\to+\infty]{}0\) et \(z(t)\xrightarrow[t\to+\infty]{}0\)
Code
func_1 = sympy.lambdify(t,solpar_1.rhs,'numpy')
func_2 = sympy.lambdify(t,solpar_2.rhs,'numpy')
tt = np.linspace(t0,tfinal,N+1)
h = tt[1]-tt[0]
plt.figure(figsize=(12,5))
yy = func_1(tt)
zz = func_2(tt)
plt.subplot(1,2,1)
plt.plot(tt,yy,'-*',tt,zz,'-*')
plt.legend([r'$t\mapsto y(t)$',r'$t\mapsto z(t)$'])
plt.subplot(1,2,2)
plt.plot(yy,zz,'-*')
plt.xlabel(r'$y$')
plt.ylabel(r'$z$')
plt.axis('equal');
Dans la suite on notera \(u_n\approx y(t_n)\) et \(w_n\approx z(t_n)\).
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 et pour finir une chaîne de caractères s qui contient le nom du schéma.
NOTA BENE : on a juste fixé le nombre de points mais nous n’avons pas fixé la taille du domaine. On regardera la solution exacte pour choisir un \(T\) final significatif.
Code
def affichage(tt,yy,zz,uu,ww,s):
plt.figure(figsize=(12,5))
plt.subplot(1,2,1)
plt.plot(tt,uu,'o--',tt,ww,'d--')
plt.plot(tt,yy,tt,zz)
plt.xlabel('t')
plt.legend([r'$u(t)$ approchée',r'$w(t)$ approchée','$y(t)$ exacte','$z(t)$ exacte'])
plt.title(f'{</span>s<span class="sc">} - y(t) et z(t)')
plt.grid()
plt.subplot(1,2,2)
plt.plot(uu,ww,'o--')
plt.plot(yy,zz)
plt.xlabel('y')
plt.ylabel('z')
plt.legend(['Approchée','Exacte'])
plt.title(f'{</span>s<span class="sc">} - z(y)')
plt.grid()
plt.axis('equal');Q2 [3 points]
Calculer la solution approchée obtenue par la méthode d’Euler modifié.
Afficher \(t\mapsto y(t)\), \(t\mapsto z(t)\) et \(y\mapsto z(y)\) en comparant solution exacte et solution approchée.
\( \text{(EM) } \begin{cases} u_0=1,\\ w_0=0,\\ \tilde u=u_n+\frac{h}{2}\varphi_1(t_n,u_n,w_n),\\ \tilde w=w_n+\frac{h}{2}\varphi_2(t_n,u_n,w_n),\\ u_{n+1}=u_n+h\varphi_1\left(t_n+\frac{h}{2},\tilde u,\tilde w\right),\\ w_{n+1}=w_n+h\varphi_2\left(t_n+\frac{h}{2},\tilde u,\tilde w\right). \end{cases} \)
Code
# x0, y0, h variables globales
def EM(phi1,phi2,tt):
uu, ww = np.zeros_like(tt), np.zeros_like(tt)
uu[0], ww[0] = y0, z0
for n in range(len(tt)-1):
uu_tmp = uu[n]+h/2*phi1(tt[n],uu[n],ww[n])
ww_tmp = ww[n]+h/2*phi2(tt[n],uu[n],ww[n])
uu[n+1] = uu[n]+h*phi1(tt[n]+h/2,uu_tmp,ww_tmp)
ww[n+1] = ww[n]+h*phi2(tt[n]+h/2,uu_tmp,ww_tmp)
return [uu,ww]
[uu, ww] = EM(phi1,phi2,tt)
affichage(tt,yy,zz,uu,ww,"Euler modifié")
Q3 [3 points]
Calculer la solution approchée obtenue par la méthode de Crank-Nicolson.
Afficher \(t\mapsto y(t)\), \(t\mapsto z(t)\) et \(y\mapsto z(y)\) en comparant solution exacte et solution approchée.
\( \text{(CN) } \begin{cases} u_0=1,\\ w_0=0,\\ u_{n+1}=u_n+\frac{h}{2}\left(\varphi_1(t_{n+1},u_{n+1},w_{n+1})+\varphi_1(t_{n},u_{n},w_{n})\right),\\ w_{n+1}=w_n+\frac{h}{2}\left(\varphi_2(t_{n+1},u_{n+1},w_{n+1})+\varphi_2(t_{n},u_{n},w_{n})\right). \end{cases} \)
Code
from scipy.optimize import fsolve
# x0,y0, h variables globales
def CN(phi1,phi2,tt):
uu, ww = np.zeros_like(tt), np.zeros_like(tt)
uu[0], ww[0] = y0, z0
for n in range(len(tt)-1):
sys = lambda z : [ -z[0]+uu[n]+h/2*phi1(tt[n],uu[n],ww[n])+h/2*phi1(tt[n+1],z[0],z[1]) , -z[1]+ww[n]+h/2*phi2(tt[n],uu[n],ww[n])+h/2*phi2(tt[n+1],z[0],z[1]) ]
uu[n+1], ww[n+1] = fsolve( sys , (uu[n],ww[n]) )
return [uu,ww]
[uu, ww] = CN(phi1,phi2,tt)
affichage(tt,yy,zz,uu,ww,"Crank Nicolson")
Dans ce cas particulier il est possible d’expliciter cette récurrence en exploitant la linéarité des \(\varphi_1\) et \(\varphi_2\): \( \text{(CN) } \begin{cases} u_0=1,\\ w_0=0,\\ u_{n+1}=u_n+\frac{h}{2}\eta \left(w_{n+1}+w_{n}\right),\\ w_{n+1}=w_n+\frac{h}{2}\left(u_{n+1}+ u_{n}\right)+\frac{h}{2}\eta\left(w_{n+1}+\eta w_{n}\right) \end{cases} \) ce qui donne le schéma explicite calculé ci-dessous par sympy:
Code
t_n = sympy.Symbol('t_n')
dt = sympy.Symbol('h')
t_np1 = t_n+dt
u_n = sympy.Symbol(r'u_{n}')
u_np1 = sympy.Symbol(r'u_{n+1}')
w_n = sympy.Symbol(r'w_{n}')
w_np1 = sympy.Symbol(r'w_{n+1}')
Eq1 = sympy.Eq (u_np1, u_n+dt/2*(phi1(t_n,u_n,w_n)+phi1(t_np1,u_np1,w_np1)) )
Eq2 = sympy.Eq (w_np1, w_n+dt/2*(phi2(t_n,u_n,w_n)+phi2(t_np1,u_np1,w_np1)) )
# prlat(Eq1)
# prlat(Eq2)
sol = sympy.solve([Eq1,Eq2],(u_np1,w_np1))
prlat(u_np1,"=",sol[u_np1].factor(u_n))
prlat(w_np1,"=",sol[w_np1].factor(w_n))\(\displaystyle u_{n+1}\mathtt{\text{=}}- \frac{4 h w_{n} + u_{n} \left(h^{2} - 2 h - 4\right)}{h^{2} + 2 h + 4}\)
\(\displaystyle w_{n+1}\mathtt{\text{=}}- \frac{- 4 h u_{n} + w_{n} \left(h^{2} + 2 h - 4\right)}{h^{2} + 2 h + 4}\)
Code
# x0,y0, h variables globales
def CN(tt):
uu, ww = np.zeros_like(tt), np.zeros_like(tt)
uu[0], ww[0] = y0, z0
for n in range(len(tt)-1):
uu[n+1] = -((h**2-2*h-4)*uu[n]+4*h*ww[n])/(h**2+2*h+4)
ww[n+1] = -((h**2+2*h-4)*ww[n]-4*h*uu[n])/(h**2+2*h+4)
return [uu,ww]
[uu, ww] = CN(tt)
affichage(tt,yy,zz,uu,ww,"Crank Nicolson")
Q5 [1 point]
Calculer la solution approchée obtenue par la fonctionodeintdu modulescipy.
Afficher \(t\mapsto y(t)\), \(t\mapsto z(t)\) et \(y\mapsto z(y)\) en comparant solution exacte et solution approchée.
3 Exercice 3 : étude de la A-stabilité d’un schéma
Soit le schéma
\(\begin{cases} u_0=y(t_0)=y_0,\\ \tilde u_{n+1/2}=u_n+\frac{h}{4}\left(\varphi(t_{n},u_{n})+\varphi(t_{n}+\frac{h}{2},\tilde u_{n+1/2})\right),\\ u_{n+1}=u_n+h \varphi\left(t_n+\frac{h}{2},\tilde u_{n+1/2}\right)& n=0,1,2,\dots N-1 \end{cases}\)
- Étudier théoriquement la A-stabilité du schéma.
- Approcher la solution du problème de Cauchy suivant avec le schéma donné d’abord avec 120 points puis avec 130 points. Commenter le résultat.
\(\begin{cases} y'(t)=-50y(t), &t\in[0;10]\\ y(0)=1 \end{cases}\)
Q1 [3 points] Étudier théoriquement la A-stabilité du schéma.
Soit \(\beta>0\) un nombre réel positif et considérons le problème de Cauchy \(y'(t)=-\beta y(t)\) pour \(t>0\) avec \(y(0)=1\). Sa solution est \(y(t)=e^{-\beta t}\) donc \(\lim\limits_{t\to+\infty}|y(t)|=0\).
Le schéma appliqué à ce problème de Cauchy s’écrit
\( \begin{cases} u_0=y(t_0)=y_0,\\ \tilde u_{n+1/2}=u_n-\frac{\beta h}{4}u_{n}-\frac{\beta h}{4}\tilde u_{n+1/2},\\ u_{n+1}=u_n-\beta h \tilde u_{n+1/2}& n=0,1,2,\dots N-1 \end{cases} \)
d’où
\( u_{n+1} = \left( 1-\beta h\frac{4-\beta h}{4+\beta h} \right)u_n \)
Vérifions ces calculs:
Code
# pour ne pas effacer l'affectation de "h", ici je vais l'appeler "dt" mais afficher "h"
dt = sym.Symbol('h')
beta = sym.Symbol(r'\beta')
u_np1 = sym.Symbol(r'u_{n+1}')
sym.var('u_n,x')
u_tilde = sym.solve (-x + u_n - beta*dt/4*u_n-beta*dt/4*x, x)[0]
display(Math(r'\tilde u='+sym.latex(u_tilde)))
u_np1 = (u_n-beta*dt*u_tilde).factor()
display(Math('u_{n+1}='+sym.latex(u_np1)))\(\displaystyle \tilde u=\frac{u_{n} \left(- \beta h + 4\right)}{\beta h + 4}\)
\(\displaystyle u_{n+1}=\frac{u_{n} \left(\beta^{2} h^{2} - 3 \beta h + 4\right)}{\beta h + 4}\)
On note \(x=\beta h\). Le schéma est A-stable ssi \(|q(x)|<1\). On étudie alors la fonction \(q\colon \mathbb{R}^+\to\mathbb{R}\) définie par \(q(x)=\dfrac{x^2-3x+4}{4+x}\).
Code
sym.var('x',nonnegative=True)
display(Markdown(r'Dans $\mathbb{R}^+$ on étudie la fonction'))
q = (x**2-3*x+4)/(x+4)
display(Math('q(x)='+sym.latex(q)))
display(Markdown('Limites aux bornes du domaine de definition:'))
display(Math('q(0)='+sym.latex(q.subs(x,0))))
lim=sym.Limit(q,x,sym.oo)
display(Math(sym.latex(lim)+'='+sym.latex(lim.doit())))
display(Markdown(r'On cherche les points stationnaires dans $\mathbb{R}^+$ :'))
dq=(q.diff(x)).factor()
display(Math("q'(x)="+sym.latex(dq)))
display(Markdown("On remarque que le numerateur de q' est une parabole et on a"))
sol=sym.solve(dq)
display(Math("q'(x)=0 \iff x\in"+sym.latex(sol)))
display(Markdown("De plus $q'(x)>0$ ssi $x$ est supérieur à cette valeur, donc"))
minimum=sol[0]
display(Math("x="+sym.latex(minimum)+"\\text{ est un minimum et}"))
qmin=q.subs(x,sol[0])
display(Math("q("+sym.latex(minimum)+")="+sym.latex(qmin)+"="+str(float(qmin))+">0"))
display(Markdown("Donc $q(x)>0$ pour tout $x$."))
display(Markdown("De plus, on a $q(x)<1$ ssi"))
display(sym.solve(q<1))
display(Markdown("Conclusion: $-1<q(x)<1$ pour tout $x<4$."))
sym.plot(q,1,-1,xlim=[-1,15],ylim=[-1.5,1.5]);Dans \(\mathbb{R}^+\) on étudie la fonction
\(\displaystyle q(x)=\frac{x^{2} - 3 x + 4}{x + 4}\)
Limites aux bornes du domaine de definition:
\(\displaystyle q(0)=1\)
\(\displaystyle \lim_{x \to \infty}\left(\frac{x^{2} - 3 x + 4}{x + 4}\right)=\infty\)
On cherche les points stationnaires dans \(\mathbb{R}^+\) :
\(\displaystyle q'(x)=\frac{x^{2} + 8 x - 16}{\left(x + 4\right)^{2}}\)
On remarque que le numerateur de q’ est une parabole et on a
\(\displaystyle q'(x)=0 \iff x\in\left[ -4 + 4 \sqrt{2}\right]\)
De plus \(q'(x)>0\) ssi \(x\) est supérieur à cette valeur, donc
\(\displaystyle x=-4 + 4 \sqrt{2}\text{ est un minimum et}\)
\(\displaystyle q(-4 + 4 \sqrt{2})=\frac{\sqrt{2} \left(- 12 \sqrt{2} + \left(-4 + 4 \sqrt{2}\right)^{2} + 16\right)}{8}=0.3137084989847604>0\)
Donc \(q(x)>0\) pour tout \(x\).
De plus, on a \(q(x)<1\) ssi
\(\displaystyle 0 < x \wedge x < 4\)
Conclusion: \(-1<q(x)<1\) pour tout \(x<4\).

Q2 [2 points] Approcher la solution du problème de Cauchy suivant avec le schéma donné d’abord avec 120 points puis avec 130 points. Commenter le résultat. \(\begin{cases} y'(t)=-50y(t), &t\in[0;10]\\ y(0)=1 \end{cases}\)
Pour la A-stabilité il faut que \(h=\frac{10-0}{N}\) soit \(<\frac{4}{\beta}\) donc \(N>\frac{(10-0)\beta}{4}=\frac{10\times50}{4}=125\). De plus, le problème est stiff.
Code
def schema(tt,phi,y0):
uu = np.zeros_like(tt)
uu[0] = y0
h = tt[1]-tt[0]
for n in range(len(tt)-1):
u_tilde = fsolve ( lambda x : -x+uu[n]+h/4*phi(tt[n],uu[n])+h/4*phi(tt[n+1],x) , uu[n] )[0]
uu[n+1] = uu[n]+h*phi(tt[n]+h/2,u_tilde)
return uu
t0, y0, tfinal = 0, 1, 10
beta = 50
phi = lambda t,y : -beta*y
sol_exacte = lambda t : np.exp(-beta*t)
fig, ax = plt.subplots(nrows=1, ncols=2,figsize=(12,5))
for i,N in enumerate([120, 130]) :
tt = np.linspace(t0,tfinal,N+1)
h = tt[1]-tt[0]
yy = sol_exacte(tt)
uu = schema(tt,phi,y0)
ax[i].plot(tt,yy,'b-',label=("Exacte"))
ax[i].plot(tt,uu,'ro',label=("RK"))
ax[i].set_title(rf' $\beta h$={</span>beta<span class="op">*</span>h<span class="sc">:g}')
ax[i].set_xlabel('$t$')
ax[i].set_ylabel('$u$')
ax[i].legend()
ax[i].grid(True);
Code
H = []
err = []
N = 130
for k in range(7):
N += 100
tt = np.linspace(t0, tfinal, N + 1)
h = tt[1] - tt[0]
yy = sol_exacte(tt)
uu = schema(tt,phi,y0)
H.append(h)
err.append(np.linalg.norm(uu-yy,np.inf))
omega = np.polyfit(np.log(H),np.log(err), 1)[0]
plt.figure(figsize=(8,5));
plt.plot(np.log(H), np.log(err), 'c-o')
plt.xlabel('$\ln(h)$')
plt.ylabel('$\ln(e)$')
plt.title(rf'Ordre $\omega$={</span>omega<span class="sc">:1.2f}')
plt.grid(True);
