Introduction à Scilab pour le Calcul Scientifique

Alexandre Ern
(last modification date: October 10, 2017)
Version pdf de ce document
Version sans bandeaux

1 Introduction
2 Premier script Scilab : programmer un schéma
3 Deuxième script Scilab : variations sur la condition initiale et le schéma numérique
4 Troisième script Scilab : animation graphique
5 Quatrième script Scilab : un schéma avec inversion matricielle

Contents

1 Introduction
2 Premier script Scilab : programmer un schéma
3 Deuxième script Scilab : variations sur la condition initiale et le schéma numérique
4 Troisième script Scilab : animation graphique
5 Quatrième script Scilab : un schéma avec inversion matricielle

1 Introduction

On considère le problème modèle

(
{  ∂u-         ∂u-
   ∂t (x,t) + a ∂x(x, t) = 0,  x ∈ ℝ,t ≥ 0,
(
   u(x,0) = u0(x),   x ∈ ℝ.
(1)

L’inconnue est la fonction u qui dépend de la coordonnée spatiale x et du temps t. Les données du problème sont la fonction u0 appelée condition initiale et le paramètre réel a appelé vitesse d’advection. On vérifie aisément que la solution de (1) est

u(x,t) = u0(x − at).
(2)

Une interprétation physique de l’équation (1) est la suivante : on considère un fleuve rectiligne représenté par la droite réelle et qui s’écoule à la vitesse a. La quantité u(x,t) représente la concentration au point x et à l’instant t d’un produit polluant qui a été déversé accidentellement dans la fleuve à t = 0 selon le profil u0. Le polluant est transporté par l’écoulement et à un temps t fixé, la fonction x↦→u(x,t) modélise la répartition de polluant le long du fleuve.

Pour simplifier, nous allons supposer que la donnée initiale u0 est périodique (en espace) de période L si bien que nous pouvons nous restreindre à l’intervalle x [0,L] et chercher la solution u satisfaisant

(
|{  ∂∂ut(x,t) + a∂∂ux(x,t) = 0,  x ∈ [0,L ],t ≥ 0,
   u(x,0) = u (x),   x ∈ [0,L ],
|(            0
   u(L,t) = u(0,t),  t ≥ 0.
(3)

La dernière équation est une condition limite de périodicité.

Afin d’approcher numériquement la solution u, on se donne

Notre objectif est d’évaluer des quantités Uin, 1 i N et n 0, telles que

U ni ≃ u (xi,tn).
L’idée est d’approcher les dérivées partielles dans (3) à l’aide de développements de Taylor et d’écrire par exemple
{   n+1        n     ∂u    n
  U i    ≃   Ui +  δt∂t(xi,t),
  U n    ≃   U n+  δx∂u(x ,tn).
    i+1       i      ∂x  i
On obtient
Uin+1−--Uni-    Uin−-U-ni−-1
    δt     + a     δx    =  0.
(4)

En réarrangeant (4), il vient

  n+1     n      n     n
Ui   =  Ui − ν (Ui − U i− 1),
(5)

où nous avons posé

     aδt
ν =  δx-.
(6)

Ce paramètre, sans dimension physique et connu sous le nom de nombre de Courant, jouera un rôle déterminant par la suite.

L’équation (5) définit un schéma numérique qu’on appelera schéma upwind (la terminologie, inspirée de l’anglais, rappelle le fait que la dérivée en espace a été décalée dans la direction d’où provient le vent (ou le courant)). Notons que (5) est un schéma explicite : étant données les valeurs de Uin pour 0 i N, (5) permet de calculer explicitement les valeurs de U in+1 pour 0 i N. La simulation numérique s’arrête lorsque le temps courant tn dépasse un temps physique de simulation choisi à l’avance.

Il nous reste à approcher la condition initiale et la condition limite en écrivant

{
   U 0= u  (x),   0 ≤ i ≤ N,
    in    0n  i
   U1 =  UN ,  n ≥ 0.

2 Premier script Scilab : programmer un schéma

On écrira un script Scilab qu’on appelera script1.sce et qui comprendra 4 parties :

  1. initialisation des paramètres physiques : vitesse de propagation, longueur du domaine de calcul, temps maximum de simulation et condition initiale. Pour cette dernière, on prendra une fonction en créneau
             {
          1   si 1 < x < 1.5,
u0(x) =   0   sinon.
    (7)

  2. initialisation des paramètres numériques; on choisira N = 201 et on en déduira δx puis on choisira le nombre de Courant ν = 0.8 et on en déduira le pas de temps δt.
  3. boucle en temps; initialiser (Ui0) 0iN puis évaluer (Uin+1) 0iN en fonction de (Uin) 0iN tant que tn T.
  4. visualisation graphique des résultats; afficher sur une même fenêtre la solution exacte et la solution approchée.

Conseils Scilab.

Question 1 Augmenter progressivement le paramètre ν et observer les résultats. Quelle est la valeur critique?

3 Deuxième script Scilab : variations sur la condition initiale et le schéma numérique

Outre la condition initiale (7), on souhaite également pouvoir considérer la condition initiale

u (x) = sin (8πx∕L ).
 0
(8)

De plus, on souhaite avoir le choix entre 2 schémas numériques : le schéma upwind (5) et le schéma de Lax-Wendroff

  n+1     n   ν-  n      n      ν2-  n       n    n
U i   = U i − 2 (Ui+1 − Ui−1) + 2 (Ui+1 − 2U i + Ui−1),
(9)

dont la justification sera étudiée en cours de Calcul Scientifique.

Ecrire un script Scilab qu’on appelera script2.sce et qui offre ces 2 options.

Conseils Scilab.

Question 2 Repartir de ν = 0.8 et essayer les 4 possibilités du couple condition initiale / schéma numérique. Quelles conclusions tirez-vous ? Augmenter progressivement ν pour le schéma de Lax-Wendroff et observer.

4 Troisième script Scilab : animation graphique

L’objectif de cette nouvelle étape est de pouvoir visualer la solution numérique au fil des itérations au lieu de visualiser uniquement sa valeur finale.

Partant du script script2.sce, on réalisera un nouveau script qu’on appelera script3.sce.

Conseils Scilab.

Question 3 Reprendre les essais précédents puis augmenter progressivement le paramètre ν et observer (pour le schéma de Lax-Wendroff, prendre ν = 1.2, ν = 1.5 et ν = 1.8). Quelles conclusions en tirer?

5 Quatrième script Scilab : un schéma avec inversion matricielle

Nous allons modifier le schéma de Lax-Wendroff (9) en “implicitant le terme de diffusion” de la façon suivante

  n+1     n   ν-  n      n     ν2-  n+1      n+1     n+1
Ui   =  Ui −  2(U i+1 − U i−1) +  2 (U i+1  − 2U i   + Ui−1 ).
(10)

En introduisant les vecteurs Wn = (U in ν
2(Ui+1n U i1n)) 0iN1 et Un+1 = (U in+1) 0iN1 ainsi que la matrice A d’ordre N 1 donnée par

     ( 1 + ν2  − ν2-  0   ...   0    − ν2 )
     |     2     2                     2 |
     |  − ν2-   ...   ...               0  |
     ||         ..    ..   ..           ..  ||
A =  ||   0       .    .    .          .  ||
     |   ...           ...  ...  ...     0  |
     ||                   .    .        2 ||
     (   0                ..   ..   − ν2 )
        − ν2    0   ...   0  − ν2  1 + ν2
          2                     2
le schéma (10) s’écrit sous la forme
AU n+1 = W  n.
La condition de périodicité est utilisée directement dans le schéma numérique afin d’éliminer UNn. La taille des vecteurs est donc N 1 et non plus N comme dans les sections précédentes. Ce choix a été fait pour simplifier la structure de la matrice A.

On constate que le schéma (10) n’est plus explicite mais implicite : si Un est connu, l’évaluation de Un+1 nécessite l’inversion d’un système linéaire. On s’attend donc à ce que le coût d’une itération dans (10) soit plus élevé que dans (9). Cependant, comme nous le verrons dans les expériences numériques, le schéma implicite (10) n’est pas limité par la valeur du nombre de Courant ν ce qui permet de considérer des pas de temps plus grands et donc de réaliser moins d’itérations en temps. Il n’est donc pas évident de déterminer a priori qui du schéma explicite ou implicite sera le plus performant.

Afin de réaliser les expériences numériques, on partira du script script3.sce dont on enlevera les parties relatives au schéma numérique. Le nouveau script sera appelé script4.sce.

Conseils Scilab.

Question 4 Comparer les 2 options pour l’inversion du système linéaire. Réaliser des expériences numériques en faisant varier le nombre de Courant. Discuter des performances relatives des schémas explicite et implicite.