Sous-sections

1.6 Validation avec Matlab

Pour valider les analyses précédentes, nous allons utiliser Matlab pour simuler les problèmes \bgroup\color{black}$ (P_{1})$\egroup et \bgroup\color{black}$ (P_{2})$\egroup .

1.6.1 Simulation du problème \bgroup\color{black}$ (P_{1})$\egroup

La fonction Matlab expliciteP1, donnée dans le programme 1.6.1, calcule l'erreur \bgroup\color{black}$ max(\vert u_{e}-u_{i}^{n}\vert)$\egroup au temps \bgroup\color{black}$ t=t_{0}$\egroup entre la solution exacte \bgroup\color{black}$ u_{e}(x,t)$\egroup et la solution numérique \bgroup\color{black}$ u_{i}^{n}$\egroup calculée avec \bgroup\color{black}$ N$\egroup intervalles, un paramètre \bgroup\color{black}$ r$\egroup fixé, et pour une condition initiale modale:

\bgroup\color{black}$\displaystyle C(x)=\sin\frac{m\pi}{L}x$\egroup

La programmation Matlab est très simple. Avec Matlab, les vecteurs ont un indice qui commence à 1. La solution est donc stockée dans un vecteur \bgroup\color{black}$ U=[U(1),U(2),...U(N+1)]$\egroup de dimension \bgroup\color{black}$ N+1$\egroup . On effectue une boucle en temps (ligne 16 à 20), pour calculer la solution \bgroup\color{black}$ u_{i}^{n}$\egroup . En utilisant les notations matricielles de Matlab, la solution aux noeuds internes \bgroup\color{black}$ i=2,N-1$\egroup s'écrit (ligne 18):

\bgroup\color{black}$\displaystyle U(2:N-1)=(1-2*r)*U(2:N-1)+r*(U(1:N-2)+U(3:N+1))$\egroup

Dans cette expression, à droite du signe =, \bgroup\color{black}$ U$\egroup représente le vecteur solution connu à l'instant \bgroup\color{black}$ t-dt$\egroup . La nouvelle valeur de \bgroup\color{black}$ U$\egroup ( à gauche du signe =) représente la nouvelle solution calculée à l'instant \bgroup\color{black}$ t$\egroup .


programme Matlab 1.6.1: Calcul de la solution numérique explicite du problème ( \bgroup\color{black}$ P_1$\egroup )

function [ErrMax,U]=expliciteP1(N,r,t0,m)
% schema explicite pble P1
% calcul la solution U et l'erreur ErrMax
% a t=t0 sur N points
% pour une valeur du parametre r fixe
% pour une condition initiale sin(m*Pi*X)
% parametres
L=1;
h=1.0/N; dt=r*h^2; Ndt=round(t0/dt)
% liste des nds internes et pts du maillage
Ni=[2:N];
X=[0:h:L];
% condition initiale C
C=sin(m*pi*X);
t=0; U=C;
for it=1:Ndt
        t=t+dt;
        U(Ni)=(1-2*r)*U(Ni)+r*(U(Ni-1)+U(Ni+1));
        U(1)=0; U(N+1)=0;
end;
% calcul de l'erreur
Ue=C*exp(-m^2*pi^2*t);
ErrMax=norm(Ue-U,inf);

englishANIMATION:Calcul de la solution numérique explicite du problème ( \bgroup\color{black}$ P_1$\egroup )

On a tout d'abord tracé la solution numérique calculée à un instant \bgroup\color{black}$ t=0.014$\egroup pour \bgroup\color{black}$ m=4$\egroup , \bgroup\color{black}$ \kappa=1$\egroup , \bgroup\color{black}$ L=1$\egroup et deux valeurs de \bgroup\color{black}$ r$\egroup (figure 1.6).

Pour \bgroup\color{black}$ r=\frac{1}{2}$\egroup (figure 1.6a), la solution numérique décroit comme la solution exacte, i.e. l'amplitude de la solution numérique décroit de \bgroup\color{black}$ 0,327$\egroup , alors que la solution exacte décroit de \bgroup\color{black}$ e^{-\kappa\frac{m^{2}\pi^{2}}{L^{2}}t}\approx0,331$\egroup .

Par contre pour \bgroup\color{black}$ r=1$\egroup (figure 1.6b), la solution numérique diverge avec une apparition d'oscillations à hautes fréquences d'amplitudes croissantes, comme prévue dans la thèorie.

Figure 1.6: Solution numérique du problème $ P_{1}$ (mode $ m=4$ )
[ $ r=\frac {1}{2}$ et $ N=50$ ]\includegraphics[width=0.45\paperwidth]{CHAP1/solutionP1a}[$ r=1$ et $ N=50$ ]\includegraphics[width=0.45\paperwidth]{CHAP1/solutionP1b}

Pour les mêmes paramêtres , on a ensuite tracé sur la figure (1.7) l'évolution temporelle de la valeur maximale de la solution numérique calculée pour différentes valeurs du pas en temps \bgroup\color{black}$ dt$\egroup et pour deux maillages \bgroup\color{black}$ N=50$\egroup et \bgroup\color{black}$ N=100$\egroup . On les a comparé à la valeur de exacte déduite de (1.18):

\bgroup\color{black}$\displaystyle U_{max}=e^{-\kappa\frac{m^{2}\pi^{2}}{L^{2}}t}$\egroup

Figure 1.7: Evolution temporelle de $ U_{max}$ entre $ t=0$ et $ t=\frac {4}{m^{2}\pi ^{2}}$
[N=50]\includegraphics[width=0.45\paperwidth]{CHAP1/Umax1}[N=100]\includegraphics[width=0.45\paperwidth]{CHAP1/Umax2}

Pour \bgroup\color{black}$ N=50$\egroup , on constate que la solution numérique et la solution exacte sont très proches tant que \bgroup\color{black}$ dt\leq2 10^{-4}$\egroup , et que la solution numérique diverge pour \bgroup\color{black}$ dt>2 10^{-4}$\egroup . De même pour \bgroup\color{black}$ N=100$\egroup , la solution numérique converge tant que \bgroup\color{black}$ dt\leq0,5 10^{-4}$\egroup et diverge sinon. Ces valeurs du pas en temps correspondent justement à la valeur limite de stabilité du paramêtre \bgroup\color{black}$ r$\egroup (1.36):

\bgroup\color{black}$\displaystyle \kappa\frac{\Delta t}{\Delta x^{2}}=\frac{1}{2}$\egroup

De façon à analyser la précision de la solution numérique, on a tracé sur la figure (1.8) pour \bgroup\color{black}$ m=4$\egroup et \bgroup\color{black}$ t_{0}=\frac{1}{m^{2}\pi^{2}}$\egroup , l'évolution de l'erreur \bgroup\color{black}$ max(\vert u_{e}-u_{i}^{n}\vert)$\egroup pour des valeurs de \bgroup\color{black}$ N$\egroup de 8 à 256, et différentes valeurs de \bgroup\color{black}$ r$\egroup .

Figure 1.8: Erreur du schéma explicite en fonction de $ N$ (pble $ P_{1}$ )
\includegraphics[width=0.8\paperwidth]{CHAP1/precisionP1}

On vérifie sur cette figure (1.8) la décroissance quadratique de l'erreur, à \bgroup\color{black}$ r$\egroup fixé, en fonction de \bgroup\color{black}$ N$\egroup , puisque l'erreur théorique est en \bgroup\color{black}$ O(\Delta t,\Delta x^{2})$\egroup . A \bgroup\color{black}$ r$\egroup fixé, lorsque l'on divise \bgroup\color{black}$ \Delta x$\egroup par 2, on divise \bgroup\color{black}$ \Delta t$\egroup par 4 et l'erreur est divisée d'un facteur 4. On note aussi que pour \bgroup\color{black}$ r=\frac{1}{6}$\egroup , la convergence est plus rapide car la valeur du pas en temps \bgroup\color{black}$ \Delta t$\egroup correspond au cas particulier c1eq28b pour lequel le premier terme de l'erreur de troncature est nul. L'erreur de troncature est dans ce cas en \bgroup\color{black}$ O(\Delta t^{2},\Delta x^{4})$\egroup et l'erreur décroit en \bgroup\color{black}$ O(N^{-4})$\egroup .

On constate enfin que pour \bgroup\color{black}$ r=1$\egroup , le schéma diverge, mais uniquement pour les grandes valeurs de \bgroup\color{black}$ N$\egroup . En effet pour \bgroup\color{black}$ N$\egroup grand, on effectue beaucoup plus d'itérations que pour \bgroup\color{black}$ N$\egroup petit et les erreurs d'arrondis sont suffisament amplifiées pour faire diverger la solution.

On note enfin que l'erreur diminue à \bgroup\color{black}$ N$\egroup fixé avec \bgroup\color{black}$ r$\egroup , c'est à dire avec \bgroup\color{black}$ \Delta t$\egroup (avec un cas particulier pour \bgroup\color{black}$ r=\frac{1}{6}$\egroup ).

1.6.2 Simulation du problème \bgroup\color{black}$ (P_{2})$\egroup

La discrétisation explicite du problème \bgroup\color{black}$ (P_{2})$\egroup conduit à la même équation aux différences (1.35), que pour le problème \bgroup\color{black}$ (P_{1})$\egroup . La seule différence provient de la condition aux limites en \bgroup\color{black}$ x=0$\egroup . Pour le problème \bgroup\color{black}$ (P_{2})$\egroup , la condition aux limites est une condition de symétrie: \bgroup\color{black}$ \frac{\partial u}{\partial x}=0$\egroup , que l'on doit discrétiser pour obtenir la valeur numérique \bgroup\color{black}$ u_{0}^{n+1}$\egroup au premier point du maillage. Nous étudierons deux façons d'imposer cette condition aux limites de type Neumann:

  1. discrétisation décentrée de la condition aux limites:
    on approxime la condition aux limites par un schéma aux différences décentré faisant intervenir la valeur $ u_{0}$ :

    $\displaystyle \left.\frac{\partial u}{\partial x}\right\vert _{0}^{n+1}\approx\frac{u_{1}^{n+1}-u_{0}^{n+1}}{\Delta x}$ (1.53)

    d'où l'on déduit l'équation au noeud $ i=0$

    $\displaystyle u_{0}^{n+1}=u_{1}^{n+1}$ (1.54)

  2. condition miroir:
    on utilise l'équation aux différences (1.35) au noeud $ i=0$ . Dans cette équation apparaît la valeur inconnue $ u_{-1}^{n}$ , que l'on calcule avec une condition miroir, traduction de la condition de symétrie:

    $\displaystyle \left.\frac{\partial u}{\partial x}\right\vert _{0}^{n}\approx\frac{u_{1}^{n}-u_{-1}^{n}}{2\Delta x}$ (1.55)

    ce qui conduit à $ u_{-1}^{n}=u_{1}^{n}$ et à l'équation suivante au noeud $ i=0$

    $\displaystyle u_{0}^{n+1}=u_{0}^{n}+2r\left(u_{1}^{n}-u_{0}^{n}\right)$ (1.56)

La fonction Matlab expliciteP2, donnée dans le programme 1.6.2, calcule l'erreur \bgroup\color{black}$ max(\vert u_{e}-u_{i}^{n}\vert)$\egroup au temps \bgroup\color{black}$ t=t_{0}$\egroup entre la solution exacte \bgroup\color{black}$ u_{e}(x,t)$\egroup et la solution numérique \bgroup\color{black}$ u_{i}^{n}$\egroup calculée avec \bgroup\color{black}$ N$\egroup intervalles, un paramètre \bgroup\color{black}$ r$\egroup fixé, et pour une condition initiale modale si \bgroup\color{black}$ m\ge0$\egroup :

\bgroup\color{black}$\displaystyle C(x)=\cos\frac{(2m+1)\pi}{2L}x$\egroup

ou une condition initiale d'Heaviside si \bgroup\color{black}$ m<0$\egroup (dont on a calculé une solution exacte au paragraphe c1par1):

\bgroup\color{black}$\displaystyle C(x)=Heaviside(\delta-x)$\egroup


programme Matlab 1.6.2: Calcul de la solution numérique explicite du problème ( \bgroup\color{black}$ P_2$\egroup )

function [ErrMax,U]=expliciteP2(N,r,t0,m)
% schema explicite pble P2
% calcul la solution U et l'erreur ErrMax
% a t=t0 sur N points
% pour une valeur du parametre r fixe
% pour une condition initiale cos((m+1)*Pi/2*X) si m>=0
% ou fonction porte si m<0
% parametres
L=1;
h=1.0/N; dt=r*h^2; Ndt=round(t0/dt)
% liste des nds internes et pts du maillage
Ni=[2:N];
X=[0:h:L];
% condition initiale C
if (m>=0)
   C=cos((2*m+1)*pi/2*X);
else
   % coefficient de Fourier
   delta=1/10;
   M=[0:20];
   CM=4*(sin(pi*M*delta)*cos(pi*delta/2)+...
         cos(pi*M*delta)*sin(pi*delta/2))./((2*M+1)*pi);
   C=CM*cos(pi/2*(2*M+1)'*X);
end;
t=0; U=C;
for it=1:Ndt
        t=t+dt;
	Un=U;
        U(Ni)=(1-2*r)*Un(Ni)+r*(Un(Ni-1)+Un(Ni+1));
 	% conditions aux limites
        U(1)=(1-2*r)*Un(1)+r*2*Un(2);
	U(N+1)=0;
end;
% calcul de l'erreur
if (m>=0)
   Ue=C*exp(-((2*m+1)*pi/2)^2*t);
else
   Ue=(CM.*exp(-(2*M+1).^2*pi^2/4*t))*cos(pi/2*(2*M+1)'*X);
end;
ErrMax=norm(Ue-U,inf);

La programmation Matlab est identique à celle du programme (1.6.1). On notera simplement l'utilisation de la notation matricielle pour le calcul de la solution analytique Ue (équation 1.20) aux noeuds du maillage (ligne 21 et 38) sur \bgroup\color{black}$ M$\egroup modes à l'instant \bgroup\color{black}$ t=n\Delta t$\egroup :

\bgroup\color{black}$\displaystyle U_{e}(i)=\sum_{k=0}^{M}C_{k}e^{-\frac{1}{4}\l...
...^{2}\pi^{2}n\Delta t}\cos(\frac{\left(2  k+1\right)}{2}\pi  i\Delta x)$\egroup

où les \bgroup\color{black}$ C_{k}$\egroup sont données par l'équation 1.21:

\bgroup\color{black}$\displaystyle C_{k}=4 \frac{\sin(1/10 \pi  k)\cos(1/20 \pi)+\cos(1/10 \pi  k)\sin(1/20 \pi)}{\left(2  k+1\right)\pi}$\egroup

En notant \bgroup\color{black}$ M=[0:20]$\egroup les modes utilisés pour la calcul de la solution, le tableau \bgroup\color{black}$ CM$\egroup des coefficients \bgroup\color{black}$ C_{k}$\egroup est calculé directement à la ligne 21. Le vecteur solution exacte \bgroup\color{black}$ U_{e}$\egroup aux noeuds du maillage est calculé à la ligne 38 en multipliant terme à terme le vecteur \bgroup\color{black}$ CM$\egroup par le vecteur \bgroup\color{black}$ \left[e^{-1/4 \left(2  M+1\right)^{2}\pi^{2}t}\right]$\egroup (opérateur \bgroup\color{black}$ .*$\egroup ), puis en effectuant le produit scalaire (opérateur \bgroup\color{black}$ *$\egroup ) avec le vecteur colonne \bgroup\color{black}$ \cos(\frac{\left(2  M+1\right)}{2}\pi  X)$\egroup pour effectuer la somme.

La boucle en temps correspond aux lignes 26 à 33 , et la condition aux limites en \bgroup\color{black}$ x=0$\egroup est imposée à la ligne 31 (condition miroir 1.55 dans le programme 1.6.2). Pour l'autre condition (1.53), il suffit de remplacer la ligne 31 par:

\bgroup\color{black}$\displaystyle U(1)=U(2);$\egroup

On a tracé sur la figure (1.9) la solution calculée pour \bgroup\color{black}$ N=160$\egroup et \bgroup\color{black}$ r=0.1$\egroup à différents instants ( \bgroup\color{black}$ t_{0}$\egroup est le temps caractéristique de diffusion \bgroup\color{black}$ t_{0}=\frac{1}{\kappa(\frac{\pi}{2})^{2}}$\egroup ). En comparant avec la solution exacte de la figure (1.2b), on constate que les solutions sont très proches.

Figure 1.9: Solution numérique du problème $ (P_{2})$ avec $ N=160$ et $ r=0.1$
\includegraphics[width=0.8\paperwidth]{CHAP1/solutionP2}

Pour le vérifier, on a tracé sur la figure (1.10) l'évolution de l'erreur entre la solution exacte (calculée avec 20 modes) et la solution numérique à \bgroup\color{black}$ t=\frac{t_{0}}{10}$\egroup pour des valeurs de \bgroup\color{black}$ N$\egroup de 20 à 640, différentes valeurs de \bgroup\color{black}$ r$\egroup et les deux types de prise en compte de la condition aux limites en \bgroup\color{black}$ x=0$\egroup . Avec la condition miroir (1.55), on constate que l'erreur, à \bgroup\color{black}$ r$\egroup fixé, décroit de façon quadratique en \bgroup\color{black}$ O(N^{-2})$\egroup , ce que prévoit bien la théorie du schéma explicite avec une précision en \bgroup\color{black}$ O(\Delta t,\Delta x^{2})$\egroup . Par contre si on impose la condition (1.53), l'erreur décroit linéairement en \bgroup\color{black}$ O(N^{-1})$\egroup .

Figure 1.10: Erreur du schéma explicite (pble $ P_{2}$ )
[condition miroir 1.55]\includegraphics[width=0.45\paperwidth]{CHAP1/precisionP2}[condition décentrée 1.53]\includegraphics[width=0.45\paperwidth]{CHAP1/precisionP2a}

On constate ici un point important sur la précision des schémas numériques.

La précision d'un schéma numérique dépend à la fois de la précision du schéma interne et de la précision de la discrétisation des conditions aux limites.

Avec la condition (1.53), on calcule la valeur \bgroup\color{black}$ u_{0}^{n+1}$\egroup avec une approximation d'ordre \bgroup\color{black}$ O(\Delta x)$\egroup (discrétisation décentrée), alors que avec la condition (1.55), la valeur de \bgroup\color{black}$ u_{-1}^{n}$\egroup est calculée à l'ordre \bgroup\color{black}$ O(\Delta x^{2})$\egroup (discrétisation centrée), et on conserve une approximation en \bgroup\color{black}$ O(\Delta x^{2})$\egroup pour \bgroup\color{black}$ u_{0}^{n+1}$\egroup . Donc avec une condition au limite d'ordre 1 en \bgroup\color{black}$ O(\Delta x)$\egroup , même avec un schéma interne d'ordre 2 en \bgroup\color{black}$ O(\Delta x^{2})$\egroup , la solution a une précision d'ordre 1 en \bgroup\color{black}$ O(\Delta x)$\egroup .

Figure 1.11: Solution numérique du problème $ (P_{2})$ avec $ N=160$ et $ r=0.5$
\includegraphics[clip,width=0.8\paperwidth]{CHAP1/solutionP2a}

Pour terminer cette analyse, nous avons calculé la solution numérique avec \bgroup\color{black}$ r=0.5$\egroup et \bgroup\color{black}$ N=160$\egroup pour une condition initiale \bgroup\color{black}$ C(x)=Heaviside(\delta-x)$\egroup . Le résultat est tracé sur la figure (1.11). On constate sur cette figure l'apparition d'oscillations numériques dès les premières itérations en temps, qui sont ensuite amorties au cours du temps. Ces oscillations numériques n'apparaisent que pour des valeurs de \bgroup\color{black}$ r$\egroup comprises entre \bgroup\color{black}$ \frac{1}{4}$\egroup et \bgroup\color{black}$ \frac{1}{2}$\egroup , et uniquement si la condition initiale possède des modes hautes fréquences. C'est ce que prévoit l'analyse théorique du paragraphe c1convge.

englishANIMATION:Calcul de la solution numérique explicite du problème ( \bgroup\color{black}$ P_1$\egroup )


Pr. Marc BUFFAT
marc.buffat@univ-lyon1.fr
2008-04-07