TP2 : instabilités numériques



Documents pareils
Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Introduction à MATLAB R

Cours d initiation à la programmation en C++ Johann Cuenin

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

MATLAB : COMMANDES DE BASE. Note : lorsqu applicable, l équivalent en langage C est indiqué entre les délimiteurs /* */.

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Introduction au pricing d option en finance

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

TP : Gestion d une image au format PGM

Claude Delannoy. 3 e édition C++

Travaux Dirigés n 1 : chaînes de caractères

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Algorithmique et Programmation, IMA


Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Plan du cours Cours théoriques. 29 septembre 2014

Programmation linéaire

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Cours d Algorithmique et de Langage C v 3.0

1.6- Génération de nombres aléatoires

Cours 7 : Utilisation de modules sous python

Présentation du langage et premières fonctions


Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Résolution de systèmes linéaires par des méthodes directes

Cours d analyse numérique SMI-S4

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

1 Complément sur la projection du nuage des individus

Algorithmique, Structures de données et langage C

Programmation C++ (débutant)/instructions for, while et do...while

et Programmation Objet

Calcul Formel et Numérique, Partie I

Chap III : Les tableaux

TP 1 Introduction à Matlab Février 2009

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Représentation d un entier en base b

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Fonctions de plusieurs variables

Principes des langages de programmation INF 321. Eric Goubault

Bases de programmation. Cours 5. Structurer les données

Introduction à l héritage en C++

Conventions d écriture et outils de mise au point

Programme Compte bancaire (code)

Projet de programmation (IK3) : TP n 1 Correction

Cours 02 : Problème général de la programmation linéaire

I. Introduction aux fonctions : les fonctions standards

Durée de L épreuve : 2 heures. Barème : Exercice n 4 : 1 ) 1 point 2 ) 2 points 3 ) 1 point

Algorithmique I. Algorithmique I p.1/??

COMPARAISONDESLANGAGESC, C++, JAVA ET

Chapitre 1 : La gestion dynamique de la mémoire

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

STAGE IREM 0- Premiers pas en Python

Optimisation Discrète

Les structures de données. Rajae El Ouazzani

Calcul matriciel. Définition 1 Une matrice de format (m,n) est un tableau rectangulaire de mn éléments, rangés en m lignes et n colonnes.

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Exercices - Fonctions de plusieurs variables : corrigé. Pour commencer

FONCTIONS DE PLUSIEURS VARIABLES (Outils Mathématiques 4)

Cours d Analyse. Fonctions de plusieurs variables

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Convers3 Documentation version Par Eric DAVID : vtopo@free.fr

Avertissement : Ce cours suppose la connaissance et la maîtrise du langage C CONTENU DU COURS BIBLIOGRAPHIE

Résolution d équations non linéaires

Calcul Formel et Numérique, Partie I

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Première partie. Préliminaires : noyaux itérés. MPSI B 6 juin 2015

4. Les structures de données statiques

INFO-F-105 Language de programmation I Séance VI

Programmation Classique en langage C

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Capacité d un canal Second Théorème de Shannon. Théorie de l information 1/34

Génie Logiciel I. Cours VI - Typage statique / dynamique, fonctions virtuelles et classes abstraites, flots d entrées / sorties, et string

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Aide - mémoire gnuplot 4.0

INF 321 : mémento de la syntaxe de Java

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

SUPPORT DE COURS. Langage C

NOTATIONS PRÉLIMINAIRES

Introduction à l algorithmique et à la programmation M1102 CM n 3

Gnuplot. Chapitre Lancer Gnuplot. 3.2 Options des graphes

Licence Sciences et Technologies Examen janvier 2010

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Département Automatisation et Informatisation Année Programmation en C++ Institut des Sciences et Techniques de l Ingénieur d Angers

Introduction à la Programmation Parallèle: MPI

Fonctions de plusieurs variables : dérivés partielles, diérentielle. Fonctions composées. Fonctions de classe C 1. Exemples

Exo7. Calculs de déterminants. Fiche corrigée par Arnaud Bodin. Exercice 1 Calculer les déterminants des matrices suivantes : Exercice 2.

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Exo7. Matrice d une application linéaire. Corrections d Arnaud Bodin.

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

TP, première séquence d exercices.

3 Approximation de solutions d équations

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Transcription:

TP2 : instabilités numériques Pensez à structurer l implémentation, à mettre des commentaires et à passer les arguments par référence en les protégeant (const) si besoin. On se propose de tester la méthode d élimination de Gauss pour résoudre un système linéaire AX = b. De façon formelle, l algorithme a la forme suivante : for ( int k=1;k<n; k++) for ( int i=k+1; i<=n; i ++) {for ( int j=k+1;j<=n; j++) {A( i, j) =A( i, k) A(k, j )/A(k, k ); B( i) =A( i, k) B(k)/A(k, k ) ; Structures On commencera par écrire une strucure vecteur possédant un entier pour la dimension et un pointeur de double pour stocker les valeurs et une structure matrice possédant des données similaires : struct vecteur double val ; ; struct matrice double lignes ; On adoptera un stockage de la matrice ligne par ligne. A ces structures seront associées les fonctionnalités suivantes : init(int d, double v=0) : intialisation du vecteur ou de la matrice à partir de la dimension et d une valeur init(const vecteur &) et init(const matrice &) : initialisation à partir d un vecteur et d une matrice clear() : libération de la mémoire print() : impression Fonctions Outre ces fonctionnalités, on écrira également les fonction suivantes : matrice hilbert(int d) : génération de la matrice de Hilbert H ij = 1/(i + j 1). vecteur produit(const matrice &A,const vecteur &X) : produit matrice x vecteur (utile pour fabriquer un second membre b = Ax) 1

double ps(const vecteur &X,const vecteur &Y) : produit scalaire double norme(const vecteur &X) : norme euclidienne d un vecteur double normesup(const vecteur &X) : norme sup d un vecteur vecteur cl(const vecteur &X,double a, const vecteur &Y, double b) : combinaison linéaire de 2 vecteurs (utile pour calculer l erreur) print() : impression vecteur gauss(const matrice &A,const vecteur &B, double eps) : méthode de Gauss, eps valeur minimale du pivot Pour finir, on écrira un programme principal réalisant une boucle sur la dimension (dim=2 à 50), calculant les erreurs euclidienne et sup commises par la méthode de Gauss appliquée à la matrice de Hilbert et au second membre b = Ax avec x i = 1 i. Ces erreurs pourront être stockées sur un fichier, chaque ligne contenant la dimension, l erreur euclidienne, l erreur sup, qui pourra être relu en Matlab (load fichier;) afin de tracer les courbes d erreur (dim,log10(erreur)). Pour écrire dans un fichier, il faut inclure l entête <fstream> et écrire les instructions suivantes : ofstream out ( nom fichier ) ;... out<<dim<< <<er2<< <<ersup<<end ;... out. close ( ) ; 2

Correction // Résolution d un système linéaire AX=B par la méthode de Gauss // inclusion entêtes système #include <iostream> #include <fstream> #include <cmath> using namespace std ; // strucure vecteur struct vecteur double val ; void i n i t ( int d, double v ) ; void i n i t (const vecteur & U) ; void clear ( ) ; void print ( ostream &); ; // i n i t i a l i s a t i o n du vecteur // i n i t i a l i s a t i o n avec un vecteur // effacement de la matrice //impression de la matrice // strucure matrice, stockage ligne par ligne struct matrice double lignes ; void i n i t ( int d, double v ) ; // i n i t i a l i s a t i o n de la matrice void i n i t (const matrice & A) ; // recopie d une matrice void clear ( ) ; // effacement de la matrice void print ( ostream &); //impression de la matrice vecteur ligne ( int i ) const ; // conversion d une ligne en vecteur ; //méthodes attachées à la structure matrice void matrice : : i n i t ( int d, double v=0.) {// allocation dim=d ; lignes=new double [d ] ; for ( int i =0; i<dim ; i++) { lignes [ i ]=new double [ dim ] ; for ( int j =0;j<dim ; j++) lignes [ i ] [ j ]=v ; void matrice : : i n i t (const matrice & A) // recopie d une matrice {dim=a. dim ; lignes=new double [ dim ] ; for ( int i =0; i<dim ; i++) { lignes [ i ]=new double [ dim ] ; for ( int j =0;j<dim ; j++) lignes [ i ] [ j ]=A. lignes [ i ] [ j ] ; void matrice : : clear () {for ( int i =0; i<dim ; i++) delete [ ] lignes [ i ] ; delete [ ] lignes ; void matrice : : print ( ostream & out=cout ) {for ( int i =0; i<dim ; i++) {out<< ligne <<i<< : ; for ( int j =0;j<dim ; j++) out<<lignes [ i ] [ j]<< ; out<<endl ; vecteur matrice : : ligne ( int i ) const // attention pas de recopie de la ligne 3

{ vecteur V; V. dim=dim ; V. val=lignes [ i ] ; return V; // construction de la matrice de Hilbert matrice hilbert ( int d) {matrice H; ; H. i n i t (d ) ; for ( int i =0; i<h. dim ; i++) for ( int j =0;j<H. dim ; j++) H. lignes [ i ] [ j ]=1./( i+j +1.); return H; //méthodes attachées à la structure vecteur void vecteur : : i n i t ( int d, double v=0.) {// allocation dim=d ; val=new double [ d ] ; for ( int i =0; i<dim ; i++) val [ i ]=v ; void vecteur : : i n i t (const vecteur & U) {// allocation dim=u. dim ; val=new double [ dim ] ; for ( int i =0; i<dim ; i++) val [ i ]=U. val [ i ] ; void vecteur : : clear () {delete [ ] val ; void vecteur : : print ( ostream & out=cout ) {for ( int i =0; i<dim ; i++) out<<val [ i]<< ; // produit scalaire de vecteurs double ps (const vecteur & U, const vecteur & V) {double u=u. val ; double v=v. val ; double r =0.; for ( int i =0; i<u. dim ; i++,++u,++v) r+=( u) ( v ) ; return r ; //norme euclidienne d un vecteur double norme(const vecteur & U) {return sqrt ( ps (U,U) ) ; //norme sup d un vecteur double normesup (const vecteur & U) {double s=0; for ( int i =0; i<u. dim ; i++) s=max( s, abs (U. val [ i ] ) ) ; return s ; //combinaison linéaire de 2 vecteurs vecteur cl (const vecteur & U, double a, const vecteur & V, double b) { vecteur R; R. i n i t (U. dim ) ; for ( int i =0; i<r. dim ; i++) R. val [ i ]=a U. val [ i ]+b V. val [ i ] ; 4

return R; // produit matrice x vecteur ( tableau ) vecteur produit (const matrice & M, const vecteur & X) { vecteur R; R. i n i t (M. dim ) ; for ( int i =0; i<r. dim ; i++) R. val [ i ]=ps (M. ligne ( i ),X) ; return R; // résolution du système par Gauss ligne sans pivot // la matrice A et B ne sont pas modifiés en sortie vecteur gauss (const matrice & A, const vecteur & B, double eps=1.e 20) {matrice M; // recopie des arguments M. i n i t (A) ; vecteur X; X. i n i t (B) ; int d=m. dim ; for ( int k=0;k<d 1;k++) // boucle de Gauss {double piv=m. lignes [ k ] [ k ] ; // test pivot if ( abs ( piv)<eps ) {cout<< ligne <<k+1<< pivot < <<eps ; exit ( 1); for ( int i=k+1; i<d ; i++) // élimination {double c=m. lignes [ i ] [ k ]/ piv ; for ( int j=k+1;j<d ; j++) M. lignes [ i ] [ j] =c M. lignes [ k ] [ j ] ; M. lignes [ i ] [ k ]=0.; X. val [ i] =c X. val [ k ] ; for ( int i=d 1; i >=0;i ) // résolution du système triangulaire {for ( int j=d 1;j>i ; j ) X. val [ i] =M. lignes [ i ] [ j ] X. val [ j ] ; X. val [ i ]/=M. lignes [ i ] [ i ] ; M. clear ( ) ; return X; //programme principal int main () { // résolution HX=B (H matrice de Hilbert ) int nb=51; ofstream out ( erreurs ) ; // fichier de résultat // boucle sur la dimension for ( int dim=2; dim<nb ; dim++) {out<<dim ; matrice H=hilbert (dim ) ; //matrice de Hilbert vecteur X;X. i n i t (dim, 1 ) ; vecteur HX=produit (H,X) ; vecteur Y=gauss (H,HX) ; //Gauss vecteur d=cl (X,1,Y, 1); out<< <<norme(d)<< <<normesup (d ) ; vecteur Yp=gauss pivot (H,HX) ; //Gauss avec pivot partiel vecteur dp=cl (X,1,Yp, 1); out<< <<norme( dp)<< <<normesup ( dp)<<e n d l ; // libération mémoire H. clear ( ) ;X. clear ( ) ;HX. clear ( ) ; Y. clear ( ) ;Yp. clear ( ) ; d. clear ( ) ; dp. clear ( ) ; 5

//impression des erreurs out. close ( ) ; return 0; On obtient les résultats suivants : 25 Méthode de Gauss (matrice de Hilbert) 20 15 10 conditionnement log10(erreur) 5 0 5 err. sup err. L2 10 15 20 0 5 10 15 20 25 30 35 40 45 50 dim L utilisation de la méthode de Gauss avec pivot n apporte aucune amélioration car l instabilité est due au très mauvais conditionnement de la matrice. // résolution du système par Gauss ligne avec pivot partiel // la matrice A et B ne sont pas modifiés en sortie vecteur gauss pivot (const matrice & A, const vecteur & B, double eps=1.e 20) {matrice M; M. i n i t (A) ; vecteur X; X. i n i t (B) ; int d=m. dim ; int ind [ d ] ; // tableau de permutation des lignes for ( int i =0; i<d ; i++) ind [ i ]= i ; // boucle Gauss for ( int k=0;k<d 1;k++) {// recherche du pivot maximal int K=ind [ k ] ; int imax=k ; double piv=m. lignes [K] [ k ] ; for ( int i=k+1; i<d ; i++) {int I=ind [ i ] ; float c=abs (M. lignes [ I ] [ k ] ) ; if ( abs ( c)>abs ( piv )){ piv=c ; imax=i ; if ( abs ( piv)<eps ) {cout<< i t é r a t i o n <<k<< pivot < <<eps ; exit ( 1); //permutation des lignes if (imax!=k) {int K=ind [ k ] ; 6

ind [ k]=ind [ imax ] ; ind [ imax]=k; // élimination for ( int i=k+1; i<d ; i++) {int I=ind [ i ] ; int K=ind [ k ] ; double c=m. lignes [ I ] [ k ]/ piv ; for ( int j=k+1;j<d ; j++) M. lignes [ I ] [ j] =c M. lignes [K] [ j ] ; M. lignes [ I ] [ k ]=0.; X. val [ I] =c X. val [K] ; // résolution du système triangulaire for ( int i=d 1; i >=0;i ) {int I=ind [ i ] ; for ( int j=d 1;j>i ; j ) {int J=ind [ j ] ; X. val [ I] =M. lignes [ I ] [ j ] X. val [ J ] ; X. val [ I ]/=M. lignes [ I ] [ i ] ; return X; 7