320 likes | 462 Views
PROGRAMMATION SCIENTIFIQUE EN C. PRO-1027. Résolution de système d’équations linéaires. Affichage des résultats (tp 1 a) Élimination de Gauss Élimination de Gauss avec pivot Travail pratique 1 b. Affichage des résultats . Affichage de données réelles float epsilon1; double epsilon2;
E N D
PROGRAMMATION SCIENTIFIQUE EN C PRO-1027
Résolution de système d’équations linéaires • Affichage des résultats (tp 1 a) • Élimination de Gauss • Élimination de Gauss avec pivot • Travail pratique 1 b
Affichage des résultats • Affichage de données réelles float epsilon1; double epsilon2; epsilon1 = 0.00000011921; epsilon2 = 0.00000000000000022204; printf("\n Valeur de epsilon1: %13.11f ",epsilon1); printf("\n Valeur de epsilon2: %22.20f ",epsilon2);
Élimination de Gauss • Exemple de système d’équations linéaires • Un alliage est composé de manganène, silice et de cuivre • Cet alliage est composé de 15 livres de Mn, 22 livres de Si et 39 livres de Cu par tonne d’alliage • Les ingrédients de l’alliage (Mn, Si, Cu) sont extraits de minerai provenant de 3 fournisseurs différents • De plus, la concentration des ingrédients est différente pour les 3 minerais
Élimination de Gauss • Nous voulons alors déterminer quelle quantité de minerai nous devons acheter de chaque fournisseur pour éviter l’achat inutile d’ingrédient
Élimination de Gauss • Pour trouver une solution à ce problème nous devons définir les variables suivantes: • Xj: la quantité de minerai achetée du fournisseur j (tonne de minerai) • Ci: la quantité d’ingrédient i par tonne d’alliage (lb/ tonne d’alliage) • aij: la quantité d’ingrédient i par tonne de minerai achetée du fournisseur j (lb/tonne de minerai)
Élimination de Gauss • Nous pouvons déduire une expression générale pour le calcul des Ci • m représente le nombre d’ingrédients et n le nombre de fournisseurs
Élimination de Gauss • Le problème précédent peut être représenté par un système d’équations linéaires de la forme • La solution de ce système correspond aux quantités de minerai à acheter de chaque fournisseur
Élimination de Gauss • Détermination des courants dans un circuit électrique
Élimination de Gauss • Forme générale d’un système d’équations linéaires
Élimination de Gauss • Solution de 2 équations (n=2) • Isolons X2 de la seconde équation • Substituons X2 de la première équation
Élimination de Gauss • Nous pouvons alors isoler X1 • Nous pouvons alors déduire X2 par
Élimination de Gauss • Classification des systèmes d’équations • Systèmes ayant des solutions • Systèmes sans solution • Systèmes avec une infinité de solutions
Élimination de Gauss • L’élimination de Gauss est similaire à la procé-dure de substitution utilisée précédemment pour déduire les valeurs de X1 et X2 • L’élimination consiste à effectuer un ensemble d’opérations valides sur les équations pour arriver à obtenir une matrice dont la partie triangulaire inférieure (sous la diagonale) est nulle et une diagonale à 1 (Gauss-Jordan) • Nous pouvons alors isoler chacune de nos inconnues
Élimination de Gauss • Opérations valides sur les équations • Permuter deux équations • Multiplier ou diviser une équation par une constante • Additionner deux équations ensembles
Élimination de Gauss • Représentation matricielle d’un système d’équations linéaires
Élimination de Gauss • Représentation sous forme de matrice augmen-tée
Élimination de Gauss • La procédure d’élimination de Gauss est subdi-visée en une phase d’élimination avant suivie d’une phase de substitution arrière. Avec l’élimination avant nous obtenons un système
Élimination de Gauss • Si nous réinsérons les inconnues nous obtenons le système d’équations suivant
Élimination de Gauss • A partir du système précédent, nous pouvons déduire les inconnues Xi en commençant par l’inconnue Xn et par substitution arrière les autres inconnues X1 … Xn-1
Élimination de Gauss • L’élimination de Gauss appliquée à un circuit électrique (phase d’élimination avant)
Élimination de Gauss • Algorithme d’élimination de Gauss (élimination avant) Entrées: matrice A de nxn et un vecteur C de n éléments Élimination avant POUR j=1à n-1 FAIRE /* Pour chaque élément de la diagonale */ POUR i=j+1 à n FAIRE /* Pour chaque rangée sous la diagonale */ mij = aij/ajj aij = 0; Ci = Ci - mij * Cj POUR k = j+1 à n FAIRE /* Pour les éléments restant de la rangée i */ aik = aik - mij * ajk
Élimination de Gauss • Algorithme d’élimination de Gauss (substitution arrière) Substitution arrière POUR i= n à 1 FAIRE xi=Ci POUR j=i+1 à n FAIRE xi = xi - aij * xj xi = xi/aii Sortie: vecteur x des solutions
Élimination de Gauss • Problèmes d’erreurs • Représentation des nombres • Utilisation de pivot très petit (division par 0) • Pour minimiser ces problèmes nous pouvons utiliser l’élimination de Gauss avec pivot
Élimination de Gauss • Problèmes d’erreurs (exemple) • En arithmétique exacte, la première étape de l’élimination donne
Élimination de Gauss • Problèmes d’erreurs (exemple) • La dernière étape produit un élément diagonal a22 nul • L’élément pivot (diagonal) de la prochaine étape est donc nul • Le rapport m23 = 3/0 ce qui cause erreur de division par 0
Élimination de Gauss • Nous pouvons corriger cette anomalie en permutant les rangées 2 et 3 permettant de déduire le vecteur solution exacte
Élimination de Gauss • Sur l’ordinateur, les rapports 2/7 et 3/7 ne sont pas représentés avec exactitude ce qui produit un élément diagonal a22 très petit. L’élimination avant peut quand même se poursuivre produi-sant des solutions erronnées
Élimination de Gauss avec pivot • Pour éviter les problèmes liés à l’utilisation de pivots petits nous devons avant chaque étape de l,élimination chercher la rangée dont la valeur pivot est maximale Élimination avant POUR j=1à n-1 FAIRE /* Pour chaque élément de la diagonale */ trouver_pivot(n,j,A,kp)./*rangée où se trouve le pivot max */ Permuter les rangées j et kp POUR i=j+1 à n FAIRE /* Pour chaque rangée sous la diagonale */ mij = aij/ajj aij = 0; Ci = Ci - mij * Cj POUR k = j+1 à n FAIRE /* Pour les éléments restant de la rangée i */ aik = aik - mij * ajk
Élimination de Gauss avec pivot trouver_pivot(n,j,A,kp) pivot = abs(A[j][j]) kp=j POUR i=j+1à n FAIRE /* Pour chaque rangé sous la diagonale */ SI abs(A[i][j])>pivot ALORS pivot = abs(A[i][j]) kp = i FINSI FIN POUR