TP Programmation FORTRAN n° 3

Licence Techno Méca

Aujourd'hui, nous allons utiliser des matrices (dites à 2 dimensions). Comme pour les tableaux unidimensionnels, il n'est pas obligatoire d'utiliser toute la place réservée lors de la déclaration. Mais pour transmettre une matrice en argument à un sous-programme, il est nécessaire de lui transmettre également la dimension totale de la matrice (en plus de la dimension réelle si elle est différente).

Exemple :

       integer diml,dimc,
       parameter (diml=5,dimc=3)
       real matrice(diml,dimc)
       	..............
       call sousprog(matrice,diml,dimc,autres aruguments)
       	..............
       subroutine sousprog(mat,dl,dc)
       integer dl,dc
       real mat(dl,dc)
       	..............

Nous allons créer une bibliothèque d'outils pour les matrices (pas nécessairement carrées). Celle-ci devant pouvoir s'appliquer à toutes matrices, on passera les matrices en arguments plutôt que de les transmettre via une zone commune.

Question 1 : Ecrivez un sous-programme de saisie d'une matrice. Il s'appellera «saisie», et vérifiera qu'on ne dépasse les dimensions réelles de la matrice. Ecrivez également un sous-programme «affichage» qui sache afficher ces données, et un programme qui permette de tester s'ils fonctionnent. Vous mettrez les sous-programmes de la bibliothèque dans un fichier différent de celui du programme de test.

Question 2 : On désire utiliser plusieurs matrices dans le même programme. Pour cela il nous faut rajouter dans la bibliothèque un certain nombre de sous-programmes : Copie d'une matrice dans une autre, produit d'une matrice par un réel (résultat dans une seconde matrice), somme de deux matrices (dans une troisième), produit de 2 matrices (dans une 3ème). Quels sous programmes acceptent que la matrice résultat soit une des matrices source ? Ecrivez également deux fonctions, l'une indiquant si une matrice est nulle, l'autre si elle est unitaire (si carrée).

Question 3 : On désire résoudre un système de N équations (N inconnues). Pour cela, on utilise une matrice (N,N) nommé A, une matrice (N,1) B pour le second membre. On recherche X, ce qui revient à inverser A. Vous allez utiliser la méthode du pivot de Gauss. Dans un premier temps, il faut triangulariser la matrice. Cela correspond à la résolution du système d'équations A.X=B par substitution. Nous allons le préciser sur un exemple ci-contre :


On utilise le fait que de remplacer une ligne du système d'équations par une combinaison linéaire entre elle et d'autres lignes ne modifie pas le résultat, pour éliminer le premier élément de la seconde ligne. En soustrayant la première ligne à la seconde on obtient (si on n'a pas oublié B) :


Toujours à l'aide de la première ligne, on élimine de la même manière les tous les éléments de la première colonne, pour toutes les lignes suivantes (ici on ajoute la première ligne). Puis à l'aide de la seconde ligne, on élimine la seconde colonne pour les lignes suivantes( ici on l'ajoute 1/2 fois). et ainsi de suite On peut désormais résoudre le système (en commençant par le bas) : x3=1, donc (seconde ligne) 2x2-2*1=4, donc x2=3, donc (première ligne) x1+3-2*1=2 donc x1=1. Si ces substitutions font apparaître une ligne de 0, soit le système admet une infinité de solutions (0=0, une ligne est une combinaison linéaire des autres), soit aucune (0=N). Ecrivez un programme réalisant cela. Il serait bien que vous multipliez A par le résultat obtenu pour vérifier si vous obtenez B (je ne l'ai pas fait sur l'exemple, au cas où vous ne l'auriez pas remarqué).

Mais cette méthode n'est pas directement applicable pour des coefficients réels (ou du moins flottants). En effet, si les substitutions précédentes ont amené un coefficient nul, on obtient une division par zéro. S'il est proche de 0, l'utilisation de ce coefficient pour en annuler d'autres nécessitera un multiplicateur très grand, ce qui entraînera une multiplication importante de l'erreur inhérente à l'utilisation de réels et donc un résultat faux.

La solution est de ne pas traiter les lignes dans l'ordre mais pour une colonne donnée, choisir (pour celle qui gardera son terme non nul) celle dont ce terme est le plus grand (on l'appelle le pivot). Il suffit alors d'échanger la ligne que l'on veut traiter avec la ligne contenant le pivot. Mais il n'est pas nécessaire de le faire aujourd'hui.

N'oubliez pas de me transmettre votre solution !


La correction est disponible ici  : question 1 et 2 (source programme, source bibliothèque,ou pdf), question 3 (source ou pdf).


sujet TP1 sujet TP2 sujet TP3 sujet TP4 retour sommaire TP cours Fortran P. Trau