Informatique Scientifique en C++

support de cours/TD (2010-2011)

F. Hecht, I. Danaila


Semaine 2

Cours

mardi 10/01/2011 (ID) :
  • Syntaxe C++ de base : types int, float, double, char, bool ; instructions for, if, switch, etc
  • Fonctions : déclarations, valeur de retour.
  • Fonctions : passage d'argument.  Notions de pointeur et référence.
  • Définitions de tableaux : allocation dynamique de la mémoire, bibliothèque STL.
  • Manipulation de chaînes de caractères.
  • Un premier programme C++ pour le calcul scientifique : résolution d'un système linéaire à matrice tri-diagonale.
 
 
vendredi, 14/01/2011 (FH)
  • Théorème de convergence de la méthode de différences finies pour l'équation stationnaire.
  • Comment transcrire l'algorithme mathématique en algorithme informatique (gestion de la mémoire, nombre d'opérations, etc).
  • Schémas pour l'équation instationnaire (qui dépend du temps).
  • Notions de consistance et stabilité d'un schéma aux différences finies.


TD

Syntaxe C++ de base. Passage d'arguments. Un premier programme C++ pour le calcul scientifique.

Pour commencer à programmer en C++ (notions de base de C++ sous forme de fichier pdf)

Notes de cours

Rappel de quelques commandes de base Linux/Unix

Rappel :: possibilités de passage d'arguments aux fonctions

  1. par valeur       (ou copie)               : double f1(double  x)    {return x*x;}
  2. par pointeur   (on évite la copie) : double f2(double *x)   {return (*x)*(*x);}
  3. par référence (on évite la copie) : double f3(double &x)  {return x*x;};

Rappel :: possibilités de définition de tableaux

  1. tableaux de taille fixe (à utiliser avec modération) :     int N=30; double u[N];
  2. en utilisant la bibliothèque STL (#include <vector>) :   vector<double> v(100);
  3. en utilisant un entier et un pointeur (recommandé)      int N; double * u = new double[N];
  4. en utilisant la classse tableau construite en cours (à définir la semaine prochaine).

Rappel :: utilisation de la bibliothèque STL pour définir des tableaux

  • #include <vector> //en entête du programme
  • vector<double> v(n); // déclaration d'un vecteur de taille n (valeur de l'indice de 0 a n-1)
  • v[i]; //expression pour avoir l'élément  i du vecteur v
  • v.at(i); //expression pour avoir l'élément  i du vecteur v (avec vérification des limites)
  • v.size() ; // pour obtenir la taille du vecteur.
  • v.front() ; // pour obtenir le premier élément.
  • v.end() ; // pour obtenir le dernier élément.
  • v=w; // copie d'un vecteur (v a la taille de w)
  • v.resize(N1) ; // redimensionner le tableau à la taille N1.
  • v.pop_back() ; // élimine le dernier élément (la dimension devient N-1).
  • v.push_back(val) ; // rajoute un nouveau élément (de valeur val) à la fin -- la dimension devient N+1.
     


Exercice 1 (exemples de passage d'arguments aux fonctions)

  1. analyser le programme  ex_fonctions_1.cpp  qui explique le passage d'arguments aux fonctions ;  
  2. compiler et exécuter le programme ; commenter les résultats.
     

Exercice 2 (exemples d'utilisation de la STL pour travailler avec des tableaux)

  1. analyser le programme  ex_stl_utilisation.cpp  qui explique l'utilisation de la bibliothèque STL pour définir des tableaux ;  
  2. compiler et exécuter le programme ; commenter les résultats.
     

Exercice 3 (exemples de passage d'arguments en utilisant la STL)

  1. analyser le programme  ex_stl_fonctions.cpp  qui explique le passage d'arguments de type tableau (définis avec la STL) ;  
  2. compiler et exécuter le programme ; commenter les résultats.
     

Exercice 4

  1. revenir sur les programmes  test_argc.cpp et first.cpp analyser les éléments de syntaxe utilisés
    • entrée/sortie : cout 
    • les types de base : int, bool, double
    • les expressions : + - * / %  , < > <= >= == != ! , && || , = += , -=
    • les instructions :  if, for, break, continue

     

  2. remarquer l'utilisation de la bibliothèque STL pour la définition des tableaux
    #include <vector> //en entête du programme
    vector<double> v(n); // déclaration d'un vecteur de taille n (valeur de l'indice de 0 a n-1)
    v[i]; //expression pour avoir la composante i du vecteur v
    v.size() ; // pour obtenir la taille du vecteur.
    v=w; // copie d'un vecteur (v a la taille de w)
     
  3. modifier le  programme  test_argc.cpp pour afficher sur trois colonnes les valeurs [x, cos(x), sin(x)] et représenter  sur le même graphe les courbes correspondant aux deux fonctions. Utiliser la commande Gnuplot :
    plot "resultat.dat" title "cos" w l, "resultat.dat" using 1:3 title "sin" w l  

     

  4. utiliser des variables de type char* ou string pour stocker des chaînes de caractères (pour les noms des fichiers par exemple)

     

  5. créer des fonctions pour remplir les vecteurs avec des valeurs aléatoires (fonction rand()) : utiliser les différentes techniques de passage d'arguments.

Exercice 5 : résolution d'un système linéaire à matrice tridiagonale

Indication : utiliser le programme  ex_stl_fonctions.cpp comme base de départ pour écrire votre programme.

  1. Analyser l'algorithme de résolution utilisant la décomposition LU  présenté dans ce fichier pdf
  2. Ecrire une fonction C++ qui utilise cet algorithme  pour résoudre le système linéaire A*X=F,
    avec A une matrice tridiagonale (définie par trois vecteurs de taille n,  les diagonales a,b,c )
    et F le second membre (un vecteur de taille n).
     
    Le prototype de la fonction sera, par exemple,
    int     tridiag_LU    ( int n,
                                       vector<double> &  a,
                                       vector<double> &  b,
                                       vector<double> &  c,
                                       vector<double> &  F,
                                       vector<double> &  X)
     
    Attention à la correspondance des indices (en C++, les éléments d'un tableau de taille n sont indicés entre 0 et n-1) !!
     
  3. Ecrire la fonction main qui définit les vecteurs a,b,c, F,X  de taille n, suivant la procédure suivante :
    --> donner des valeurs aléatoires (entre 0 et 1) aux éléments de a et c ;
    --> corriger : a[0]=0; c[n-1]=0;
    --> calculer : b[i] = a[i]+c[i]+1,     0<= i <n;
    --> calculer : f [i] = a[i]+b[i]+c[i],  0<= i <n.
     
  4. Dans la  fonction main, appeler la fonction tridiag_LU et afficher la solution X du système linéaire.
    Quels valeurs faut-il obtenir   pour X[i] ? Pourquoi le système linéaire est inversible ?
    Imaginer d'autres cas pour tester la fonction tridiag_LU.
     
  5. (pour les courageux) Ecrire une fonction similaire qui utilise l'algorithme du gradient conjugué présenté dans ce fichier pdf.