M.A. Aziz Alaoui et C. Bertelle Facult des Sciences et Techniques e 25 rue Philippe Lebon - BP 540 76058 Le Havre Cedex - France 13 septembre 2002
R sum e e On pr sente bri` vement quelques m thodes num riques usuelles et e e e e el mentaires a lusage des etudiants en n de premiers cycles scientiques e ` universitaires ou de ceux d butant un second cycle. e .............. A REVOIR .............. Les math maticiens et autres scientiques se sont toujours int ress s a la e e e ` r solution num rique des probl` mes quils rencontrent, lanalyse math matique e e e e classique ne pouvant r soudre tous les probl` mes qui se posent (par exemple e e en int gration, equations diff rentielles, interpolation, r solution d quations non e e e e lin aires ...). Lint r t des scientiques pour les m thodes et lanalyse num rique e ee e e en g n ral, na donc cess daugmenter. Deux notions sav` rent alors impore e e e tantes : -lerreur num rique e -la notion de stabilit . e Abord es de mani` re rapide dans cet ouvrage, nous renvoyons le lecteur a des e e ` ouvrages sp cialis s [?, ?] pour approfondir ces notions utiles pour la validation e e des m thodes num riques. e e Les th or` mes et propositions enonc s ne seront pas d montr s, la plupart e e e e e sont, ou peuvent etre facilement, trait s en exercices, nexigeant pas darguments e math matiques profonds. e Nous compl tons un certain nombre de chapitres par des petits programmes e dapplications en Java o` lon a privil gi une lecture facile pour des d butants u e e e dans ce langage et la programmation objet plut t que des d veloppements o e exhaustifs et g n riques n cessitant souvent des constructions elabor es qui e e e e d passent le cadre des objectifs d nis pour ce manuel. Le choix de Java pour e e impl menter des m thodes num riques est discutable en raison des faibles pere e e formances de calcul des plate-formes de d veloppement actuelles en Java mais e qui sam liorent r guli` rement de mani` re importante. Notre souci premier est e e e e avant tout p dagogique et Java est un langage orient objet propre et qui se veut e e simple. Sa portabilit int grant des possibilit s graphiques int ressantes r pond a e e e e e ` nos pr occupations p dagogiques et de rentabilisation de linvestissement dans un e e nouveau langage dans une discipline informatique en evolution permanente.
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 23 24 26 26 27 29 29 30 31 33 33 34 35 35 36 39 41 41 42 43 43 44 44 45 47 51 61 61 63 66 68 69 69 69 70 71 73 75
1.6
1.7
1.8 2
R solution des equations non lin raires dans e e 2.1 Localisation (ou s paration) des racines . . . . . . . . . . . . . e 2.2 M thode des approximations successives . . . . . . . . . . . . . e 2.3 Ordre dune m thode . . . . . . . . . . . . . . . . . . . . . . . e 2.4 Exemples de m thodes it ratives . . . . . . . . . . . . . . . . . e e 2.4.1 M thode de Lagrange (ou de la corde) . . . . . . . . . . e 2.4.2 M thode de Newton . . . . . . . . . . . . . . . . . . . e 2.5 Acc leration de la convergence . . . . . . . . . . . . . . . . . . e dAitken . . . . . . . 2.5.1 M thode dAitken, ou Proc d e e e 2.5.2 M thode de Steffensen, exemple de composition de e m thodes . . . . . . . . . . . . . . . . . . . . . . . . . e 2.5.3 M thode de Regula-Falsi . . . . . . . . . . . . . . . . . e 2.6 Enonc s des exercices corrig s . . . . . . . . . . . . . . . . . . e e 2.7 Enonc s des exercices non corrig s . . . . . . . . . . . . . . . . e e 2.8 Corrig s des exercices . . . . . . . . . . . . . . . . . . . . . . e 2.9 Mise en uvre en Java . . . . . . . . . . . . . . . . . . . . . . 2.9.1 Une classe abstraite de description de processus it ratifs e 2.9.2 La m thode de Lagrange . . . . . . . . . . . . . . . . . e 2.9.3 La m thode de Steffensen . . . . . . . . . . . . . . . . e R solution des syst` mes lin aires e e e 3.1 M thode d limination de Gauss . . . . . . . e e 3.1.1 R solution dun syst` me triangulaire . e e 3.1.2 M thode de Gauss . . . . . . . . . . e 3.1.3 Factorisation . . . . . . . . . . . 3.1.4 Remarque sur le Pivot . . . . . . . . 3.2 Enonc s des exercices corrig s . . . . . . . . e e 3.3 Enonc s des exercices non corrig s . . . . . . e e
. . . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
3 77 85 85 85 90 91 97 102 102 102 103 104 104 104 104 106 110 110 111 112 115 118 118 118 120 121 123 124 132 141 141 142 144 147 149
Graphisme scientique avec Java 4.1 Applets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 Un premier exemple . . . . . . . . . . . . . . . . . . . . 4.1.2 Passage de param` tres . . . . . . . . . . . . . . . . . . . e 4.1.3 Cycle de vie . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.4 Compl ments . . . . . . . . . . . . . . . . . . . . . . . . e 4.2 Gestion de fen tres avec AWT . . . . . . . . . . . . . . . . . . . e 4.2.1 Trac s dans des applets . . . . . . . . . . . . . . . . . . . e 4.2.2 Construire des interfaces fen tr es . . . . . . . . . . . . . e e 4.3 Construction de courbes de trac s scientiques . . . . . . . . . . e 4.3.1 Les domaines bidimensionnels de lutilisateur et du dispositif dafchage . . . . . . . . . . . . . . . . . . . . . 4.3.2 Un gestionnaire de fen tres de base . . . . . . . . . . . . e 4.3.3 Une classe dutilitaires pour le trac de graphismes sciene tiques . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3.4 Un exemple dutilisation . . . . . . . . . . . . . . . . . . Interpolation Polyn miale o 5.1 Introduction. Existence et unicit du polyn me dinterpolation e o 5.2 Interpolation de Lagrange . . . . . . . . . . . . . . . . . . . . 5.3 Interpolation dHermite . . . . . . . . . . . . . . . . . . . . 5.4 Enonc s des Exercices Corrig s . . . . . . . . . . . . . . . . e e 5.5 Enonc s des exercices non corrig s . . . . . . . . . . . . . . . e e 5.6 Corrig s des exercices . . . . . . . . . . . . . . . . . . . . . e 5.7 Mise en uvre en Java . . . . . . . . . . . . . . . . . . . . . Approximation par moindres carr s e 6.1 Principe dapproximation et crit` re de moindres carr s e e 6.2 R gression lin aire . . . . . . . . . . . . . . . . . . . e e 6.2.1 Mise en uvre en Java . . . . . . . . . . . . . 6.3 G n ralisation aux mod` les lin aires . . . . . . . . . . e e e e 6.3.1 Ecriture matricielle du probl` me . . . . . . . . e
. . . . . . .
. . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
4 150 160 161 161 162 162 162 163 163 164 165 168 170 173 179 179 180 181 182 183 186 186 187 189 189 190 190 190 190 192 193 197 203 211 211 215
Int gration Num rique e e 7.1 M thodes des Rectangles . . . . . . . . . . . . . . . . . . . . . . e 7.1.1 M thode des Rectangles sup rieurs et inf rieurs . . . . . . e e e 7.1.2 M thode des r ctangles points-milieux . . . . . . . . . . e e 7.2 M thodes des trap` zes . . . . . . . . . . . . . . . . . . . . . . . e e 7.3 M thode de Simpson . . . . . . . . . . . . . . . . . . . . . . . . e 7.4 M thode de Romberg . . . . . . . . . . . . . . . . . . . . . . . . e 7.5 Enonc s des exercices corrig s . . . . . . . . . . . . . . . . . . . e e 7.6 Enonc s des exercices non corrig s . . . . . . . . . . . . . . . . . e e 7.7 Corrig s des exercices . . . . . . . . . . . . . . . . . . . . . . . e 7.8 Mise en uvre en Java . . . . . . . . . . . . . . . . . . . . . . . 7.8.1 Des classes abstraites dint gration num rique . . . . . . e e 7.8.2 Des classes dimpl mentation de la m thode des trap` zes . e e e 7.8.3 Des classes dimpl mentation de la m thode de Simpson . e e 7.8.4 Un programme de test des m thodes des trap` zes et de e e Simpson . . . . . . . . . . . . . . . . . . . . . . . . . . 7.8.5 Mise en uvre de la m thode de Romberg . . . . . . . . . e R solution Num rique des equations diff rentielles e e e 8.1 Introduction, le probl` me math matique . . . . . . . . . . e e 8.2 La M thode dEuler . . . . . . . . . . . . . . . . . . . . . e 8.2.1 Etude de lerreur dEuler . . . . . . . . . . . . . . 8.3 M thodes de Taylor dordre deux . . . . . . . . . . . . . . e 8.4 M thodes de Runge-Kutta . . . . . . . . . . . . . . . . . e 8.4.1 Runge-Kutta dordre 2 : RK2 . . . . . . . . . . . 8.4.2 Runge-Kutta dordre 4 : RK4 . . . . . . . . . . . 8.5 G n ralit s sur les m thodes a un pas . . . . . . . . . . . e e e e ` 8.6 R solution de syst` mes diff rentiels dans IR . . . . . . . e e e 8.7 Enonc s des exercices corrig s . . . . . . . . . . . . . . . e e 8.8 Enonc s des exercices non corrig s . . . . . . . . . . . . . e e 8.9 Corrig s des exercices . . . . . . . . . . . . . . . . . . . e 8.10 Mise en uvre en Java . . . . . . . . . . . . . . . . . . . 8.10.1 R solution num rique des equations diff rentielles e e e 8.10.2 R solution num rique des syst` mes diff rentiels . e e e e
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
1.1
1.1.1
Pr sentation de Java e
Objectifs
Le langage Java a et d velopp an de pouvoir g n rer des applications qui e e e e e soient ind pendantes des machines et de leur syst` me dexploitation. Une des e e autres caract ristiques du langage est de pouvoir ecrire des applications structue rellement distribu es sur des r seaux. Il appartient, par ailleurs, a la famille des e e ` langages objets purs o` rien ne peut exister en dehors des classes. u
1.1.2
Historique
Au d but des ann es 1990, une equipe de d veloppeurs de la soci t SUN e e e ee Microsystems travaille sur limpl mentation du langage OAK pour lint grer en e e domotique, notamment pour le d veloppement de la t l vision interactive. Il fale ee lait que les codes des applications dans ce langage soit peu volumineux, efcaces
et ind pendants de larchitecture. A cette epoque, la t l vision interactive na pas e ee connue lessor escompt alors que le d veloppement dInternet et du Web faie e sait apparatre des besoins urgents de m me nature. En 1995, OAK devient Java e et se trouve popularis rapidement pour ses possibilit s de d veloppement li s e e e e au Web. Les ann es qui suivent font connatre a Java une popularit en tant que e ` e langage g n raliste qui d passe les pr visions de SUN. Les grands industriels e e e e du d veloppement ladopte rapidement en lespace de quelques ann es. Pour les e e ann es a venir, les industriels projettent la cr ation de puces electroniques d di es e ` e e e a Java ... un juste retour vers les pr occupations initiales des concepteurs originaux ` e de OAK/Java. Certes Java est un langage propri taire, mais de licence ouverte, ce qui lui a e permis de se faire adopter par tous les professionnels du d veloppement avec un e engouement sans pr c dent par rapport aux autres langages plus anciens. e e
1.1.3
Le langage Java est un langage compil et interpr t . Cette d nition contrae ee e dictoire sexplique par le fait que le code source est transform dans un byte-code e universel ex cutable par une machine virtuelle. Cette machine virtuelle peut etre e install e a partir dune distribution du langage comme le Java Development Kit e ` (JDK) de SUN. Elle peut etre egalement int gr e sous une forme compact e dans e e e un navigateur an quil puisse ex cuter des applets Java. e Ces caract ristiques conf` rent au langage des propri t s de portabilit sans e e ee e pr c dents, mais ont aussi un co t correspondant au fonctionnement de la machine e e u virtuelle qui r duit les performances dex cution du programme. An de r soudre e e e ce probl` me, un effort important est consenti pour d velopper des compilateurs e e a la vol e en code machine qui fonctionnent lors de lex cution du programme ` e e (compilateurs identi s sous la d nomination de JIT - Just In Time). e e
1.1.4
Caract ristiques e
Le langage Java poss` de une syntaxe inspir e du C++. Il se veut plus propre e e en terme de d veloppement objet, ne permettant pas de construction en dehors des e classes. Il se veut aussi plus simple en affranchissant le programmeur de toute la gestion dynamique des objets construits, gr ce au fonctionnement dun ramassea miettes (Garbage Collector) dont la fonction est didentier et d liminer tous les e objets qui ne sont plus r f renc s. ee e Java propose des ex cutions parall` les de programmes gr ce a une utilisation e e a ` qui se veut plus facile des threads (ou processus l gers) par rapport au langage e C. Il poss` de egalement des aspects li s a la distribution gr ce a ses possibilit s e e ` a ` e dint gration dans des documents Web distribu s par les applets, mais egalement e e
avec la biblioth` que RMI (Remote Methods Invocation) qui propose de la proe grammation dobjets r partis. L volution de cette biblioth` que la fait converger e e e progressivement vers CORBA, le standard dans le domaine des objets r partis. e Les biblioth` ques CORBA sont aujourdhui int gr es dans les distributions du e e e JDK 1.2 ou sup rieures de SUN. e Dans cet ouvrage o` Java sert de langage el mentaire dimpl mentation u e e de m thodes num riques, les threads et la programmation en objets distribu s e e e ne seront pas utilis s. Le parall lisme et la programmation distribu e sont e e e ind niablement des apports r cents et majeurs en calcul scientique et feront e e certainement lobjet douvrages sp ciques compl mentaires a celui que nous e e ` pr sentons ici. e
1.2
1.2.1
Comme tout langage de programmation evolu , Java poss` de un certain e e nombre de types de donn es de base : e le type boolean qui prend une des 2 valeurs true ou false sur 1 octet ; le type char qui correspond a un caract` re sur 2 octets ; ` e les types byte, short, int et long qui sont 4 types dentiers stock s e respectivement sur 1, 2, 4 et 8 octets ; les types float et double qui sont 2 types de ottants stock s respectie vement sur 4 et 8 octets. Les d clarations de telles variables peuvent se faire nimporte o` dans le code e u mais avant leur utilisation, comme en C++. On utilise les op rateurs usuels sur les variables de ces types avec la syntaxe e du C.
1.2.2
Structures de contr le o
Ce sont essentiellement les m mes constructions quen C, a savoir e ` Laffectation qui se fait par lop rateur = et qui consiste a recopier la valeur e ` de la variable primaire a droite du symbole dans la variable situ e a gauche. ` e ` Les structures conditionnelles : if (cond) instruction1 ; [else instruction2 ;] switch (selecteur) case c1 : instructions1 ; ... case cn : instructionsN ;
1.3
1.3.1
Une classe permet de d nir un type dobjets associant des donn es et des e e op rations sur celles-ci appel es m thodes. Les donn es et les m thodes sont ape e e e e pel s composants de la classe. Lexemple de base d crit dans un paragraphe suie e vant permettra de d nir une classe Vecteur repr sentant des vecteurs au sens e e math matique. A chaque vecteur, seront rattach s : e e une structure de donn es - un tableau - pour le stockage de ses coefcients ; e des traitements comme les suivants, son addition avec un autre vecteur, son produit scalaire avec un autre vecteur, ... et aussi son proc d de cr ation. e e e
1.3.2
Pour manipuler un objet (par exemple, un vecteur particulier de la classe Vecteur), on doit tout dabord d clarer une r f rence sur la classe correspone ee dant au type dobjet. Cette op ration permet de r server en m moire une adresse e e e qui r f rencera lobjet. Par exemple, pour d clarer un objet x de type Vecteur ee e on ecrira : Vecteur x; Pour que cet objet soit r ellement construit, cest a dire que la r f rence e ` ee d signe un emplacement a partir duquel on pourra acc der aux caract ristiques de e ` e e lobjet, on devra appeler lop ration new qui alloue cet emplacement en m moire e e et le renvoie a la r f rence de lobjet. On dispose alors dune nouvelle instance de ` ee lobjet. Par exemple, pour la construction effective de notre vecteur x, on ecrira : x = new Vecteur();
Cette instruction fait appel a un proc d de construction dobjets, appel ` e e e constructeur, qui est d ni par d faut, mais qui peut aussi etre red ni comme e e e op ration dans la classe Vecteur. Si cette instruction de construction nest pas e effectu e, la r f rence associ e a x est initialis e par d faut a NULL, qui est une e ee e ` e e ` adresse ctive ne pointant vers aucun emplacement m moire r el. e e Par ailleurs, si lon a besoin de r f rencer lobjet courant dans la d nition de ee e la classe, cette r f rence se fait par le mot r serv this qui vaut donc ladresse ee e e de lobjet courant dans une instance de la classe. La destruction des objets est pris en charge par le Garbage Collector, appel e encore ramasse-miettes dans sa d nomination francis e. Cet outil logiciel fonce e tionne en m me temps que le programme, il recherche, identie et supprime de la e m moire les objets qui ne sont plus r f rencables. e ee On peut toutefois ajouter a chaque classe un service finalize(), qui ` sera appel au moment de la destruction de lobjet, sil est utile deffectuer des e op rations sp ciques a cet instant. e e ` Comme nous lavons indiqu pr c demment, le nom dun objet permet de e e e d nir une r f rence, cest a dire une adresse. Il est alors possible de faire une e ee ` affectation entre deux objets de m me nature. Une telle op ration va donc recoe e pier ladresse de lobjet affect . Ainsi une affectation est notablement diff rente e e lorsquelle se fait entre des variables de type simple (int, char, double, ...) ou entre des objets. Le passage de param` tres dans les fonctions se fait par valeur, comme en C. e Ainsi, soit le param` tre est de type simple alors on recopie sa valeur dans celui de e la fonction appel e, soit cest un objet, on recopie alors ladresse r f renc e par e ee e lobjet (qui est bien sa valeur) dans celui de la fonction appel e. e
1.3.3
Tableaux
Un tableau va permettre de stocker un certain nombre d l ments de m me ee e type dans une structure de donn es qui dispose dun index pour y acc der. Un e e tableau en Java est un objet a part enti` re. ` e Par exemple, un tableau monodimensionnel de ottants de type double sera d clar de la mani` re suivante : e e e double monTableau[]; ou encore double[] monTableau; Comme nous lavons expliqu pr c demment, cette d claration a permis dafe e e e fecter une r f rence au nom du tableau une r f rence (cest a dire une adresse, ee ee `
10
initialis e par d faut a NULL). Pour construire effectivement le tableau, cest a e e ` ` dire disposer de plusieurs emplacements m moire, par exemple 10, qui lui sont e propres, on invoque lop ration de construction dobjets suivante : e monTableau = new double[10]; Ces deux instructions de constructions peuvent s crire en une seule fois : e double[] monTableau = new double[10]; Il est egalement possible dinitialiser la construction en affectant un tableau constant de la mani` re suivante : e double[] montableau = {0.0, 1.1, 3.5}; Les tableaux en tant quobjets proposent un certain nombre dop rations, noe tamment ils poss` dent une donn e propre length qui renvoie la taille du tableau. e e Par exemple, les instructions suivantes permettent dafcher le contenu du tableau pr c dent, en utilisant la m thode1 dafchage standard sur l cran e e e e 2 System.out.print : for (int i=0; i<montableau.length; i++) System.out.print(montableau[i]+" "); Lexemple pr c dent nous apprend par ailleurs que, comme en C, le premier e e indice dun tableau est 0. On dispose aussi de m canismes de v rication de d passement de e e e bornes des tableaux que lon peut interroger par linterm diaire des teche niques dexceptions3 que lon d crira apr` s. Lexception concern e se nomme e e e ArrayIndexOutOfBoundsException.
1.3.4
Nous allons contruire maintenant une classe Vecteur permettant de manipuler des vecteurs au sens math matique. Cest une classe el mentaire all g e de e e e e certains concepts de programmation objet qui seront pr sent s et introduits proe e gressivement dans la suite de cet ouvrage. Dans cette classe, on utilise une structure de donn es, appel e composant, e e correspondant a un tableau o` seront stock s les coefcients du vecteur. ` u e On d nit deux constructeurs qui sont des m thodes portant le nom de la e e classe et qui ne renvoie pas de r sultat : e
voir 1.3.1 voir 1.7 pour une description g n rale des m thodes dentr es/sorties e e e e 3 voir 1.6
2 1
11
Le premier constructeur construit un vecteur dont le nombre de composants est donn en param` tre. e e Le second constructeur construit un vecteur en recopiant un tableau pass e en param` tre. e Par linterm diaire de ces deux constructeurs, il est ainsi possible de d nir e e des m thodes de m me nom, a condition quelles diff` rent au niveau du type ou e e ` e du nombre de param` tres ou de leur r sultat renvoy . On parle alors de surcharge e e e de m thodes. e On d nit diff rentes m thodes : e e e elt renvoyant la valeur de sa composante dont lindice est donn en pae ram` tre ; e toElt permettant de modier la composante dont lindice et la nouvelle valeur sont pass s en param` tres ; e e dim renvoyant la taille du vecteur ; afficher afchant les valeurs de ses composantes ; add renvoyant un vecteur qui est la somme du vecteur courant avec le vecteur pass en param` tre ; e e prodScalaire renvoyant le produit scalaire du vecteur courant avec le vecteur pass en param` tre. e e Cet exemple permet dillustrer la facon dont on acc` de aux composants de e lobjet courant, en invoquant simplement leur nom, mais aussi la facon dont on acc` de aux composants dun objet ext rieur, en invoquant le nom de la compoe e sante prec d e dun point et du nom de lobjet en question. e e L criture de la classe Vecteur est la suivante, e
class Vecteur { double[] composant; // constructeurs Vecteur(int dim) { composant = new double[dim]; } Vecteur(double tableau[]) { composant = tableau; } // acces a la composante i double elt(int i) { return composant[i]; } // modification de la composante i void toElt(int i, double x) { composant[i] = x; } // renvoie sa tailla int dim() { return composant.length; }
12
// renvoie son produit scalaire avec le vecteur en parametre double prodScalaire(Vecteur x) { double p = 0; for (int i=0; i<dim(); i++) p += elt(i)*x.elt(i); return p; } }
Nous donnons dans le listing suivant un exemple de classe qui va contenir un programme principal, cest-` -dire une m thode de type public a e static void main(String args[]) . Le param` tre args correspond e a d ventuels arguments dappel. ` e
class TestVecteur { public static void main(String args[]) { double []t1 = {1.0, 2.0, 3.0}; double []t2 = {5.5, 7.5, 9.5}; Vecteur x1 = new Vecteur(3); for (int i=0; i<x1.dim(); i++) x1.toElt(i, t1[i]); System.out.println("premier vecteur :"); x1.afficher(); Vecteur x2 = new Vecteur(t2); System.out.println("deuxieme vecteur :"); x2.afficher();
13
Vecteur x3 = x1.add(x2); System.out.println("leur somme vaut :"); x3.afficher(); double produit=x1.prodScalaire(x2); System.out.println("leur produit scalaire vaut : "+ produit); } }
Les commandes a utiliser pour compiler et ex cuter le programme seront ` e d crites au paragraphe 1.4.2. Le programme g n` re alors lafchage suivant a e e e ` lex cution : e
premier vecteur : 1.0 2.0 3.0 deuxieme vecteur : 5.5 7.5 9.5 leur somme vaut : 6.5 9.5 12.5 leur produit scalaire vaut : 49.0
1.3.5
Il est possible de d nir des composants4, donn es ou m thodes, qui ne sont e e e pas rattach s de mani` re propre a chaque objet instanci , cest-` -dire a chaque e e ` e a ` instance de la classe, mais qui sont communs a toutes. Pour cela il suft de d clarer ` e le composant avec le qualicatif static. Par exemple, on peut ajouter a la classe vecteur une donn e enti` re qui va ` e e compter le nombre dobjets de la classe qui ont et instanci s. On peut egalement e e remplacer la m thode add par une m thode qui est static et qui prend 2 objets e e Vecteur en param` tres : on redonne a l criture de cette fonction une apparence e ` e de sym trie sur ses arguments correspondant a la propri t de communtativit e ` ee e de laddition. Ci-dessous nous avons partiellement r ecrit la classe Vecteur en e prenant en compte ces modications.
class Vecteur { double[] composant; static int nb =0; // constructeurs
4
voir 1.3.1
14
Vecteur(int dim) { composant = new double[dim]; nb++; System.out.println("creation de lobjet "+nb); } Vecteur(double tableau[]) { composant = tableau; nb++; System.out.println("creation de lobjet "+nb); } ... // renvoie sa somme avec le vecteur en parametre static Vecteur add(Vecteur x, Vecteur y) { vecteur w = new vecteur(x.dim()); for (int i=0; i<x.dim(); i++) w.toElt(i, x.elt(i) + y.elt(i)); return w; } ... }
Pour acc der a la nouvelle m thode add, on proc dera de la mani` re suivante : e ` e e e
double[] t1 = {1.0, 3.2, 5.3}; double[] t2 = {3.0, 4.1, 6.3}; Vecteur x1 = new Vecteur(t1); Vecteur x2 = new Vecteur(t2); Vecteur x3 = Vecteur.add(x1, x2);
1.3.6
Une notion fondamentale en programmation objet consiste a s parer, dans la ` e description ou limpl mentation des objets, les parties visibles de lext rieur et que e e lon appelle interface de celles qui nont pas besoin d tre connues a lext rieur e ` e de lobjet. Les composants de la premi` re partie porteront alors le qualicatif public e et ceux de la seconde le qualicatif private. Dans notre exemple de classe vecteur, nous avons d ni les op rations dacc` s en lecture (fonction elt) et en e e e ecriture (fonction toElt) dans un objet, si bien quil nest jamais utile dacc der e
15
au tableau composant interne a la classe. Ainsi nous d clarerons public les ` e deux fonctions elt et toElt mais private le tableau composant. Lint r t de s parer ainsi les parties publiques des parties priv es est de garanee e e tir une evolutivit possible des classes, sans avoir a modier les programmes qui e ` les utilisent, a partir du moment o` lon conserve leur interface publique. Ainsi ` u la classe vecteur pourra utiliser des types de structures de donn es autres que e des tableaux pour stocker ses composantes. On pourra par exemple, utiliser un stockage directe sur chier (pour des vecteurs de dimension importante) ou encore un stockage sp cique pour des structures creuses (en ne stockant que les e coefcients non nuls et leur position). Il sufra alors de red nir correctement les e deux fonctions dacc` s en lecture (elt) et en ecriture (toElt) en respectant leur e mode dappel. Tous les programmes utilisant des classes vecteurs nauront alors pas lieu de subir la moindre modication pour pouvoir utiliser ces nouveaux types de vecteurs. La classe vecteur pourra alors etre partiellement r ecrite avec des parties pu e bliques et priv es, comme ci-dessous : e
class Vecteur { private double[] composant; static int nb =0; // acces a la composante i public double elt(int i) { return composant[i]; } // modification de la composante i public void toElt(int i, double x) { composant[i] = x; } ... }
Lutilisation de ces fonctions nest pas affect e par ces d clarations e e suppl mentaires : on introduit simplement des limitations aux composants comme e d crit pr c demment. e e e Il est a noter quen nindiquant ni public ni private, les composants sont ` consid r s comme etant d nis public par d faut, sauf si lon se trouve dans ee e e un autre package que celui de la classe consid r e - nous reviendrons sur cette ee nuance dans le paragraphe 1.4.3.
1.3.7
Les chanes de caract` res en Java sont des objets, instances de la classe e pr d nie String, et elles r f rencent des chanes constantes. On pourra les e e ee
16
La chane "bonjour" est ici constante mais ch1 peut etre r affect e pour e e r f rencer une autre chane constante, comme dans lexemple suivant : ee String ch2 = "au revoir"; ch1 = ch2; Lensemble des m thodes de la classe String peut etre obtenu en consultant e la documentation de lAPI (Application Programming Interface) associ e au JDK e utilis . Cette documentation, au format HTML, se r v` le insdispensable dans la e e e pratique, pour pouvoir acc der aux descriptions des interfaces des nombreuses e classes propos es dans Java. Toutefois nous allons examiner quelques unes des e m thodes les plus utiles relatives a la classe String : e ` La m thode static String valueOf(int i) renvoie une chane e contenant la valeur de i. Cette fonction existe aussi pour des param` tres de e tous les types primaires. Notons que cest une m thode statique qui sape pelle, par exemple, de la mani` re suivante : String.valueOf(12) et e qui retourne ici la chane 12. La m thode boolean equals(String s) compare le contenu de la e chane courante avec la chane s. La m thode String concat(String s) renvoie la concat nation de e e la chane courante (celle qui va pr x e la fonction concat) et de s. Il e e faut noter toutefois que les concat nations de chanes peuvent se faire sime plement avec lop rateur +, comme on peut le remarquer dans les appels de e la fonction dafchage dans certains des exemples qui pr c` dent. e e La m thode int length() renvoie la longueur de la chane courante. e La m thode int indexOf(int c) renvoie la position de la premi` re e e occurence du charact` re de code ASCII c. Elle renvoie -1 si ce caract` re e e napparat pas. La m thode char charAt(int i) renvoie le caract` re a la position i. e e ` Nous avons vu que les objets String r f rencent des chanes constantes. ee On peut, en fait, travailler avec des chanes modiables, en utilisant des objets de la classe pr d nie StringBuffer dont on va d crire, sommairement, les e e e m thodes essentielles. L` encore, pour plus dinformations, on consultera la doe a cumentation en ligne de lAPI. Les diff rents constructeurs de la classe StringBuffer sont : e
17
StringBuffer() permettant de cr er une chane vide ; e StringBuffer(int dim) permettant de cr er une chane de longueur e dim ; StringBuffer(String s) permettant de cr er une chane contenant e s. Les principales m thodes de la classe StringBuffer sont : e int length() renvoyant la longueur de la chane ; StringBuffer append (String s) ajoutant s a la n de la chane ` courante ; String toString() renvoyant dans une chane constante la chane modiable courante.
1.4
1.4.1
Un programme Java correspond a une collection de classes dans un ou ` plusieurs chiers sources dont lextension est "java". Lun de ces chiers doit contenir une classe qui impl mente la m thode public static void e e main(String args[]), comme cela est fait dans lexemple pr c dent de e e construction de la classe vecteur et de son programme de test.
1.4.2
Pour compiler et ex cuter les programmes java on utilise les outils fournis avec e le JDK. On commence par lancer la compilation des chiers avec la commande javac. Par exemple, pour les deux chiers relatifs a notre classe vecteur et a son ` ` programme de test, on ecrira : javac Vecteur.java javac TestVecteur.java Deux chiers : Vecteur.class et TestVecteur.class ont et e g n r s et correspondent aux noms de toutes les classes d nies dans les chiers e ee e sources. Ce sont des chiers en byte-code portables sur toute machine devant etre trait s par la machine virtuelle java lanc e par la commande java. On ex cute e e e donc le programme principal, qui est dans la classe TestVecteur, en tapant la commande :
18
1.4.3
Packages
Un package permet de regrouper un ensemble de classes. Linstruction package nomPack en d but de chier indique que les classes qui y sont e d nies appartiennent au package nomm nomPack. Pour acc der aux classes e e e de ce package, lorsque lon est dans une classe qui ny appartient pas, on utilise la d nomination nomPack.className, o` className d signe le nom de la e u e classe. Les d signations de package suivent un sch ma de construction arborescent e e du type : name.subname.subsubname. Il existe un lien entre les noms de package et les r pertoires o` se trouvent les classes y appartenant . Par exemple, e u une classe watch appartenant au package time.clock doit se trouver dans le chier time/clock/watch.class. Les r pertoires o` Java effectue sa recherche de packages sont d nis dans la e u e variable denvironnement : CLASSPATH. Linstruction import packageName permet dutiliser des classes du package d ni, sans avoir besoin de les pr xer par leur nom de package. On peut e e importer toutes les classes dun package en utilisant un import du type import packageName.* ;, mais, ATTENTION, limport dun niveau de package ne permet pas dimporter les packages qui sont en-dessous dans larborescence des r pertoires. e Voici un exemple dillustration qui montre une organisation de classes java, dans diff rents r pertoires et leur utilisation. e e La variable denvironnement CLASSPATH doit etre dans le chier .profile ou dans .bashrc, par exemple, sous Unix, de la mani` re suivante : e CLASSPATH = /myJavaClass Voici maintenant des extraits de diff rents chiers rang s dans les r pertoires e e e indiqu s : e le chier /myJavaClass/bibMat/calVecteur/Vecteur.java correspond a ` package bibMat.calVecteur; public class Vecteur { ... } le chier /myJavaClass/bibMat/calMatrice/Matrice.java correspond a ` package bibMat.calMatrice; public class Matrice { ... } le chier /myJavaClass/calUtil/TestBibMat.java correspond a `
19
1.4.4
On a vu pr c demment que laccessibilit des composants dune classe se fait e e e gr ce aux qualicatifs private ou public. En fait, elle est egalement li e a e aux localisations dans les packages. Ainsi, lorsquun composant ne pr cise pas sa e nature (private ou public) alors il est, par d faut, public dans les classes e du package (ou du r pertoire) auquel il appartient et private en dehors. e Nous illustrons ces propos avec lexemple suivant : Package P1 : class C1 { public int xa; int xc; private int xd; } class C2 { ... } Package P2 : class C3 { ... } Dans cet exemple, la classe C2 peut acc der a xa et xc. Par contre C3 ne peut e ` acc der qu` xa uniquement. e a
1.4.5
Le langage Java poss` de un grand nombre de packages pr d nis regroup s e e e e par th` mes. Ces packages et les classes quils contiennent sont d crits de mani` re e e e exhaustive dans une documentation fournie par Sun et qui reprend lensemble des interfaces. Cette documentation est appel e API (Application Programming Intere face) et est distribu e sous un format HTML, permettant ainsi une navigation hye
20
pertexte particuli` rement adapt e aux recherches dinformations n cessaires pour e e e le d veloppement de programmes. On y trouve principalement : e java.lang qui correspond aux classes de base (chanes, math, ...), java.util qui correspond aux structures de donn es (vector, piles, les, e ...), java.io qui correspond aux entr es/sorties, e java.awt qui correspond au graphisme et fen trage, e java.net qui correspond aux communications Internet, java.applet qui correspond aux insertions dans des documents HTML.
1.5
1.5.1
H ritage e
Construire une classe d riv e e e
La notion dh ritage est importante en programmation objet. Elle permet de e d nir une classe d riv e a partir dune autre classe dont on dit quelle h rite. La e e e ` e classe d riv e poss` de alors, par d faut, lensemble des composants de la classe e e e e dont elle h rite - on lappelle classe m` re - sauf si des restrictions ont et pos s sur e e e e ces composants. Lh ritage est donc un concept essentiel renforcant les propri tes e e de r utilisabilit des programmes objets. e e Lutilisation r p t e de lh ritage sur des classes successives conduit a la e ee e ` construction dune hi rarchie entre elles, que lon peut sch matiser par un arbre e e dh ritage. La gure 1.1 pr sente un exemple darbre dh ritage construit sur des e e e classes permettant de repr senter des gures g om triques. e e e
Figure
Cercle
La construction effective des diff rentes classes de la gure 1.1 est faite dans e lexemple complet du paragraphe 1.5.5. Pour d nir une classe ClB qui d rive de la classe ClA, on fera une d claration e e e du type :
21
Un objet de la classe ClB est alors aussi un objet de la classe ClA, il peut etre utilis partout o` un objet de la classe ClA est attendu. e u On peut tester lappartenance dun objet a une classe gr ce a lop rateur ` a ` e instanceof, comme dans lexemple qui suit : ClB x; if ( x instanceof ClA) System.out.println(voici un objet ClA !); Lex cution des lignes pr c dentes provoque lafchage de voici un e e e objet ClA !.
1.5.2
Si lon d nit un constructeur dune classe d riv e, celui-ci doit explicitement e e e faire appel a un constructeur de la classe m` re, auquel on acc` de avec la m thode ` e e e pr d nie super( ... ). Si cet appel explicite nest pas fait, lex cution du e e e programme provoquera un appel implicite du constructeur par d faut, cest a dire e ` sans param` tre, de la classe m` re ; il faut donc imp rativement que celui-ci existe e e e sinon une erreur de compilation sera diagnostiqu e. Ainsi, si lon a d ni un ou e e des constructeurs dans la classe m` re, une de ses versions devra etre sans pae ram` tre. e Lappel explicite du constructeur de la classe m` re se fait par la m thode e e pr d nie super( ... ), cet appel est obligatoirement la premi` re instruce e e tion du constructeur. On ne peut donc transmettre que des valeurs de param` tres e du constructeur courant lors de lappel de super( ... ). On retrouve de telles constructions dans lexemple du paragraphe 1.5.5 o` la u classe Figure poss` de un composant de type Point correspondant a son orie ` gine et pouvant etre initialis par le param` tre x du constructeur Figure(Point e e p). On d nit la classe Cercle d rivant de Figure, dont le constructeur est e e d ni par : e Cercle (Point centre, double r) { super(centre); ... }
1.5.3
On a vu pr c demment que les composants dune classe pouvaient etre e e eventuellement quali s des termes public ou private. Il existe, en fait, un e
22
troisi` me qualicatif protected qui indique que ce composant est accessible e uniquement dans les classes d riv es et les classes du m me package. e e e Par exemple, soit la classe ClA d nie de la mani` re suivante : e e
package aa; public class ClA { protected int JJ; ... }
1.5.4
Une classe peut annoncer une m thode sans la d nir, on dit alors que la classe e e est abstraite. Elle doit etre introduite avec le mot cl abstract. e Par exemple, on peut d nir la classe abstraite ClA suivante et une classe ClB e qui en d rive. e
abstract class ClA { abstract void fctP() ; void fctQ() { ... }; ... } class ClB extends ClA { void fctP() { ... }; ... }
En raison de sa d nition incompl` te, il est impossible dinstancier une classe e e abstraite qui ne sert qu` la construction de classes d riv es. Ces derni` res devront a e e e red nir toutes les m thodes abstraites, pour ne pas l tre elles-m mes et pouvoir e e e e ainsi etre instanci es. e
23
1.5.5
Nous donnons un exemple dimpl mentation des diff rentes classes d crites e e e sur la gure 1.1. Nous commencons par d nir une classe Point qui servira dans e les autres classes :
class Point { double abscisse; double ordonnee; Point(double x, double y) {abscisse=x; ordonnee=y;} Point(Point p) {abscisse=p.abscisse; ordonnee=p.ordonnee;} static double distance(Point p, Point q) { double dx=p.abscisse-q.abscisse; double dy=p.ordonnee-q.ordonnee; return Math.sqrt(dx*dx+dy*dy); } }
Nous d nissons ensuite une classe abstraite pour d nir le type Figure e e constitu de deux m thodes abstraites dafchage et de calcul de p rim` tre : e e e e
abstract class Figure { private static final Point zero=new Point(0,0); Point origine; Figure(){origine=zero;} Figure(Point p){origine=new Point(p);} abstract double perimetre(); abstract void affiche(); }
La classe Cercle qui suit d rive de la classe Figure en impl mentant ses e e deux m thodes abstraites perimetre et affiche : e
class Cercle extends Figure { private static final double pi=3.141592; double rayon; Cercle(Point centre, double r) {super(centre); rayon=r;} double perimetre() {return 2*pi*rayon;} void affiche() { System.out.println("Cercle");
24
System.out.println("rayon : " + rayon +" et centre : " + "(" + origine.abscisse + "," + origine.ordonnee + ") "); } }
La classe Polygone d rive de la classe Figure. Elle se caract rise par un e e tableau de Point :
class Polygone extends Figure { Point sommet[]= new Point[100]; int nbs; Polygone(){nbs=0;} Polygone(Point[] m, int n) { super(m[0]); nbs=n; for (int i=0; i<n; i++) sommet[i]=m[i]; } double lcote(int i) { if (i<nbs) return Point.distance(sommet[i-1], sommet[i]); else return Point.distance(sommet[i-1], sommet[0]); } double perimetre() { double somme=0; for (int i=1; i<=nbs; i++) somme += lcote(i); return somme; } void affiche() { System.out.println("Polygone"); for (int i=0; i<nbs; i++) System.out.print("(" + sommet[i].abscisse + "," + sommet[i].ordonnee + ") System.out.println(); } }
");
25
La classe Rectangle d rive de la classe Polygone. Elle est d nie avec e e ses caract ristiques math matiques classiques, cest a dire la longueur de ses c t s e e ` oe et un de ses sommets, le sommet inf rieur gauche. On a alors une bonne illustrae tion de lutilisation des constructeurs successifs des classes d riv es. Pour ape e peler le constructeur de Polygone qui poss` de le tableau de ses sommets en e param` tres, il faudrait tout dabord faire la construction de ce tableau a partir des e ` caract ristiques de Rectangle, ce qui nest pas possible, car lappel de super e doit etre la premi` re op ration. Il faut donc utiliser le constructeur par d faut dans e e e la classe Polygone qui sera appel au d but de lex cution du constructeur de e e e Rectangle. La composante sommet de la classe sera alors construite plus loin :
class Rectangle extends Polygone { double largeur; double longueur; Rectangle(Point m, double lo, double la) { // appel implicite du constructeur de // Polygone sans parametre // lappel du constructeur de Polygone avec parametres // ne peut se faire car il faut dabord construire // le tableau a lui transmettre qui ne peut se faire // quapres lappel explicite ou implicite de super Point P1= new Point(m.abscisse+ lo, m.ordonnee); Point P2= new Point(m.abscisse, m.ordonnee+ la); Point P3= new Point(m.abscisse+ lo, m.ordonnee+ la); Point mr[]={m, P1, P3, P2}; sommet=mr; nbs=4; largeur= la; longueur= lo; } }
26
f=c; f.affiche(); // appel de affiche de Figure // puis de sa forme derivee de cercle System.out.println("perimetre : " + f.perimetre()); f=r; f.affiche(); System.out.println("perimetre : " + f.perimetre()); f=t; f.affiche(); System.out.println("perimetre : " + f.perimetre()); } }
1.5.6
Interfaces
Une interface, en Java, permet de d crire un mod` le de construction de classe e e dans lequel on nindique uniquement que les en-t tes des m thodes. Cela equivaut, e e dune certaine mani` re, a une classe o` toutes les m thodes sont abstraites. e ` u e On dira quune classe impl mente une interface, si elle red nit toutes les e e m thodes d crites dans cette interface. e e Par exemple, on d nit un mod` le de probl` me par une interface qui comporte e e e deux m thodes poserProbleme et resoudreProbleme : e
27
On peut alors construire une classe equationPremierDegre qui impl mente linterface aResoudre : e
class EquationPremierDegre implements AResoudre { double coefx, coef1, solution; void poserProbleme() { // on lira coefx et coef1 } void resoudreProbleme() { // on affecte une valeur a solution } ... }
Un autre int r t des interfaces provient de la limitation de Java en terme ee dh ritage multiple. En effet, Java ne permet pas quune classe d riv e puisse e e e avoir plusieurs classes m` res et donc de b n cier des composants d nis dans e e e e ces diff rentes classes. Pour pallier cette limitation, on devra utiliser conjoine tement lh ritage et limpl mentation dinterfaces. Il est, par ailleurs, possible e e dimpl menter plusieurs interfaces en Java, contrairement a lh ritage. e ` e
1.5.7
Nous nous int ressons au probl` me du passage dune fonction en tant que e e param` tre dans une m thode. Par exemple, on souhaite d crire dans une classe un e e e proc d qui approche le calcul dune d riv e dune fonction r elle dune variable e e e e e r elle par un taux daccroissement : e
Nous allons montrer comme ce proc d peut etre d crit dune mani` re g n rique, e e e e e e cest a dire en utilisant une fonction abstraite , param` tre du proc d . On ` e e e applique alors ce proc d de d rivation num rique a une fonction particuli` re en e e e e ` e la transmettant par linterm diaire de ce param` tre. e e Dans beaucoup de langages, comme le C ou le C++, le passage dune fonction en param` tre seffectue en g rant un pointeur qui contient ladresse effective e e du code de la fonction. Le langage Java ne proposant pas de gestion explicite de pointeur, on doit alors cr er une enveloppe de type objet contenant une m thode e e
28
correspondante a l valuation de la fonction. Cest cette classe enveloppe qui cor` e respond au param` tre a g rer. e ` e Il faut donc commencer par d nir une classe abstraite, ou une interface, qui e d crit les fonctionnalit s minimales de la classe correspondant au param` tre fonce e e tionnel. Nous donnons un exemple qui sappuie sur lutilisation dune interface minimale caract risant une fonction r elle dune variable r elle. Les nombres r els e e e e sont impl ment s par le type double : e e
interface FoncD2D { public double calcul(double x); }
Nous pouvons alors utiliser cette interface pour d crire un proc d g n rique e e e e e de calcul de d rivation num rique, comme d crit ci-dessus : e e e
class DiffFinies { public double derivOrdre1 (FoncD2D f, double x, double h) { return (f.calcul(x+h/2) - f.calcul(x+h/2))/h ; } }
Pour utiliser ce proc d , il suft maintenant de d nir une fonction particuli` re e e e e dans une classe qui impl mente linterface FoncD2D : e
class FoncCarre implements FoncD2D { public double calcul (double x) { return x*x ; } }
Le programme principal suivant va alors construire un objet de la classe FoncCarre qui permet dutiliser la fonction particuli` re qui y est d nie. Il e e construit aussi un objet de la classe DiffFinies qui permet dutiliser le proc d e e de d rivation num rique qui est invoqu sur lobjet de type FoncCarre, reconnu e e e comme une impl mentation de FoncD2D : e
class TestDiffFinies { public static void main (String args[]) { FoncCarre f = new FoncCarre(); DiffFinies df = new DiffFinies(); System.out.println ("Diffrences finies dordre un "+ e "en 1 de pas 0.01 : "+ df.derivOrdre1(f, 1, 0.01)); } }
29
1.6
1.6.1
Exceptions
Notions g n rales e e
Lintroduction de la notion dexception dans un langage de programmation a pour but de simplier le traitement de certaines situations. Ces derni` res sont e consid r es comme exceptionnelles, au sens o` leur d tection n cessite de les ee u e e g rer, en les sortant du contexte dans lequelle elles sont d tect es. e e e Dans les langages ne g rant pas sp ciquement ces situations dexception, il e e est n cessaire dutiliser de nombreuses instructions conditionnelles successives, e an de r orienter le d roulement du programme de mani` re ad quate. De tels e e e e processus peuvent conduire a une complexit du programme dont la lecture nit ` e par salourdir. Certains langages proposent de mani` re facultative lutilisation des exceptions e (cest le cas du C++). Avec Java, on a lobligation de les g rer lorsque certains e appels de m thodes sont succeptibles, de par leur conception, de d clancher des e e traitements dexception. Une gestion dexception est caract ris e par une s quence e e e try - Catch - finally qui correspond typiquement au d roulement suivant : e
try { //squence succeptible de dclancher une exception e e ... } catch (classException e1) { //traitement ` effectuer si e1 a t dclanche a e e e e ... } catch ( ....) { ... } //autre dclanchement ventuel e e finally { //traitement effectu avec ou sans dclanchement dexception e e ... }
Nous donnons ci-dessous un exemple de programme qui r cup` re les argue e ments fournis au lancement du programme. Il calcule et afche la moyenne de ces
30
arguments lorsque ce sont des entiers. Il d clanche un traitement dexception si e lun des arguments ne correspond pas a un entier. `
class exceptionCatch { static int moyenne (String[] liste) { int somme=0, entier, nbNotes=0, i; for (i=0; i<liste.length; i++) try { entier=Integer.parseInt(liste[i]); // conversion chane en valeur enti`re e somme += entier; nbNotes++; } catch (NumberFormatException e) { System.out.println("note: "+(i+1)+" invalide"); } return somme/nbNotes; } public static void main (String[]argv) { System.out.println("moyenne "+moyenne(argv)); } }
1.6.2
Pour d nir sa propre exception, il faut d nir une classe qui h rite de la e e e classe pr d nie Exception. On pourra surcharger, en particulier, la m thode e e e pr d nie toString() dont la chane renvoy e correspond au message afch , e e e e lorsque lon demande dafcher lexception elle-m me. e Une m thode succeptible de d clancher une exception devra avoir une clause e e throws, suivie de lexception d clanchable dans son en-t te. Dans le corps de la e e m thode, on pr cisera dans quelle condition lexception est d clanch e, en invoe e e e quant lop rateur throw. e On donne ci-apr` s un compl ment du programme pr c dent d clanchant e e e e e une exception, lors du calcul de la moyenne dun tableau, sil ne contient pas d l ments. ee
31
class ExceptionRien extends Exception { public String toString() { return ("aucune note !"); } } class ExceptionThrow { static int moyenne (String[] liste) throws ExceptionRien { int somme=0, entier, nbNotes=0, i; for (i=0; i<liste.length; i++) try { entier=Integer.parseInt(liste[i]); // conversion chane en valeur enti`re e somme += entier; nbNotes++; } catch (NumberFormatException e) { System.out.println("note: "+(i+1)+" invalide"); } if (nbNotes == 0) throw new ExceptionRien(); return somme/nbNotes; } public static void main (String[]argv) { try { System.out.println("moyenne "+moyenne(argv)); } catch (Exception e) { System.out.println(e); } } }
32
1.7
1.7.1
Entr es/Sorties e
Classes de gestion de ux
Dans le langage Java, deux types dentr es/sorties sont utilisables : e Les entr es/sorties traditionnelles, cest-` -dire utilisant les ux de commue a nications par d faut, a savoir le clavier ou l cran, ou encore les chiers ; e ` e Les entr es/sorties bas es sur des interactions avec un syst` me de fen trage. e e e e Celles-ci seront d velopp es dans le chapitre sur le graphisme. e e Nous pr sentons, dans la suite, des notions bas es sur lAPI 1.1 et qui ont et ene e e richies signicativement par rapport aux versions pr c dentes. Les raisons de ces e e enrichissements sont principalement dues a des questions defcacit et a la pos` e ` sibilit dutiliser des codes internationaux (UNICODE) qui enrichissent le code e ASCII avec des caract` res accentu s, entre autres. e e Les principales classes de gestion de ux sont organis es suivant la hi rarchie e e dh ritage d crite dans la gure 1.2. e e
Object Reader (abstract) InputStreamReader BufferedReader FileReader
Writer (abstract)
FileWriter
F IG . 1.2: Hi rarchie des classes de gestion de ux e Dans cette hi rarchie, les classes suivantes apparaissent : e La classe Object qui est la classe de base en Java, dont toutes les autres h ritent ; e e Les classes abstraites Reader et Writer qui concernent respectivement les ux de caract` res pour les lectures et les ecritures ; e Les classes InputStreamReader et OutputStreamWriter qui permettent de faire la traduction des donn es brutes en caract` res UNICODE e e et inversement ;
33
Les classes BufferedReader et BufferedWriter qui permettent lutilisation dune m moire tampon pour les entr es-sorties. Cette m moire e e e est indispensable pour lutilisation des p riph riques standards ( cran et clae e e vier) ; Les classes FileReader et FileWriter qui permettent lutilisation de chiers ; La classe PrintWriter qui permet l criture de donn es formatt es seme e e blables aux afchages a l cran. ` e Cette liste nest pas exhaustive mais correspond aux principales classes que nous serons amen s a utiliser dans la suite. e `
1.7.2
Saisies au clavier
Pour effectuer une saisie au clavier, on construit successivement : Un ux InputStreamReader avec le ux de lentr e standard, a savoir e ` System.in ; Un ux de lecture bufferis de type BufferedReader a partir du ux e ` pr c dent. e e On pr sente, ci-apr` s, un exemple typique de lecture au clavier. Dans cet e e exemple, on lit dans le ux bufferis avec la m thode readLine() permete e tant la lecture dun chane de caract` res jusqu` ce que lon rencontre un saut e a de ligne. La chane de caract` re est alors convertie en entier, avec la m thode e e () parseInt, ou en ottant, avec un construction plus complexe qui utilise la m thode floatValue(), sur lobjet de la classe Float obtenu en appelant e valueof(). Cette derni` re m thode est statique et a pour param` tre la chane e e e lue. Il faut noter qu` partir du JDK 1.2, on pourra plus simplement appeler la a m thode parseFloat(), similaire a parseInt(). e ` On remarquera que, dans cet exemple, il est n cessaire de g rer le e e d clanchement eventuel dexceptions peuvant se produire, e soit par un probl` me de lecture de ux qui provoque le d clanchement de e e lexception IOException ; soit par un probl` me de conversion de chane de caract` res en valeur e e num rique qui provoque lexception NumberFormatException. e
import java.io.*; class Testio { public static void main(String[] args) { InputStreamReader fluxlu = new InputStreamReader(System.in); BufferedReader lecbuf = new BufferedReader(fluxlu); try {
34
System.out.println("somme des deux nombres : " + (i+f) ); } catch(IOException e) { System.out.println("erreur de lecture"); } catch(NumberFormatException e) { System.out.println("erreur conversion chaine-entier"); } } }
1.7.3
Une lecture dans un chier est effectu dans le programme suivant. Il est sie milaire au pr c dent avec, toutefois, quelques diff rences : e e e FileReader est la classe instanci e pour construire le ux dentr e a e e ` partir du nom du chier. Cette instanciation pourra d clancher lexception e FileNotFoundException, si le chier nest pas trouv . e La m thode close() ferme le chier. e
35
On utilise une boucle qui d tecte la n de chier, suite au r sultat dune e e lecture qui renvoie la constante null.
import java.io.*; class Testfile { public static void main(String[] args) { FileReader fichier=null; BufferedReader lecbuf; String line; float f, somme=0; int nbnombre=0; try { fichier = new FileReader("donnee.dat"); lecbuf = new BufferedReader(fichier); while ( (line = lecbuf.readLine()) != null ) { f = Float.valueOf(line).floatValue(); somme += f; nbnombre++; System.out.println("nombre lu : " + f); } if ( nbnombre > 0 ) System.out.println("Moyenne : " + (somme/nbnombre)); } catch(FileNotFoundException e) { System.out.println("fichier donnee.dat inexistant !"); } catch(IOException e) { System.out.println("erreur de lecture"); } catch(NumberFormatException e) { System.out.println("erreur conversion chaine-entier"); } finally { if (fichier!=null) try { fichier.close(); } catch(IOException e) {} } } }
36
1.7.4
Le programme suivant va utiliser un chier dans lequel on ecrit. On construit un ux de type FileWriter, utilis dans un tampon d criture (de type e e BufferedWriter). Un ux, de type PrinterWriter, permet alors deffectuer des ecritures formatt es avec la m thode println, comme on le fait e e couramment sur la sortie standard, cest-` -dire l cran. a e
import java.io.*; class Testfileout { public static void main(String[] args) throws IOException { FileWriter fichier = new FileWriter("out.txt"); BufferedWriter ecrbuf = new BufferedWriter(fichier); PrintWriter out = new PrintWriter(ecrbuf); out.println("coucou"); out.println(5.6); System.out.println("fin decriture dans le fichier out.txt"); out.close(); } }
1.7.5
Compl ments e
Il est possible de lire et d crire des donn es brutes (donc non formatt es) avec e e e les classes DataInputStream et DataOutputStream. Les chiers, ainsi construits, ne sont pas lisibles directement sous un editeur de texte, par exemple, mais leur taille est plus r duite. e
37
La classe StringTokenizer est une classe qui permet dinstancier un petit analyseur de texte qui peut, par exemple, d couper des lignes en sous-chanes de e caract` res, en reconnaissant un certain nombre de s parateurs (blancs, virgules, e e ...). La classe java.io.File permet de faire des manipulations de chiers, similaires aux commandes dun syst` me dexploitation. Elle permet par exemple, e de lister un r pertoire, de renommer ou supprimer un chier, etc. e
1.8
Conclusion provisoire
Nous terminons ici cette introduction a Java. Des compl ments seront donn s ` e e au fur et a mesure de leur besoin. On abordera la partie graphisme dans le chapitre ` 4.
La g n ralisation aux syst` mes d quations non lin aires a plusieurs variables e e e e e ` ( IR ) nest pas trait dans ce volume, (mais une introsduction en est donn e e e sous forme dexercice, pr sent dans le chapitre 3, voir exercice 25) on pourra e e consulter les r f rences bibliographiques en n de volume, par exemple, [?], ... . ee Soit IR IR une application continue, on se propose de trouver la (ou les) solution(s) de l quation (2.1). Except quelques cas tr` s simples, par exemple e e e pour les polyn me de degr inf rieur ou egal a trois, les m thodes analytiques o e e ` e de r solution d quations ne permettent pas de r soudre de tels probl` mes. Le e e e e recours aux m thodes num riques, fournissant des solutions approch es, devient e e e alors incontournable.
2.1
La plupart des m thodes num riques supposent que lon connaisse un intere e valle contenant la racine cherch e et aucune autre. On dit alors quelle est localis e e e ou s par e, des autres eventuelles racines. e e Les deux m thodes les plus classiques pour localiser ou s parer les racines sont : e e 1. L tude des variations de e term diaire. e
38
(2.1)
FE # H I" G $!" D
B CA
IR
T U6
R SD
H 8"
39
2. La r ecriture de l quation e e sous la forme , puis la recherche de(s) point(s) dintersection des courbes repr sentatives de e et de . Le probl` me sera plus simple a traiter si lune des deux fonctions et e ` lidentit . La solution cherch e correspond alors a un point xe de lautre e e ` fonction. Voir ci-dessous. Remarque 1 : On supposera dans la suite que est localis e dans un intervalle born [a,b]. e e est continue et que la racine
2.2
choisi dans
dans lespoir quelle tende vers la solution v rie e . D nition 1 . Soit e l quation e . L quation e exemple (2.3) Ainsi, r soudre e IR
` W jQ "
elle peut s crire, sous la forme e avec , , . o` il faut choisir l criture permettant la convergence du processus it ratif u e e vers la solution cherch e, lorsque cette convergence est possible. e
# $(" b
# b $!" v "
g e # " ihfdy $(" b " $!"X2" $(" b # ) # " $("&86 " $(" b # # # b $(" c " FE # 6 " Gy $!"Xx6 " $(" D #
IR, un point xe de
est un r el e
solution de
"
W XD
E # V $(" D
T $6
E # y $(" D
# b $" t "
Q # (" b
40
les valeurs n tant pas racines de e , on peut ecrire cette equation, entre autres, sous la forme : , sur un intervalle qui isole une racine et sur lequel est d nie, e les racines de sont les points xes de . D nition 2 . Soit e IR IR, sil existe tel que, pour tous et , alors on dit que est contracel ments de IR, on ait e tante (ou est une contraction) sur IR. Si lin galit est stricte, on dira que est e e strictement contractante. est appel rapport de contraction. e
Le th or` me suivant fournit une condition sufsante de convergence du proe e cessus des approximations successives. IR IR v riant les conditions suie Th or` me 1 (du point xe) . Soit e e vantes : (cest a dire ) 1. ` 2. est une application strictement contractante dans , de rapport de contraction , alors pour tout la suite r currente d nie par, e e
converge vers lunique solution de , avec . De plus, la formule suivante donne une majoration de lerreur commise a lit ration , lors du calcul e ` de ,
Il est souvent d licat de d terminer un intervalle e e dans lequel les hypoth` ses du th or` me du point xe sont v ri es, cependant on a le r sultat suie e e e e e vant. Proposition 2 : Si est d rivable au voisinage dun point xe , et si e , alors il existe un voisinage de tel que pour tout dans , les it rations, e , convergent vers .
} # U" b
qiF rphgfe
qrpFhgfe i H I" # b $(" Q t " jQ" b ` IH F # (" t q F pirfe W H"" d Y qiF H d rphgfe " u qprFfe i b FqiF H # b qiF H srphgfe $(" Urphfe "
"
qiF rphfe
d "
T 6
p j f } # su $(" b b "
# $(" b b
$ 7 e } gEe u 6 u # F H # $(" b " Ev$!"wp74 $(" b # xw # # $(" D F E # kpo " 6 # lk G $!"a5qn'$!"m'4 R b "
u b &# b 6 T $6 R b E # $ D er ~i|8'@3 !" mXr {'@3 rz q #} ) u ) 4 rF u ) 4 q y r vt53 s " u ) 4 r $(" D # " b qprfe iF b "
Q b aQ ` # !" v W "
41
Proposition 3 : Soit une solution de l quation e , si est continue au voisinage de et si , alors pour toute condition initiale , la suite d nie par et e ne converge pas vers -
ICIIIIIIIIIIIIIIIIIIIII n corrections faites le dim 11 nov 01 IIIIIIIIIIIIIIIIIIIci Mettre ici la remarque ecrite dans lexo 5 vieille p :57 Remarque : Attention ... R sum et Interpr tation graphique : e e e On estime
1. si , (gure 1), la suite ne converge pas vers , cest un point r pulsif, les it r s successifs de la condition initiale e ee (ou ceux de ) s loignet de , on elimine alors la m thode. e e , (gures 2 et 3), la m thode converge, est un point ate 2. si tractif, les it r s successifs de la condition initiale ee (ou ceux de ) se rapprochent de plus en plus de , (il faut alors d terminer un intervalle e contenant , dans lequel et ), deux cas se pr sentent : e (a) , (gure 2), si la suite est croissante, elle est d croissante sinon (cas e o` la condition initiale est ). Dans les deux cas, elle tend vers . u
d "
(b)
, (gure 3), la suite est altern e, deux it r s successifs de e ee encadrement de et la suite converge vers .
donnent un
qiF prfe
d "
"
d "
d "
p @j f } # $!" b "
d "
"
} U" b #
42
y= x
y= x
xo xo
x x
xo
x
xo
x
xo
y= x
f(x)
f(x)
f(x)
Figure 1.
Figure 2.
Figure 3.
(c) si , cest un cas plus d licat car la m thode peut converger e e (gure 4) ou non (gure 5) :
y=
y=
Dans la gure 4, les it r s successifs de ee convergent vers si , et divergent dans le cas contraire. Dans le cas de la gure 5, ils diveegent quelque soit la position de .
2.3
Une m thode it rative pouvant converger plus ou moins rapidement (voir les e e gures 6 et 7), il existe des notions qui mesurent cette rapidit de convergence, et e mesurent donc la diminution de lerreur dune it ration a la suivante. e ` D nition 3 : La m thode d nie par e e e et est dite dordre p si a une limite r elle strictement positive lorsque n tend vers e . On dit alors que la m thode a un taux de convergence egal a . e ` `
" d
"
d "
d "
# } U" b
f(x)
f(x)
Figure 4.
Figure 5.
"
5r |
43
y=
y=
Figure 6.
Figure 7.
converge vers et si est sufsamment d rivable e Th or` me 2 : Si la suite e e au voisinage de alors lordre de la suite est le plus petit entier tel que : et . De plus on a
Remarque 2 : Une m thode est dite lin aire lorsquelle est dordre 1, on a alors e e . Elle est dite quadratique si elle est dordre 2. Remarque 3 : Pour une m thode dordre p, lorsquon passe dun it r a lautre, e ee` le nombre de chiffres d cimaux exacts est environ multipli par p. e e Tests darr t des it rations. e e Si le processus it ratif converge, la solution , etant la limite de la suite, ne peut e etre atteinte quau bout dun nombre inni dit rations. Par cons quent lalgo e e rithme sera arr t en utilisant lun des tests suivants, o` d signe la pr cision a ee u e e ` laquelle on souhaite obtenir la solution, (i) (ii) (iii) , cest a dire ` est presque nulle. Le processus sera consid r comme non convergent, vers la solution cherch e, ee e si la pr cision souhait e nest pas atteinte au dela dun nombre raisonable e e dit rations, e , x a lavance. e` Remarque 4 En pratique, lorsque on cherche la racine a ` it rations seront arr t es lorsque deux it r s successifs e ee ee et m mes d cimales, de la premi` re a la e e e ` .
a la `
"
Q # !" b
E # y$" b
o` u
it ration. e
Q Q " 6 " ` w Q haQ ` # $" e hb } W aQ l EtU" b E # b # U" e j vdaas U" Q # e Q W # (" " " # ("
b
44
2.4
2.4.1
Soit a r soudre l quation ` e e , o` lapplication est continue, stricu tement monotone sur telle que , et soit la racine cherch e, e situ e dans e . Dans cette m thode on remplace le graphe de restreint a e ` par le segment de droite joignant les points et , (cest a dire que lon interpole F par un polynome de degr 1) ; ce segment coupe laxe e en un point dabscisse . Soit le point de coordonn es e , on reit` re e alors le m me proc d quauparavant en joignant e e e et lextremit xe, ou . e Lextremit xe est celle telle que e . Voir la gure 8 ci-dessous.
Cest une suite d croissante et born e, donc convergente, ( e e ). 2. si lextremit e est xe, elle s crit : e
i " PPPP Q y PPP W "y" " d e !e Q Q ` jQ P Q # (" bc d| # (" D 6 " f W "" Y d Q d" " 2 W PPP " Q jQ ` (e Q # (" D 6 " yW " i " Y d
1. si lextremit e o` : u
E # $!" D $!" D # W W" W # m# W !" D F W (" " F # F # i D ai m# f D hf # qprfe iF D E # i D # f qiF rphfe " E # D $!" D
f(x)
xo x1 x2 A
Figure 8.
et
d "
# t
qiF prfe
donn , e
45
Exemple 3 sur , on a et donc . Dautre part sur , ainsi , cest donc lextremit e qui sera xe, gure 9(c). Par cons quent, en e commencant le processus par , on trouve ais ment : e , ... etc ..., ainsi, pr` s. e a `
2.4.2
M thode de Newton e
par la droite Lid e consiste cette fois ci a remplacer larc de courbe e ` tangente a la courbe aux points A ou B, lintersection de cette derni` re avec laxe ` e d termine le second el ment e e de la suite cherch e. On reit` re en passant la e e tangente a la courbe au point dabscisse . etc... `
f(x)
x2
x1 xo
Figure 10. Dune mani` re g n rale les it rations de Newton pour r soudre e e e e e sont : , n=0,1,2 ... donn e dans e
Cette m thode est bien d nie pour voisin de a condition que e e ` . D terminer un intervalle e sur lequel il ya convergence de Newton nest pas toujours facile, mais le th or` me suivant donne une condition sufsante. e e
E # $(" D
Q t# (" D
"
PE E } Gc " } " d ##} } ~C D F E q H } F e " # q $(" E D } 6 " } F W e y) g " $("W D # W" W"
P GE " E
46
Th or` me 3 (convergence globale de la m thode de Newton) Si e e e v rie : e 1. , 2. (stricte monotonnie de ), 3. (concavit de dans le m me sens), e e Alors en choisissant tel que , les it rations de Newton e convergent vers lunique solution de dans [a,b].
(Dune it ration a la suivante, le nombre de chiffres d cimaux exacts de la solution e ` e cherch e est multipli environ par deux, donc e e pr sentera deux fois plus de e d cimales exactes que ). e
2.5
Une m thode it rative peut etre acc ler e en transformant la suite e e e e en une suite convergeant plus rapidement, vers la m me limite, ou en transformant e de facon a obtenir une m thode dordre plus elev . Voici quelques m thodes ` e e e simples dacc leration de la convergence. e
On d montre que la suite e converge plus rapidement que la suite vers la m me limite . Mais il est conseill deviter cette formulation de e e qui est num riquement instable, et de l crire sous la forme equivalente suivante, mais e e plus stable :
@ h(
""!
""!
@jG
5jG
$ #
0 % $ &#
h8$ah~ jh $a ahh
0 % $ )#
' % $ (&#
$ah
@ h(
Soit en
2.5.1
dAitken
5h!
a
Exemple 4 sur , on a donc . exple ... A FINNNNNNNNNNNIIIIIIIIIR Par cons quent, en commencant le processus par e a , ... etc ..., ainsi, `
et
$ah
qj 8 v7 $( h
Th or` me 4 : Si e e quadratique.
pr
$! v(! (
G @ dh!
47
2.5.2
Lorsquon dispose de deux m thodes pour r soudre la m me equation, on peut e e e les composer pour obtenir une m thode plus rapide. e avec le La m thode de Steffensen compose une m thode it rative e e e proc d e e dAitken : do` les it rations suivantes : u e
De m me, cette ecriture nest pas num riquement stable, do` la formulation suie e u vante, plus stable :
""CB
2.5.3
M thode de Regula-Falsi e
peut saverer tr` s co teux e u Dans la m thode de Newton, le calcul de e en temps de calcul, tr` s complexe ou m me impossible, on remplacera alors cette e e deriv e par son approximation e
On d montre que cette m thode est dordre e e , donc inf rieur a e ` celui de la m thode de Newton ; cependant Regula-Falsi peut sav rer plus rae e pide que Newton puisque nexigeant quune seule evaluation de fonction (celle de ), ayant et calcul lors de lit ration pr c dente, alors que Newe e e e e ton en exige deux, et . Ainsi, avec deux evaluations de fonctions, on effectue une it ration de Newton e et on multiplie environ par deux le nombre de d cimales exactes (puisque cette e m thode est quadratique, th or` me 4) ; d signons par le temps n cessaire pour e e e e e cette it ration. Dans la m thode de Regula-Falsi, durant le m me temps , on e e e effectue approximativement deux it rations (puisquune seule evaluation de fonce tions est faite par it ration), et on multiplie ainsi a chaque it ration, environ par e ` e , le nombre de d cimales exactes, ce qui est meilleur et explique e la rapidit de Regula-Falsi par rapport a Newton. e `
R Q " R
""!
et
donn s, e
5jG
h(
1 2
$ah
""! @ A8
0 "8
5j
0 "8
dh!
' 98
H I
$jhm p Gh
h(! h(
$ah
5 1 6 F GE
h! h(
S T
H I
48
2.6
Exercice 1 : Parmi les fonctions suivantes lesquelles sont contractantes et sur quel intervalle si celui-ci nest pas indiqu : e (a) , ; (b) , ; (c)
t r s 1
(d)
Exercice 2 : Voir si chacune des fonctions suivantes admet zero, un ou plusieurs points xes, puis donner pour chacun un intervalle de separation : Exercice 3 : Montrer que l quation e ; IR, et
y w x d
Exercice 4 : D terminer a laide de la m thode du point xe les deux racines r elles de e ` e e avec une erreur . Utiliser pour lune de ces racines la m thode it rative e e , et pour lautre . Exercice 5 : Soit la fonction , on se propose de trouver les racines r elles e de F par la m thode des approximations successives. e Montrer que F poss` de une seule racine r elle e e . Etudier la convergence des trois m thodes it ratives suivantes : e e donn e et ; ( ) ( ) ;
G$8 C
Exercice 6 : Soit l quation e dans IR . Montrer que la m thode it rative d nie par e e e gente (v rier les hypoth` ses du th or` me du point xe). Choisir e e e e initiale de lit ration, dans lintervalle de convergence puis trouver e suite. Donner lordre de la m thode. e
p
a `
pr` s. e
v
t@a $!
98 5 ( $! j5 9( $!
~ 8
$!
$!
d e
V t
a p i &`
G $8 C
a c u
$ $(
9 $!
a c
'
a b f
a h
` X V YWU $ # f p i q&` p
u v
f g
$! $(
'
$ #
U X
s 5a
$! $! $! $!
# H
1 1 1
49
Exercice 7 : On veut r soudre dans IR l quation e e o` , u , a) 1) Montrer quelle admet une seule racine , montrer que . 2) Montrer que la m thode it rative : e e diverge. 3) on consid` re alors e , (remarquer que existe), montrer que la m thode it rative : e e converge. En posant montrer que est de signe oppos a , quen conclute` on ? Donner le bon test darr t des it rations pour avoir a e e ` pr` s, puis donner e cette racine approch e. e b) Retrouver a laide de la m thode de Newton. ` e Remarquer que Newton est dordre 2. Exercice 8 : On applique la m thode de Newton au calcul de la racine carr e dun r el positif e e e . Montrer que les it rations e permettent daboutir. , . Montrer que , . On pose On applique la m thode de Regula-Falsi au m me probl` me, expliciter les e e e it rations obtenues. e Donner lexpression de en fonction de et . En deduire que lordre p de Regula-Falsi verie . Exercice 9 : e 1. D montrer que si est une fonction continue d rivable dun intervalle de e IR dans lui m me de d riv e n gative et born e sur I, alors on peut mettre e e e e e l quation e sous la forme , o` est une application u contractante de .
q d
2. Utiliser la question pr c dente pour trouver la racine e e avec une erreur ; prendre .
de
qjj5j
qj
f 1
d e
a $! $ ! 5h! $ah $! $!
n Y$ u U p w j ""CB ' $
s $a 5jG
m &
$!
$!
1 6
$ l k #
1 1 h i
1 6
$a $ah $(
1 g u P 6
jjj@jG h( $jh
aV
$j
o p
$!
v k
h
H k
$ #
dans
50
2.7
s Br
Exercice 11 : D t rminer en utilisant simultan ment les m thode de Newton et de Lagrange la ee e e racine situ e dans [0,1], avec une erreur e de , , . puis de Retrouver ces racines gr ce a la m thode des approximations successives. a ` e Exercice 12 : On cherche les racines r elles de l quation e e . admet deux racines, lune 1. Montrer que la fonction evidente quon donnera, et lautre que lon note (que lon veut approcher dans la suite). 2. Localiser dans un intervalle de longueur 1/4. 3. Ecrire la m thode de Newton relative a . Donner un choix de la condition e initiale des it rations de Newton qui assure la convergence du processus. e 4. Soient les m thodes dapproximations succesives suivantes : e (a) et (b) Pr ciser si elles convergent ou divergent. En cas de convergence indiquer e un choix de la condition initiale . de . en utilisant simulP
1. Montrer que l quation e admet une unique racine sur IR, que lon notera . Localiser entre deux entiers cons cutifs ; soit lintervalle obe tenu. 2. Soit la m thode dapproximation successive suivante : e
d
x
d e
. On pose
$!
Exercice 13 : Soit , localiser graphiquement la racine En donner une approximation avec une erreur inf rieure a e ` tan ment la m thode de Newton et de la corde. e e
de l quation e
$2i i $! $8 C
'
u $ # v
a
$ # a
$jh
$! $(
h $ah
t W(B
5h8
X 8I
u
t
q
$ah
$!
51
4. Ecrire la m thode de Newton pour . Donner une valeur explicite de qui e assure la convergence de la m thode de Newton (si cette converegence est e possible), justier. 5. Si lune des trois m thodes propos es ci-dessus converge, lutiliser pour e e donner une approximation de a ` pr` s. e
(a) Montrer par une etude analytique, puis par une etude graphique, que l quation (1) admet deux racines et que lon localisera chacune e dans un intervalle de longueur 1. , la plus (b) Proposer une mhode it trative utilisant le point xe : t e simple possible pour l quation (1) ( viter la fonction log). e e (c) En utilsant le th or` me du point xe, et la m thode it rative e e e e ci-dessus avec donn , montrer que lune des deux racines e (not e ) est attractive, lautre r pulsive. e e (d) Montrer que deux it r s successifs de la suite donnent un encadrement ee de la racine .
o z ~ j z u | } u
(f) montrer que lordre de cette m thode est plus petit ou egal a 1. Le e ` v rier num riquement` la question ci dessous. e e a 2. Par la m thode de Newton. e
(a) Ecrire la m thode de Newton relative` l quation (1). e a e (b) V rier que cette m thode converge vers la racine e e et donner une valeur explicite de la condition initiale qui assure cette convergence.
t Wc a
` X YV
$(
j
pr s. e
j
pr` s. e
5 as x h
(o` u
$jh
$!
1 6
u x
(1) :
~a '!
$(
z
d e
$(
w Y$ #
y z
u v
$ah
v
x
@h!
{ d
), le
52
Exercice 17 : Soit la fonction , on se propose de trouver les racines r elles e de par la m thode des approximations successives (m thode du point xe que e e lon appliquera correctement), puis par la m thode de Newton. e
d
(b) Etudier la convergence, vers , des trois m thodes it ratives suivantes : e e donn et : e
q0
(b) V rier le th or` me de convergence globale de cette m thode sur un e e e e intervalle que vous donnerez.
2.
$ #
(iii)
$ #
(ii)
4
(i)
1.
(a) Montrer que poss` de deux racines r elles, une evidente que lon e e donnera, lautre que lon localisera dans un intervalle de longueur .
d c
a `
3. Ecrire la m thode de Newton pour . Donner une valeur explicite de e assure la convergence de la m thode de Newton vers . e
qui
j
| }
2 $!
Bj
G8
p
. D terminer e
dans ce cas.
x a
, on explicitera .
t W&
rph
@h(
1 6
$ #
5h!
` X YV
$! $ah
dans linter-
Gg
t W
, cette
t
53 pr` s. e
Exercice 18 : On veut r soudre l quation non lin aire dans IR, : e e e , o` est une apu plication deux fois contin ment d rivable de IR dans IR, on propose les it rations u e e donn es par e et donn dans IR ( e ), o` u
Remarque : On rappelle quune m thode e est dordre si et ( etant la racine cherch e). e
o 1 6 A n ~ m 1 A n ~ m 1 ""
$ 5h! $ah a
j
3. Partant de
, donner alors
a `
pour calculer
pr` s . e
j
a `
$ $ $(
a partir de `
t
a x
f x
f a
a f
u f
f f
u u u
f f
f f
f f
4
f f f f
f 2jf
f f
f
9 7$!
f f u f a 1 1 a f f
$(
1 P
Exercice 1
2.8
donc, dapr` s la proposition 1, est contractante de rapport de contraction e inf rieur ou egal a . e ` (b) . Soient , montrons que . On a
et
En effet, dune mani` re g n rale, on peut montrer que e e e Supposons que alors
a
9
f
f f 1
G 7$(
1 f P
$(
1
$
` X 9V
$(
1
$@
u
V 0 $! $(( | 8 $! 8 m $( G $!
U a 1 B
et
donc, . Ainsi, est contractante de rapport . (d) . est d nie sur e mais ny est pas lipschitzienne.
7 1 f g f ) # f 1 f f a f 1 1 a
a a f
f
54
p i `
donc non bornable sur tout intervalle contenant ; ainsi ne peut etre lipschitzienne sur . En fait, on montre que est lipschitzienne sur tout intervalle avec
t r a t r 1
. Ainsi, gr ce a la a `
pour
Exercice 2
dabscisse v riant e . Par abus de langage, et dans tous les exercices qui suivent, on dira que est le point xe de (au lieu de labscisse du point xe de ). Ici est d nie sur e et on a
1
et
Posons
; est continue sur IR et d rivable sur IR et e , donc est strictement croissante sur . Dautre part, , donc . Ainsi, dapr` s le th or` me e e e
est clairement la seule solution sur cons quent le seul point xe de . e D montrons le autrement : e
1 1
$!
$(
$!
En conclusion,
t
En outre,
est contractante si
, donc si
q
a t
proposition 1,
. , cest a dire `
et
V h
est un point
))
t
t
t
$(
q
Posons
. Ce rapport vaut
, pour
, est born . e
6a
$!
1
5 C $! x G 7$! d G ('
1 f d e ) u 1 1
56
de la valeur interm diaire, il existe un et un seul r el e e tel que ; celui-ci est donc le seul point xe de sur . Le lecteur pourra ais ment d montrer que cela reste vrai sur tout e e . (b) Points xes de . Posons . est continue et d rivable sur IR, et e , donc est strictement d croissante. Dautre part, e et . Dapr` s le th or` me de la valeur interm diaire, e e e e il existe un et un seul r el e tel que . Ce r el est donc e lunique point xe de sur . De m me, on peut ais ment d montrer e e e que cela reste vrai sur tout IR. (c) Points xes de .
Donc 2 est lunique point xe de sur IR ; ce point xe est dit triple a cause ` de la puissance du terme .
4 1
En cons quence, est strictement croissante sur e , strictement croissante sur et . Ainsi, IR , donc est strictement d croissante. e Dapr` s le th or` me de la valeur interm diaire, il existe un et un seul r el e e e e e tel que . Ce dernier est lunique point xe de .
v $! p C
v v X
$((p
. , on a :
75 ! $(
$!
q 8t
s $!(
5G ~ 5Gg {
I
5 !
5 ! $! C5 !y $( qjG jG
5 9! $!
u
5 ! $( 5 !
4
4
$(
t aC vv t $! $(
# u 1 1 # u 1 1 1 w # u
q
u
u
4
p i `
i
f a f
p i q&`
X I c C 9
u
p i `
G $! X 8I
e f f
Exercice 3
V
a
$(
p i `
On a
, car
5V
` X YV
$!
exercice 4
Localisons la racine de cette equation. On a et donc , et comme est d rivable sur IR et e sur alors, gr ce au th or` me de la valeur interm diaire, il existe un unique r el a e e e e solution de l quation e . On a et . Comme est monotone sur IR (puisque sur ), on a donc .
1 1 Q
un5a $(! ~C s $
A
ainsi
Etudions donc la m thode it rative e e . Remarquons tout dabord que si cette m thode converge, elle converge bien e , si est la limite de la suite , alors vers une des racines de
5h!
5a c
donc
D montrons que e
solution de l quation e 57
58 et
, on a
exercice 5
Soit l quation e . Il est clair que est continue et d rivable sur . e On a , , donc . Dautre part, sur . Donc, dapr` s le th or` me de la valeur interm diaire, il existe e e e e une seule solution telle que . (a) Etudions la convergence de la suite . Tout dabord, cette suite, si elle converge, conduit bien a une racine de ` car si est la limite de la suite , alors
4 s A
donc
h( $ah $
Si on cherche a pr` s, on arr tera les calculs a lit ration telle que ` e e ` e . Ainsi la solution ici vaut a ` pr` s. e b) Lautre solution est obtenue gr ce a la m thode it rative a ` e e . Cette question est laiss e en exercice. e
1 z o
j 55aGG
'
$ #
&
$! 5
!q ~G@5@ 5@aG55jGs !q G55@ 55aG@5aGG ~G55jGs !q G55jG 5a 5s !q qjg c 5jv $ ! $jh jG $!
A 1 1 1
5 8 5 5 ~C $!
7m$jh!
$(
1 1 1 1
$ #
5a
59
Donc , et comme est continue, il existe un voisinage de tel que , et . Donc cette m thode ne peut pas converger e dapr` s la proposition 3. En effet, gr ce au th or` me des accroissements nis, on e a e e a .
6
n7 h$ah $( X @ U
jf
or
le point xe de
v rie e
~ U
+
h Q
av ~ ~t7 h ~v
donc
G v $
. Cependant on a
$! $!
5 $( ~ 5h! $ah
de
dans
, car si
Ainsi, cette suite diverge et la m thode est a rejeter. e ` (b) Etudions la convergence de
1
f f
. . .
hh h$jh
f
h! 7m$jh!
Q
1 f 1
dh!
60
On a
converge vers lunique racine de l quation e Calcul num rique de cette racine a e ` pr` s, a partir de e ` 0 1 1 1.144
1 6 j B
exercice 6
Soit l quation e dans . Consid rons la m thode it rative d nie par : e e e e
Montrons dabord lexistence dune solution pour cette equation. Soit , on a sur IR , donc l quation e admet au plus une racine. Dautre part on a et , donc ; ainsi, dapr` s le th or` me de la e e e valeur interm diaire, il existe une unique racine e solution de l quation e . Appliquons la M thode du point xe pour e .
B
s $!(
G2w5h8
@h( $jh
Gw$8 C
1 6
"
Donc
B
$(
(~ 5 m
a 5 x 5h! $ah @ 8
1 6
donc
. Donc
~C
$(
donc
et
v $
5 $! h 5h! $ah
dans car si
1 x
1
dh!
61 car
Donc, si , dapr` s le th or` me du point xe, il existe une e e e unique racine solution de l quation e . Par exemple, on v rie que e . En effet, et . Calcul num rique de cette racine a e ` et pr` s : e 0 1 0.7 0.730 2 0.748 3 0.758
7 0.770 a `
exercice 7
1. 1) Posons , th or` me de la valeur interm diaire a sur e e e ` est continue sur , . , , donc est strictement monotone sur . Dautre part on a , et comme
# p 1 p
IR . Appliquons le o` u . et
# a
existe tel que ; par cons quent, e , et dapr` s le th or` me de la valeur interm diaire, il existe un unique e e e e (dou ) tel que , et donc tel que . 2) Si converge, elle conduit bien a la racine de l quation car ` e cette derni` re v rie e e donc
p v A 1 A p A A A p 1 6 1
, et donc la m thode e diverge pour tout . 3) existe car est continue et strictement croissante donc bijective. Montrons que est convergente. Attention a la notation utilis e : ` e d signe la r ciproque de et non e e .
1 f 1 f 1 # 1 1 1 p 1 1
Mais,
h5
Soit l quation e
$( q$(q $( $ ! dh( $ah dq8 h! $! $jh $! djhgVv U $ 5h( $jh $ qqGwI qq { C~C vzis qjw $( ~ qjhg i$! d $! qjh8 qjwU qjh V jhg S $( $( $! $! $!
o` u
a `
pr` s, et e
5 Gs
, alors il
a G
j a vG G p Gg Gp Gm $! rph @ x $! r I
Q Q j
qjG pr G
1 Q 1 d
Q (
hG G Gs rph8 rphg
u Q 1 1 (
62 . On a bien alors
Par cons quent e . Ainsi la m thode e converge au voisinage de , dapr` s la e proposition 2. 4) Posons et . La m thode e converge (dailleurs, on a et , ). Dautre part, gr ce au th or` me des accroissements nis on sait quau voisinage a e e de , il existe compris entre et tel que :
$ # s u s # u z A f # f u s # u 1 f s 1 f u u
Ainsi, . Or, IR . Donc et sont de signes oppos s, par cons quent deux it rations successives donnent un e e e encadrement de . 5) Un test darr t des it rations est : e e . Prenons avec . On a bien sur et car :
d 6C U d u 7a d f u f f
et est monotone sur Calcul num rique de la racine a e ` pr` s. Soit donc la m thode e e et 0 1 2 3 4 5 6 7 8 1 0.367 0.692 0.500 0.606 0.545 0.579 0.560 0.571 9 10 11 12 13 14 15 0.564 0.568 0.566 0.567 0.566 0.567 0.567
a `
pr` s. e
$jh
$(!G qq j h$ah $j $a 5 G $j 8t$!G $ h(q@q $ 75h! $jh $j h q n $!(G $(!G h $ah $! h( $ah $! 9 0 t G ux $! djhg
~C G aG
j qj@G
&
u x
, donc
et
, car
$!
#
d
$!
$(
u v
d
1 1
Or,
, donc
$!
, donc , alors
$ #
1 u
63
Dautre part on a et , donc et la racine est situ e dans e , elle est unique puisque est strictemnet monotone, car pour tout . On a aussi pour tout . Ainsi dapr` s le th or` me de convere e e gence globale de cette m thode (voir th or` me 3), pour tout e e e tel que lit ration de Newton converge. Prenons alors, par e exemple, , alors , donc la m thode e
w $ # $ # u u t # u # u
$ #
64
2.9
On pr sente, dans la suite, la mise en uvre de la m thode de Lagrange (cf. e e paragraphe 2.4) ainsi que la m thode de Steffenson (cf. paragraphe 2.5). Cette e derni` re est ecrite sous une forme g n rique, permettant la composition dune e e e m thode it rative quelconque avec le proc d e e e e dAitken. Nous illustrons ces programmes, par des exemples de calcul qui permettent de comparer ces deux m thodes. e
2.9.1
Nous allons utiliser dans la suite deux processus it ratifs, a savoir les e ` m thodes de Lagrange et de Steffensen. Ces deux processus sont bas s sur des e e calculs similaires : calcul dune formule de r currence et processus de r p tition e e e jusqu` une eventuelle convergence, li e a un crit` re donn . Beaucoup dautres a e ` e e sch mas num riques sont susceptibles de suivre de tels processus. Pour cette e e raison, nous avons commenc par d nir une classe abstraite de description e e dun processus it ratif, appel e IterGene. Cette classe est abstraite car elle e e contient une m thode abstraite, non impl ment e, correspondant a la formule e e e ` de r currence. Celle-ci va d pendre de la formule sp cique dune classe partie e e culi` re qui en d rivera. Par contre, un sch ma de construction de suite r currente, e e e e susceptible de converger, peut etre impl ment dans cette classe abstraite en e e sappuyant sur sa formule de r currence, elle-m me abstraite. e e Il nous faut g rer la convergence dun processus it ratif gr ce a une e e a ` v rication de pseudo-stabilit sur deux it r s successifs. Dans le cas o` il ny e e ee u a pas convergence, un nombre maximum dit rations est pr d ni et permet de e e e stopper le processus. Dans ce cas, il reste alors a renseigner les programmes appe` lant de la non-convergence. Pour cela, nous utilisons un m canisme dexception e qui est sp ciquement adapt a un tel traitement ; il sera alors capable de faire ree e` monter, en cascade, linformation de non-convergence, aux diff rents programmes e appelants. On d nit alors une classe exception el mentaire capable d tre evalu e e e e e sous la forme dune chane de caract` res et impl mentant, pour cela, la m thode e e e toString.
class NonConvergenceException extends Exception { public String toString() { return("Defaut de convergence"); } }
Nous pouvons alors d nir la classe IterGene qui est compos e : e e des donn es xn, epsilon, maxIter qui correspondent respectivee ment, au terme courant du processus it ratif, a la pr cisison de convere ` e
65
gence et au nombre maximun dit rations autoris es. On impl mente des e e e m thodes permettant de xer leurs valeurs ; e dune m thode abstraite dit ration iter, sans param` tre, qui actualisera le e e e terme courant du processus it ratif. Nous d crivons aussi, une autre version e e de cette m thode, iter, avec un param` tre qui correspond a une mise a e e ` ` jour du terme courant, avant lapplication du processus it ratif ; e dun calcul de suite recurrente calculSuite sappuyant sur la m thode e dit ration et ecrite sous deux versions : sans param` tre ou avec un pae e ram` tre bool en qui permet dafcher une trace des termes successifs de e e la suite calcul e. e
import java.lang.*; import java.io.*; abstract class IterGene { double xn; // terme courant de la suite double epsilon; // precision de convergence int maxIter; // nombre maxi diterations // fixe la valeur du terme initial de la suite : public void set_xn(double x0) { xn = x0; } // fixe la valeur de la precision : public void set_epsilon(double precision) { epsilon = precision; } // fixe le nombre maxi diterations : public void set_maxIter(int m) { maxIter = m; } // methode abstraite du calcul dune iteration // a partir de xn courant : abstract public double iter() ; // methode de calcul dune iteration // a partir dune valeur x donne : public double iter(double x) { set_xn(x); return iter(); } // calcul dune suite recurrente //a partir de iter et jusqua convergence : public double calculSuite(boolean trace) throws NonConvergenceException {
66
double xOld; int nbIter=0; if (trace) { System.out.println("valeurs successives calculees :"); System.out.println(xn); } do { xOld=xn; iter(); nbIter++; if (trace) { System.out.println("iter. "+nbIter+" : "+xn);} } while (Math.abs(xn-xOld) > epsilon && nbIter <= maxIter); if (nbIter > maxIter) throw new NonConvergenceException(); return xn; } public double calculSuite () throws NonConvergenceException { return calculSuite(false); } }
2.9.2
La m thode de Lagrange e
Nous d crivons, maintenant, la classe mettant en uvre la m thode de Lae e grange, vue dans le paragraphe 2.4 et qui, a partir dune application continue, ` strictement monotone sur et telle que , construit le processus it ratif suivant : e
La classe IterLagrange est telle que son constructeur poss` de les pae ram` tres suivants : la valeur initiale e et une fonction quelconque r elle dune e variable r elle (les r els etant repr sent s par le type double). e e e e Le passage dune fonction, comme param` tre, se fait gr ce a une interface e a ` qui sera impl ment e effectivement, par la fonction particuli` re utilis e (comme e e e e d crit en 1.5.7). Cette interface propose une m thode d valuation calcul de la e e e fonction pour un param` tre donn . Elle s crit : e e e
interface FoncD2D { double calcul(double x); }
i(! (
@ n # m
ou
de sorte que
$ # n 9$ # m
VzC
h(xh $jh a
rph
67
Nous pr sentons ci-dessous, un programme de test de la m thode de Lagrange, e e e en commencant par d nir la fonction , dans une classe impl mentant linterface e FoncD2D correspondant a : `
La valeur initiale de la suite r currente est la borne 5, qui satisfait a la condition e ` exprim e pr c demment. e e e Le programme correspondant s crit : e
import java.io.*; import FoncD2D; import IterLagrange; class MaFonction implements FoncD2D { public double calcul(double x) { return x*x*x-8; } }
~ 5
Q u
$!
sur lintervalle
68
class TestLagrange { public static void main(String args[]) { MaFonction f = new MaFonction(); IterLagrange rechercheZero = new IterLagrange(f,5); rechercheZero.set_epsilon(1E-6); try { double resultat = rechercheZero.calculSuite(true); System.out.println("le zero trouve vaut : "+resultat); } catch(NonConvergenceException e) { System.out.println(e); } } }
Nous donnons ci-apr` s une trace de lex cution montrant la convergence de la e e recherche en 45 it rations : e
java TestLagrange valeurs successives calculees : 5.0 iter. 1 : 1.225806451612903 iter. 3 : 1.575783340029592 iter. 5 : 1.7721357917725993 iter. 7 : 1.8801284843229529 iter. 9 : 1.9378012139273417 iter. 11 : 1.9679808942878763 iter. 13 : 1.9835875282989195 iter. 15 : 1.9916061843487987 iter. 17 : 1.995712170773491 iter. 19 : 1.9978109552571226 iter. 21 : 1.998882781401325 iter. 23 : 1.9994298969642061 iter. 25 : 1.9997091067417003 iter. 27 : 1.9998515787290103 iter. 29 : 1.9999242732103275 iter. 31 : 1.9999613634529168 iter. 33 : 1.999980287364067 iter. 35 : 1.9999899425035552 iter. 37 : 1.9999948686166795 iter. 39 : 1.9999973819453114 iter. 41 : 1.999998664257298
iter. iter. iter. iter. iter. iter. iter. iter. iter. iter. iter. iter. iter. iter. iter. iter. iter. iter. iter. iter. iter.
2 : 2.8774769746022884 4 : 2.3837064484468686 6 : 2.183912111336465 8 : 2.091190544058032 10 : 2.0458883891378012 12 : 2.0232527320893645 14 : 2.011822859470857 16 : 2.006021559594976 18 : 2.0030695016733913 20 : 2.00156536536722 22 : 2.000798472022616 24 : 2.00040733587803 26 : 2.0002078119872224 28 : 2.0001060232863277 30 : 2.00005409267069 32 : 2.0000275980820095 34 : 2.0000140805969857 36 : 2.0000071839631905 38 : 2.000003665283473 40 : 2.000001870041581 42 : 2.0000009541025854
69
iter. 43 : 1.9999993184984877 iter. 44 : 2.000000486786965 iter. 45 : 1.999999652295112 le zero trouve vaut : 1.999999652295112
2.9.3
La m thode de Steffensen e
Nous effectuons, maintenant, une impl mentation de la m thode e e dAitken avec une dacc l ration de Steffesen qui compose le proc d ee e e m thode it rative, not e . Nous utilisons la formulation stable d crite dans le e e e e paragraphe 2.5 :
""CB
La classe suivante, IterSteffensen, permet cette composition avec une m thode it rative quelconque, qui d rive de la classe g n rale IterGene. Par e e e e e ailleurs, elle d rive elle-m me de la classe IterGene, en tant que processus e e it ratif. Elle s crit alors : e e
import IterGene; class IterSteffensen extends IterGene { IterGene g; // methode iterative a composer avec d2 daitken // constructeur : IterSteffensen(IterGene fonc, double xini) { g=fonc; xn=xini; epsilon=0.001; maxIter=100; } // calcul dune iteration : public double iter() { double u1 = g.iter(xn); double u2 = g.iter(u1); xn = u1 + 1./( (1./(u2-u1)) -(1./(u1-xn)) ); return xn; } }
Nous donnons ci-apr` s un programme permettant de tester cette m thode et e e utilisant la m thode de Lagrange, comme processus it ratif a coupler avec le e e ` dAitken. La fonction , dont on cherche le z ro, est la m me que e e proc d e e dans le paragraphe pr c dent. On part de la m me valeur initiale e e e et on utilise la m me pr cision de calcul. e e
5jG
@ A8
0 "8
0 "8
' 98
$jhm p Gh
5 1 7 5 5 1 6
70
class MaFonction implements FoncD2D { public double calcul(double x) { return x*x*x-8; } } class TestSteffensen { public static void main(String args[]) { MaFonction f = new MaFonction(); IterLagrange methodeLagrange = new IterLagrange(f,1,5,5); IterSteffensen methodeSteffensen = new IterSteffensen(methodeLagrange, 5); methodeSteffensen.set_epsilon(1E-6); try { double resultat = methodeSteffensen.calculSuite(true); System.out.println("le zero trouve vaut : "+resultat); } catch(NonConvergenceException e) { System.out.println(e); } } }
Nous donnons ci-apr` s, une trace de lex cution montrant de mani` re spectae e e culaire lacc l ration de la convergence, par rapport a la m thode de Lagrange, ee ` e pour les m mes conditions. En effet, on passe de 45 a 5 it rations pour obtenir un e ` e r sultat nal qui est plus pr cis. e e
java TestSteffensen valeurs 5.0 iter. 1 iter. 3 iter. 5 le zero successives calculees : : 2.374697052247919 : 2.000046185893817 : 2.0 trouve vaut : 2.0 iter. 2 : 2.0174585514794128 iter. 4 : 2.0000000003264917
On note IR , lespace vectoriel des matrices carr es dordre et a coe ` efcients r els. Soit e IR et IR , on cherche le vecteur IR , solution du syst` me lin aire e e . Ce syst` me admet une solution unique e lorsque le d terminant de A est non nul, ce que nous supposerons dans la suite. e Remarquons que la r solution de ce syst` me a laide des formules de Cramer e e ` est impraticable lorsque n est grand, car ces formules n cessitent approximae tivement op rations arithm tiques el mentaires ; par exemple si n=15, cela e e e repr sente de lordre de 4 mois de calcul pour un ordinateur moyen effectuant e op rations a la seconde. Ce temps de calcul evolue de mani` re exponentielle avec e ` e . Nous rappelons dans la suite les principales m thodes, beaucoup plus rapides, car e polynomiales en temps : . Quelques m thodes it ratives : Jacobi et Gauss-Seidel. e e Les m thodes directes calculent une solution th orique exacte, en un nombre e e ni dop rations, mais avec une accumulation derreurs darrondis qui dautant e plus grande que la dimension lest. Par cons quent, pour des matrices de dimension importante, il est pr f rable e ee dutiliser des m thodes it ratives bas es sur la construction dune suite convere e e gente vers la solution du syst` me. Dans ce cas, le contr le de la convergence de la e o suite par une condition darr t renvoie une solution plus pr cise. e e
71
72
3.1
La m thode de Gauss engendre un algorithme ni exact dont lid e est de e e transformer le syst` me initial en un syst` me triangulaire (inf rieur ou sup rieur). e e e e
3.1.1
On donne ici lalgorithme de r solution dun syst` me triangulaire inf rieur. Il e e e se fait en remontant les equations de la derni` re ligne a la premi` re. e ` e Soit donc le syst` me e o` u est triangulaire inf rieure et e inversible. Dans ce cas, , puisque . Lalgorithme de r solution est : e
3.1.2
M thode de Gauss e
Pour la clart des explications, on applique la m thode de Gauss dans le cas e e . o` n=3. On suppose que u
au syst` me initial : e
a la combinaison `
equivalent
, on elimine le terme
dans
o` u
et
et
0 0 0
0 0
0 0 0
et le terme syst` me e
ce qui donne le
gr ce a
On elimine le terme
dans la ligne
gr ce a la combinaison a `
0 0 0 '
q G 5 q G2 G ~C q G G t G
jj5
pour
et
I
$
Yu
$ q
& n
f&
""
) n
s h
$ &$ D F $ i E g
D F E n
73
L tape de triangularisation de la m thode pr c dente revient a factoriser la e e e e ` matrice A en un produit de deux matrices triangulaires lune sup rieure lautre e inf rieure. En effet, les diff rentes etapes de la triangularisation peuvent s crire e e e sous forme matricielle. Si on pose , la matrice du second syst` me e est obtenue en multipliant a gauche ` par
n
Ainsi = . Les matrices et sont inversibles car leurs d terminants sont tous egaux a 1 et leurs inverses e ` sont faciles a calculer. En effet, on peut v rier quon les obtient en transformant ` e
m m ) m ) m m B m m m n
on a donc
G G G
De m me la matrice e
on a donc
G G
0 '
0 0
0 0
m T
3.1.3
Factorisation
o` u
et
m m m
6 n n
q
m m
G G
n ' ' ' ' ' n n m m n n m n n
n n
o` u
74
en leur oppos les termes gurant sous la diagonale, les autres termes restant ine chang s. On trouve alors e
Ceci se g n ralise a une matrice dordre n. Le lecteur pourra le traiter en exere e ` cice. Colmpl ment ecrit sur brouillon e Remarque 5 Lorsque n est grand, le nombre dop rations de lalgorithme e de r solution du syst` me triangulaire est equivalent a , car il requiert pour e e ` chaque : (n-i) multiplications, (n-i) soustractions et une division, soit au total op rations. Dautre part, le nombre dop rations de lale e gorithme de triangularisation est de lordre de . Donc, la r solution compl` te e e n cessite au total un nombre dop rations equivalent a . Pour e e , sur la ` m me conguration de machine que celle cit e en d but du chapitre, il faudra de e e e lordre dune seconde pour la r solution totale du syst` me ! e e Faire un paragraphe complet sur la m thode des pivots lignes ... plus remarque e sur le pivotage colonnes.
3.1.4
A chaque etape de calcul le pivot doit etre non nul, sinon une permu tation de lignes ou de colonnes simpose. Sur le plan num rique si le pivot est e trop petit (par rapport aux autres coefcients de la matrice ou par rapport a la ` pr cisison de la machine), le cumul des erreurs num riques peut etre important. e e Ainsi pour des raisons de stabilit num rique, il faut effectuer des permutations e e de lignes ou de colonnes de facon a aboutir a un pivot plus grand. On dira ` ` que lon fait un pivotage total lorsquon permute des lignes et des colonnes,
m &
Finalement, on obtient la solution du syst` me initial e successivement les deux syst` mes suivants : e
Si on pose , qui est triangulaire sup rieure, e le produit des deux matrices et :
!
en r solvant e
0 0 0 ' 00 0
auih $
I
75
sinon le pivotage est dit partiel. Si on neffectue quun pivotage partiel sur les lignes, cela ne revient qu` changer lordre d num ration des lignes du syst` me a e e e qui nest donc pas modi . Lorsque lon effectue un echange de colonnes, cela e revient a permuter les el ments du vecteur inconnu ` e qui sera donc diff rent e de la solution du syst` me initial. Dune mani` re pratique, dans ce dernier cas, e e il est donc n cessaire de m moriser toutes les permutations de colonnes an de e e pouvoir reconstruire le vecteur solution en respectant lordre de ses el ments e correspondant au syst` me initial. e (la notion de petitesse d pend de la pr cision de lordinateur utilis ), lerreur e e e darrondi ou de troncature peut etre grande, donc, pour des raisons de stabilit e num rique, il faut aussi amener par permutation de ligne ou de colonne de facon e a avoir un pivot assez grand en module ; on fait alors un pivotage. Remarqouns ` que si le pivot est nul apr` s tout pivotage alors la matrice est singuli` re. e e Exemple 5 A laide dun ordinateur ctif a 3 chiffres d cimaux signicatifs la e ` r solution du syst` me ci-dessous, qui est trait e dans lexercice 22 : e e e
donne sans permutation de lignes, la solution ; avec permutation de lignes, la solution . La solution exacte est , ce qui montre que la premi` re solution est e fausse alors que la deuxi` me est la meilleure que lon puisse obtenir, compte-tenu e de la pr cision de la machine. e
COMPLETER ce cours
aj5C ~qGs
4
0 j
p5G5@5
76
3.2
a) R soudre ce syst` me par la m thode de Gauss. e e e b) Factoriser la matrice du syst` me en produit e o` est une matrice triu triangulaire angulaire inf rieure (avec des 1 sur la diagonale principale) et e sup rieure, puis r soudre ce syst` me. e e e
1. Factoriser la matrice en produit puis r soudre le syst` me. e e 2. Trouver ( on rappelle que si M et N sont deux matrices (n,n) inversibles alors . Exercice 22 : Soit le syst` me lin aire : e e
Appliquer la m thode de Gauss a ce syst` me : e ` e a) directement, b) en permutant les deux lignes du syst` me. e Application avec et un ordinateur ctif a 3 chiffres d cimaux signica` e tifs. Quobtient-on dans les deux cas ? expliquer ces r sultats . e
U
{
B
et
o` : u
Exercice 21 :
Factoriser la matrice
en produit
o` : u
Exercice 20 :
8 8
t
@ 87 w 7
4
D F E
aC
, et
77
@ n aC n9
5 5
h h
ac
r p p 5 a q
4
0 at
0 ( s q "" 0 0 ) x
$ 8 x d p
D F E
78
3.3
Exercice 26 : R soudre par Gauss direct, puis par factorisation de la matrice le syst` me : e e
1. Donner la d composition e de o` est une matrice triangulaire a diau ` gonale unit et une matrice triangulaire sup rieure. Pour quelles valeurs e e de cette d composition existe. e
et
Exercice 28 :
1. La r solution de ce syst` me peut etre ramen e a celle dun syst` me lin aire e e e ` e e de dimension trois, linconnue etant facile a d terminer. Donner cette ` e inconnue et le syst` me e restant, que lon notera . 2. Factoriser la matrice en produit (o` u est triangulaire inf ieure a e ` diagonale unit et triangulaire sup rieure) puis r soudre le syst` me. e e e e
!
3. De
d duire e
et
, o` : u
et
3. En utilisant la d composition e
trouver
lorsquelle existe.
, o` : u
et
0
P U U # #
D F E
, o` u
et
79
1. La r solution de ce syst` me peut etre ramen e a celle dun syst` me lin aire e e e ` e e de dimension trois, linconnue etant facile a d terminer. Donner cette ` e inconnue et le syst` me 3X3 restant, que lon notera e , ( ). (o` est triangulaire inf rieure a u e ` 2. Factoriser la matrice en produit diagonale unit et triangulaire sup rieure), puis r soudre le syst` me. e e e e
1. La r solution de ce syst` me peut etre ramen e a celle dun syst` me lin aire e e e ` e e de dimension trois. Quelle est linconnue facile a d terminer. Donner ` e cette inconnue et le syst` me 3X3 restant, que lon notera e . (o` est triangulaire inf rieure a u e ` 2. Factoriser la matrice en produit e e e diagonale unit et triangulaire sup rieure) puis r soudre le syst` me. e
T
3. Trouver
et
, o` : u
m !
exercice 19
3.4
La matrice est ainsi triangulaire sup rieure, cest la matrice recherch e. e e Dautre part, on a , on en d duit donc que e
n n n n n n m
m n
m n m
n m
n
m n
t
~ 8 8
, o` u
87@ w 7
4
F E D
on calcule
m m
Posons
Donc, do` : u
, on calcule
, o` u
et
, o` u 80
m n m ! n
n m n
Y
P
P Y
Ainsi,
Pr santation de la m thode didentication e e R soudre e revient a r soudre ` e . On pose alors , la r solution du syst` me initial revient a r soudre successivement les deux syst` mes e e ` e e triangulaires :
Exercice 20
Finalement, on r sout : e
On a ainsi factoris e
, avec
sous la forme :
o` : u
. et
, o` u 81
m T
Q "
m n
do` : u
on calcule
m m
Donc,
La matrice est ainsi triangulaire sup rieure, cest la matrice recherch e. e e . On en d duit donc e Dautre part, on a
R solvons le syst` me e e . Cela revient a r soudre ` e puis dire a r soudre successivement les syst` mes ` e e
Q "
n
Q "
Finalement, on r sout : e
m n
Ainsi,
, avec
, o` u
. , cest a ` 82
83
Exercice 18
Cest un exercie sur le pivot de Gauss. Soit le syst` me lin aire : e e
a)Appliquons la m thode de Gauss classique a ce syst` me : e ` e On elimine alors le premier terme de la seconde ligne du syst` me (1) gr ce e a a la combinaison lin aire ` e do` le syst` me u e
SI on traite ce calcule avec un ordinateur ctif approchant les nombres ottants (les r els sur ordinateur) avec 3 chiffres d cimaux signicatifs, alors dans (2) e e on aura et on obtiendrait ainsi
La solution du syst` me donn e par cet ordinateur ctif serait alors e e . b) Permutant maintenant les deux lignes du syst` me initial (1). on r sout donc e e
Soit en posant
~qGs
X mi
z
m
~
~ Cy a
4
4
C y j
Si on pose
' m
t
m
i
m G 7
a 0
4
4
~
U
5
84
La solution du syst` me donn e par cet ordinateur ctif serait alors e e , tr` s e proche de la solution exacte qui est bien sur . La solution obtenue gr ce au syst` me (1) sans permutation de lignes est era e ron e car, lors de l limination de Gauss, on divise par le pivot e e , tr` s e voisin de la pr cision de la machine utilis e, do` lerreur num rique. En permue e u e tant les deux lignes du syst` me on evite ce probl` me puisque le nouveau pivot est e e alors egal a , valeur tr` s grande par rapport a la pr cision de la machine. ` e ` e
Exercice 19
R soudre le syst` me suivant : e e a) En repr sentant les nombres en virgule ottante avec 8 chiffres signicatifs, e b) puis exactement,
Exercice 20
Y Y Y
@ @
h h
r 5 r 5
. . .
. . .
. . .
..
..
..
. . .
. . .
..
..
..
..
..
..
. . .
. . .
. . .
. . .
. . .
~j@C
ac
p5G5@5
4
0 at
S
q
a q
Cqav
y u y
t
t
a a
h G
S R RRR RRR
R RRR @A E X %RRRQ $ X 79 $ X 5 3 X
. . .
HF HF F T $ GXF X " S $ VT " S !! RR !! RRR !!! W RRR !!! RRR !!! RRR E !!! RRR !!! RRR UTT !!! RRR !!! %RRRQ $3 T !!! RR%RQ
0 '
Triangularisation : On annule
? ? ? ? ? ? ? ? ? ? ? ? ? COMPleter ici Et ainsi de suite. . . On retrouve bien les formules propos es. e Nombre dop rations : e
F H F HD H $ #F & $ GF # $ GF D
.. .. .. . . . .. .. . . .. .
F " S $ VTF T " S HU !! RR !! RRR !!! W RRR !!! RRR !!! RRR E !!! RRR !!! RRR UTT !!! RRR !!! RR QR $3 T !!! RR QR
1
0 0
1
0
1
(
0()((
0
i
a`
i
en faisant
0()((
0 0
C`
. . .
)(0(( 1 1
. . . . . . . .. . .
Si on pose
. . .
. . .
..
. . .
op ration e op ration e division soustraction multiplication, division soustraction multiplication, soustraction mutliplication
.. .. . . . . . . . . . . . . . . . . . . . .
(et pour
. . .
. . .
. . .
. . .
, on a alors :
. . .
fois fois 85
e pi e g e g e f e f
)(0(( 1 1
Q B
Q B
Q )
u
t !
u
Exercice 21
@ n aC n9
Ce proc d diverge-t-il ? Il faut montrer quen e e , on a . Or, donc . Ainsi, , et implique que , ce qui est impossible puisque . Donc, . . . La m thode e diverge.
h
4
q
s
q
s
G t G G G $ah
Q Q Q ( ) B Q B Q B
Q )
G G 5 G @ G 5 G @ G G G h
H
i (h
4 Q
q
s l
(
(
G G q t $ G y $ q (y 7 G (
t t x
t w t
1
t v
t t qs r u G
s
)
u
@ h! 5 h!
)
$j $ah
4
5 ~
ici,
et
u
)
et
Q B
, on a :
, donc,
86
j)
Q ) )
Q B Q B
(
(t
4
u
4
(
(q
4
h G G @ dh t7 qh C dh~ q th!w t ~vh $j 5 Cqh Ct'@ Cq5h z q5 Cyw5 qdh ! h $jh
u ( (t 4
(q
t yt
)
(
t t
y t (y t t (
u )
@ h!
& )
)
)
5 h!
t t t t yt t yt t t y t y t t @ h! t @ Gh! t t t @ h! y 5 h(
) )
h
3 q
$a
Pour
Ici,
et
Q B
, et
, on a :
87
88
3.5
3.5.1
Les tableaux multidimensionnels en Java correspondent a des tableaux de ` tableaux. Ce sont donc des objets et les d clarer sans les construire avec new e consiste a r server une adresse pour lobjet. Il est alors possible de construire ` e s paremment les sous-tableaux qui ne sont pas n cessairement de taille identique. e e On peut donc, soit cr er des tableaux de taille homog` nes, comme dans la e e construction qui suit : int [] [] t = new int[5][10] ; soit construire des sous-tableaux de tailles distinctes, comme ci-dessous : int m [] []; m = new int [3] []; // tableau pouvant contenir les 3 adresses // des sous-tableaux m[0] = new int[2]; m[1] = new int[4]; m[2] = new int[1]; Notons aussi que le calcul de la longueur dun tableau multidimensionnel avec length correspond au domaine de variation de premier indice du tableau : ainsi, dans lexemple pr c dent, m.length vaut 3. e e
3.5.2
On construit ci-dessous une classe matrice qui permet de d nir les op rateurs e e matriciels classiques, dune mani` re non exhaustive. A partir de cette construce tion, le lecteur pourra facilement ajouter les op rateurs dont il a besoin en sinspie rant de ceux d j` d nis. ea e Le stockage des coefcients de la matrice se fait gr ce a un tableau dobjets a ` du type vecteur que lon a d nit dans le premier chapitre, chacun des vecteurs e ayant la m me taille. Ce tableau est priv et on d nit les fonctions coef( , ) e e e et toCoef( , , ) qui permettent respectivement daller rechercher un coefcient et den changer la valeur. public class matrice { private vecteur[] composant; matrice (int dim1, int dim2)
89
/** constructeur creant une matrice de coefficients nuls * de dim1 lignes * et dim2 colonnes */ { composant = new vecteur [dim1]; for (int i=0; i<dim1; i++) composant[i] = new vecteur(dim2); } matrice (double tableau [][]) /** constructeur creant une matrice a partir du * parametre tableau */ { composant = new vecteur [tableau.length]; for (int i=0; i<tableau.length; i++) composant[i] = new vecteur (tableau[i]); } public int nbLignes() /** renvoie le nombres de lignes de la matrice */ { return composant.length; } public int nbColonnes() /** renvoie le nombre de colonnes de la matrice */ { return composant[0].dim(); } public double coef(int nl, int nc) /** renvoie le coefficient a la position (nl, nc) */ { return composant[nl].elt(nc); } public void toCoef(int i, int j, double x) /** affecte la valeur de x au coefficient a la * position (nl, nc) */ { composant[i].toElt(j, x); }
90
public static vecteur produit(matrice m, vecteur x) /** renvoie le vecteur obtenu en multipliant * la matrive m par le vecteur x */ { vecteur y = new vecteur(m.nbLignes()); for (int i= 0; i<m.nbLignes(); i++) { double somme = 0.0; for (int j= 0; j<m.nbColonnes(); j++) somme += m.coef(i,j) * x.elt(j); y.toElt(i, somme); } return y; } public static matrice produit(matrice m1, matrice m2) /** renvoie la matrice obtenue en multipliant les deux * matrices m1 et m2 */ { matrice result = new matrice(m1.nbLignes(), m2.nbColonnes()); for (int i=0; i<m1.nbLignes(); i++) for (int j=0; j<m2.nbColonnes(); j++) { double somme = 0.0; for (int k=0; k<m1.nbColonnes(); k++) somme += m1.coef(i,k) * m2.coef(k,j);
91
public static matrice addition(matrice m1, matrice m2) /** renvoie la matrice obtenue en additionnant les deux * matrices m1 et m2 */ { matrice result = new matrice(m1.nbLignes(), m2.nbColonnes()); for (int i=0; i<m1.nbLignes(); i++) for (int j=0; j<m2.nbColonnes(); j++) result.toCoef(i, j, m1.coef(i,j) + m2.coef(i,j)); return result; } public static matrice soustraction(matrice m1, matrice m2) /** renvoie la matrice obtenue en soustrayant la matrice m2 * a la matrice m1 */ { matrice result = new matrice(m1.nbLignes(), m2.nbColonnes()); for (int i=0; i<m1.nbLignes(); i++) for (int j=0; j<m2.nbColonnes(); j++) result.toCoef(i, j, m1.coef(i,j) - m2.coef(i,j)); return result; } } Programme de test : class testMatrice { public static void main(String args[]) { double [][] t1 = { {1., 2., 3.}, {4., 5., 6.} }; double [][] t2 = { {2., 4.}, {4., 2.}, {1., 1.} }; double [][] t3 = { {2., 3., 2.}, {5., 6., 5.} }; double [] t = {2., 1., 0.};
92
matrice m1 = new matrice(2, 3); for (int i=0; i<m1.nbLignes(); i++) for (int j=0; j<m1.nbColonnes(); j++) m1.toCoef(i, j, t1[i][j]); System.out.println("matrice m1 :"); m1.afficher(); matrice m2 = new matrice(t2); System.out.println("matrice m2 :"); m2.afficher(); matrice m3 = new matrice(t3); System.out.println("matrice m3 :"); m3.afficher(); vecteur x = new vecteur(t); System.out.println("vecteur x :"); x.afficher(); vecteur y = matrice.produit(m1, x); System.out.println("m1*x :"); y.afficher(); matrice m4 = matrice.produit(m1, m2); System.out.println("m1*m2 : "); m4.afficher(); m4 = matrice.addition(m1, m3); System.out.println("m1+m3 : ");m4.afficher(); m4 = matrice.soustraction(m1, m3); System.out.println("m1-m3 : ");m4.afficher(); } } Lex cution du programme pr c dent g n` re lafchage suivant : e e e e e java testMatrice matrice m1 : 1.0 2.0 3.0 4.0 5.0 6.0 matrice m2 : 2.0 4.0 4.0 2.0 1.0 1.0
93
matrice m3 : 2.0 3.0 2.0 5.0 6.0 5.0 vecteur x : 2.0 1.0 0.0 m1*x : 4.0 13.0 m1*m2 : 13.0 11.0 34.0 32.0 m1+m3 : 3.0 5.0 5.0 9.0 11.0 11.0 m1-m3 : -1.0 -1.0 1.0 -1.0 -1.0 1.0
3.5.3
Nous allons etre amen a traiter et en particulier a r soudre des syst` mes e ` ` e e lin aires de diff rentes natures, a savoir triangulaire sup rieur ou inf rieur, a diae e ` e e ` gonal unit ou non, ou encore des syst` mes g n raux. Les grandes biblioth` ques e e e e e connues de type BLAS (Basic Linear Algebra Subroutine) construisent autant de fonctions de r solution distinctes quil y a de types diff rents de syst` mes. Sape e e puyant sur le principe de r utilisabilit de la programmation objet, nous allons e e d nir une classe abstraite g n rale qui sera le d nominateur commun de tous les e e e e syt` mes lin aires et dont h ritera les classes sp cialis es. e e e e e On considerera quun syst` me lin aire ne peut etre construit quapr` s la e e e construction effective de la matrice et du second membre du syst` me et le e constructeur dun syst` me ne peut donc se faire quavec ses deux el ments. Par e e ailleurs, la seule m thode qui nous int resse, pour linstant, est celle qui calcule e e la solution du syst` me. Cette r solution peut eventuellement conduire a un echec e e ` si la matrice est singuli` re et non allons pour cela faire la gestion dune exception e SysLinEception succeptible d tre lev e en cours de calcul. e e La classe abstraite g n rale et la classe dexception associ e sont alors les e e e suivantes :
94
abstract class sysLin{ int ordre; protected matrice matriceSysteme; protected vecteur secondMembre; sysLin (matrice m, vecteur x){ matriceSysteme = m; secondMembre = x; ordre = x.dim(); } abstract public vecteur resolution() throws SysLinException; }
3.5.4
Nous pouvons ecrire maintenant une classe de syst` mes lin aires triangulaires e e sup rieurs qui va impl menter la m thode resolution et g rer lexception e e e e SysLinException lorsquun el ment de la diagonale de la matrice est nul : e class sysTriangSup extends sysLin { sysTriangSup(matrice m, vecteur x) { super(m,x); } public vecteur resolution() throws SysLinException { vecteur x = new vecteur(ordre); double somme; for (int i=ordre-1; i>=0; i--){ somme=secondMembre.elt(i); for (int j=i+1; j<ordre; j++) somme -= matriceSysteme.coef(i,j) * x.elt(j); double termDiagonal = matriceSysteme.coef(i,i); if (termDiagonal == 0) throw new SysLinException(); x.toElt(i, somme / matriceSysteme.coef(i,i)); } return x; }
95
Pour tester notre classe, il nous faut saisir la matrice et le second membre du syst` me. Pour cela nous allons passer par linterm diaire dun chier en reprenant e e les constructions qui ont et pr sent es au premier chapitre et en y ajoutant lutie e e lisation dun analyseur de type StringTokenizer qui va pouvoir d composer e une ligne constitu e de plusieurs valeurs num riques et les extraire. Une lecture ate e tentive du listing qui suit permet facilement den comprendre le fonctionnement : tout est bas sur lutilisation de la fonction nextToken() qui d compose la e e chane jusquau prochain s parateur. e import java.io.*; import java.util.*; class bibMatFileIn{ FileReader fichier=null; BufferedReader lecbuf; public bibMatFileIn(String nomfichier) { try{ fichier = new FileReader (nomfichier); lecbuf = new BufferedReader (fichier); } catch (FileNotFoundException e){ System.out.println("fichier inexistant ! "); } } vecteur lectureVecteur(){ String line, word; vecteur vlu=null; try{ // lecture taille du vecteur (sur 1 ligne) : line = lecbuf.readLine(); int nb = Integer.parseInt(line); vlu = new vecteur(nb); // lecture coef. du vecteur (sur 1 ligne) : int n=0; line = lecbuf.readLine(); StringTokenizer st = new StringTokenizer(line); // while ((word=st.nextToken()) != null) for(int i=0; i<nb; i++){ word = st.nextToken();
96
matrice lectureMatrice(){ String line, word; matrice mlu=null; StringTokenizer st; try{ // lecture ordre matrice (sur 1 ligne) : line = lecbuf.readLine(); st = new StringTokenizer(line); word = st.nextToken(); int nbLignes = Integer.parseInt(word); word = st.nextToken(); int nbColonnes = Integer.parseInt(word); mlu = new matrice (nbLignes, nbColonnes); // lecture coef. matrice, ligne par ligne : for (int i=0; i<nbLignes; i++){ line = lecbuf.readLine(); st = new StringTokenizer(line); for (int j=0; j<nbColonnes; j++){ word = st.nextToken(); mlu.toCoef(i,j, Double.valueOf(word).doubleValue()); } } } catch(IOException e){ System.out.println("erreur de lecture"); } catch(NumberFormatException e){ System.out.println("erreur conversion chaine"); }
97
public void fermer(){ try{ fichier.close(); } catch (IOException e) { System.out.println("Le fichier ne peut pas tre fermer"); e } } } Nous ecrivons ensuite une classe de test qui va mettre en uvre une pro gramme principal : class testSysTriangSup{ public static void main(String args[]){ bibMatFileIn f = new bibMatFileIn("donnee.dat"); // on lit dans le fichier "donnee.dat" : // lordre de la matrice : nblignes et nbcolonnes sur 1 ligne // les coef. de la matrice ligne par ligne // la taille du second membre sur 1 ligne // les coef. du second membre sur 1 ligne // Attention : les dimensions matrices et vecteurs doivent // etre corrects ... pas de verification ! matrice m = f.lectureMatrice(); vecteur b = f.lectureVecteur(); f.fermer(); System.out.println(" SYSTEME LU"); System.out.println("La matrice lue est : "); m.afficher(); System.out.println("Le sd membre lu est : "); b.afficher(); sysTriangSup sts = new sysTriangSup(m, b); try{ vecteur x = sts.resolution(); System.out.println("La solution trouvee est : "); x.afficher(); vecteur v = matrice.produit(m, x); System.out.println("Verification - le produit de la matrice "+ "par la solution vaut :"); v.afficher(); } catch (SysLinException e){ System.out.println(e); }
98
java testSysTriangSup SYSTEME LU La matrice lue est : 1.0 2.0 3.0 4.0 5.0 0.0 7.0 8.0 9.0 8.0 0.0 0.0 6.0 7.0 3.0 0.0 0.0 0.0 5.0 6.0 0.0 0.0 0.0 0.0 1.0 Le sd membre lu est : 5.0 4.0 3.0 2.0 1.0 La solution trouvee est : 1.6190476190476195 -0.6095238095238098 0.9333333333333336 -0.8 1.0 Verification - le produit de la matrice par la solution vaut : 5.0 4.0 3.000000000000001 2.0 1.0 Le deuxi` me test sert a v rier le bon fonctionnement de lexception qui e ` e d tecte un syst` me singulier. Le chier de donn es est le suivant : e e e 5 5 1 2 3 4 5
99
java testSysTriangSup SYSTEME LU La matrice lue est : 1.0 2.0 3.0 4.0 5.0 0.0 7.0 8.0 9.0 8.0 0.0 0.0 6.0 7.0 3.0 0.0 0.0 0.0 5.0 6.0 0.0 0.0 0.0 0.0 0.0 Le sd membre lu est : 5.0 4.0 3.0 2.0 1.0 Systeme singulier Nous construisons ensuite une classe syst` me triangulaire inf rieure sur le e e m me mod` le, mais en ne sint ressant quau cas o` la matrice est, de plus, a e e e u ` diagonale unit e. En effet, cest ce cas qui sera rencontr lorsque lon mettra en e e uvre la m thode de factorisation LU. e class sysTriangInfUnite extends sysLin{ sysTriangInfUnite (matrice m, vecteur x) { super(m, x); } public vecteur resolution() { vecteur x = new vecteur(ordre); double somme; for (int i=0; i<ordre; i++){ somme = secondMembre.elt(i); for (int j=0; j<i; j++) somme -= matriceSysteme.coef(i,j) * x.elt(j); x.toElt(i, somme); } return x; } }
100
3.5.5
Rappels sur lalgorithme de calcul des coefcients de L et de U Nous pr sentons ici un algorithme de calcul effectif des coefcients des mae trices et qui factorise une matrice dordre . est une matrice triangulaire inf rieure a diagonale unit et est une matrice triangulaire sup rieure. e ` e e Nous proc dons par identication a partir du produit e `
!
On consid` re alors les deux cas suivants : e ... a nir ... ` Compl ments de la classe matrice avec la m thode de factorisation LU e e Lalgorithme de factorisation LU dune matrice ne concerne que la matrice et doit donc trouver sa place dans la classe matrice. Cest pour cette raison que nous compl` tons celle-ci avec la m thode suivante, qui reprends lalgorithme e e pr c dent : e e public void factorLU() throws SysLinException /** calcul de la factorisation LU de la matrice courante * les coefficients de L et de U sont stockes en lieu et place * des coefficients de memes rangs de la matrice dorigine */ { int i, j, k; double somme, coefDiagonal; for (i=0; i<nbLignes(); i++) { for (j=0; j<i; j++) { somme=coef(i,j); for (k=0; k<j; k++) somme -= coef(i,k)*coef(k,j);
t
si
101
Nous pouvons alors d nir une classe syst` me g n ral r solu par une m thode e e e e e e de factorisation LU. Cest la classe qui suit dans laquelle on notera que lon a ajout une m thode resolutionPartielle() qui permet de r soudre le e e e syst` me lorsque la matrice est d j` sous la forme factoris e. Il faut, en effet, se e ea e rappeler que lun des int r ts de cette m thode de factorisation est quelle ne ee e n cessite pas de refactoriser la matrice (op ration la plus co teuse) lorsque lon e e u doit r soudre plusieurs syst` mes avec la m me matrice. Par exemple, le calcul e e e de linverse dune matrice dordre n se fait en r solvant n syst` mes ayant tous la e e m me matrice : cest la matrice a inverser. Les seconds membres sont, quant a e ` ` eux, les n vecteurs de la base canonique. La classe syst` me g n ral avec m thode de factorisation LU est donc la suie e e e vante : class sysGeneLU extends sysLin { sysGeneLU (matrice m, vecteur x) { super(m,x); }
public vecteur resolution() throws SysLinException { vecteur x = null; try{ matriceSysteme.factorLU(); sysTriangInfUnite sysTIU = new sysTriangInfUnite( matriceSysteme, secondMembre); x = sysTIU.resolution(); sysTriangSup sysTS = new sysTriangSup( matriceSysteme, x);
102
x = sysTS.resolution(); } catch (SysLinException e) { System.out.println(e); } return x; } public vecteur resolutionPartielle() throws SysLinException { sysTriangInfUnite sysTIU = new sysTriangInfUnite( matriceSysteme, secondMembre); vecteur x = sysTIU.resolution(); sysTriangSup sysTS = new sysTriangSup( matriceSysteme, x); try{ x = sysTS.resolution(); } catch (SysLinException e) { System.out.println(e); } return x; } } Exemple dex cution avec chier de donn es et traitement dexception e e Nous avons ecrit un programme de test tout a fait similaire a celui qui a servit ` ` a tester la r solution dun syst` me triangulaire sup rieur : ` e e e class testSysGeneLU{ public static void main(String args[]){ bibMatFileIn f = new bibMatFileIn("donneeSGLU.dat"); matrice m = f.lectureMatrice(); vecteur b = f.lectureVecteur(); f.fermer(); System.out.println(" SYSTEME LU"); System.out.println("La matrice lue est : "); m.afficher(); System.out.println("Le sd membre lu est : "); b.afficher(); matrice mcopy = new matrice(m.nbLignes(), m.nbColonnes()); mcopy.recopier(m); sysGeneLU sglu = new sysGeneLU(m, b); try{ vecteur x = sglu.resolution(); System.out.println("La solution trouvee est : "); x.afficher(); vecteur v = matrice.produit(mcopy, x); System.out.println("Verification - le produit de la matrice "+ "par la solution vaut :"); v.afficher();
103
Pour faire la v rication, on peut remarquer quil a et n cessaire de recopier e e e la matrice dorigine dans une autre matrice, puisque la matrice dorigine se verra transformer lors de lappel de sa factorisation sous la forme LU. Il faut donc compl ter la classe matrice de la mani` re suivante pour y ajouter e e la m thode recopier : e public void recopier(matrice m) /** recopie la matrice m dans la matrice courante */ { for (int i=0; i<nbLignes(); i++) for (int j=0; j<nbColonnes(); j++) toCoef(i, j, m.coef(i,j)); } Voici le chier test qui a et utilis : e e 5 1 2 2 5 2 5 5 5 2 5 6 6 5 3 1 1 4 5 4 6 8 7 2 5 7 6 7 2
java testSysGeneLU SYSTEME LU La matrice lue est : 1.0 2.0 3.0 4.0 5.0 2.0 5.0 1.0 6.0 7.0 2.0 6.0 1.0 8.0 6.0 5.0 6.0 4.0 7.0 7.0 2.0 5.0 5.0 2.0 2.0
104
Le sd membre lu est : 5.0 4.0 3.0 2.0 1.0 La solution trouvee est : -1.1396574440052718 -0.29776021080368853 0.5335968379446643 0.11594202898550718 0.9341238471673253 Verification - le produit de la matrice par la solution vaut : 5.0 3.9999999999999982 2.999999999999999 1.9999999999999947 1.0
Une applet est un programme qui est inclus dans une page HTML et qui va donc etre ex cuter par le navigateur lisant cette page, a condition quil poss` de e ` e les fonctionnalit s pour le faire. Il doit donc contenir une machine virtuelle Java e compress e (cest le cas des navigateurs usuels qui contiennent aujourdhui un e noyau Java correspondant a un JDK 1.1). ` La classe java.applet.Applet doit etre la classe m` re de toute applet e incluse dans un document.
4.1.1
Un premier exemple
Le programme HelloWorld.java suivant d nit une applet HelloWorld qui e utilise un objet Graphics qui constitue un el ment de base de la biblioth` que e e awt qui est repris avec plus de pr cision dans le paragraphe 4.2. Cette applet e utilise la m thode drawString sur cet objet, ce qui lui permet dafcher une e chane de caract` res a une position donn e sur la fen tre courante du navigateur. e ` e e
import java.applet.Applet ; import java.awt.Graphics ; public class HelloWorld extends Applet { public void paint(Graphics g) { g.drawString("Hello world", 50, 25); } }
Il faut noter d` s a pr sent que cette applet ne poss` de pas de point dentr e e ` e e e main(), celui-ci se trouve g rer implicitement par le navigateur. e 105
106
height=25>
En appelant cette page HTML dans un navigateur int grant Java, on verra e apparatre dans le navigateur le message Hello world.
4.1.2
La m thode suivante permet de r cup rer des param` tres pass s a une applet e e e e e ` dans une page HTML :
public String getParameter(String name)
Cette m thode ne peut etre appel e que dans les m thodes init() ou start() e e e dune applet (ces m thodes sont d crites plus loin). e e Voici donc une nouvelle version HelloWorld2.java
import java.applet.Applet; import java.awt.Graphics; public class HelloWorld2 extends Applet { String e; public void init() { e=getParameter("message"); } public void paint(Graphics g) { g.drawString(e, 50, 25); } }
107
4.1.3
Cycle de vie
Le navigateur utilis pour ex cuter lapplet contr le la vie et lactivation de e e o lapplet gr ce aux quatres m thodes suivantes : a e public void init() est appel e apr` s le chargement de lapplet dans e e la page html ; public void stop() est appel e chaque fois que le navigateur arr t e e lex cution de lapplet, soit parce que lutilisateur change de page web, soit e parce quil iconie le navigateur ; public void start() est appel e chaque fois que lapplet doit e d marrer, apr` s init() ou apres un stop() lorsque lutilisateur revient e e sur la page web contenant lapplet ou lorsquil d siconie le navigateur ; e public void destroy() est appel e a la fermeture du navigateur. e ` Elle d truit les ressources allou es pour lapplet. e e
4.1.4
Compl ments e
Nous donnons bri` vement et de mani` re non exhaustive quelques points e e dentr e pour les lecteurs d sirant utiliser les aspects multim dia de Java mais que e e e nous nutiliserons pas dans le cadre des applications pr sent es dans cet ouvrage. e e Des m thodes sont disponibles pour r cup rer des images et des sons : e e e public Image getImage(URL url) ; public Image getImage(URL url, String name) ; public AudioClip getAudioClip(URL url) ; public AudioClip getAudioClip(URL url, String name) ; Des m thodes de la classe java.applet.AudioClip permettent de mae nipuler les sons ainsi r cup r s : e ee public abstract void play() ; public abstract void loop() ; public abstract void stop(). Des m thodes sont egalement disponibles pour jouer directement les sons : e public void play(URL url) ; public void play(URL url, String name).
4.2
4.2.1
Nous d crivons comment effectuer des trac s g om triques dans la zone e e e e graphique dune applet. Nous utilisons pour cela des m thodes de la classe e
108
java.awt.Graphics. Elles sont r sum es ci-dessous. (une description plus e e pr cise sera trouv dans la documentation des API). e e public void draw3DRect(int x, int y, int width, int height, boolean raised) trace un rectangle en relief ; public abstract void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) trace un arc de cercle ; public abstract void drawLine(int x1, int y1, int x2, int y2) trace un segment de droite ; public abstract void drawOval(int x, int y, int width, int heignt) trace une ellipse ; public abstract void drawPolygon(int xPoints[], int yPoints[], int nPoints) trace un polygone ; public void drawRect(int x, int y, int width, int height) trace un rectangle vide ; public abstract void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) trace un rectangle vide a bords arrondis ; ` public void fill3Drect(int x, int y, int width, int height, boolean raised) trace un rectangle plein en relief ; public abstract void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) trace un arc de cercle plein ; public abstract void fillOval(int x, int y, int width, int heignt) trace une ellipse pleine ; public abstract void fillPolygon(int xPoints[], int yPoints[], int nPoints) trace un polygone plein ; public abstract void fillRect(int x, int y, int width, int height) trace un rectangle plein ; public abstract void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) trace un rectangle plein a bords arrondis. ` Voici un exemple dapplet contenant des graphiques :
import java.awt.*; public class Test extends java.applet.Applet { public void paint(Graphics g) { int i; g.setColor(Color.yellow); for (i= 0; i<14; i++) g.drawLine(10, 10+16*i, 10+16*i, 218);
109
Pour terminer, nous signalons que, dans la suite de cet ouvrage, nous pr senterons principalement des applications graphiques autonomes et non sous e forme dapplets, car elles sont, de fait, plus g n rales. Les indications donn es e e e pr c demment sont sufsantes pour permettre une transformation assez facile de e e ces applications autonomes en applets.
4.2.2
Une premi` re fen tre e e Dans lexemple qui suit, on construit une simple fen tre dune dimension inie tiale, avec un titre. La fen tre construite d rive de la classe Frame qui permet de e e d nir des fen tres avec barre de titre, menu, bords, etc ... e e On utilise WindowListener pour pouvoir g rer la fermeture de la fen tre e e qui seffectue lorsque lutilisateur clique sur lic ne sup rieure droite du bandeau o e de fen tre : il faut alors d crire qui g` re des ev` nements de ce type. Dans Java 1.1 e e e e et sup rieur, cette gestion se fait par des couteurs d v` nements (listener). e e e e Ici, pour un objet h ritant de WindowListener, on se mettra ` l coute des e a e ev` nements gr ce a la m thode addWindowListener. e a ` e WindowListener est une interface (cest une classe abstraite particuli` re, e sans variable dinstance et o` toutes les m thodes sont abstraites : on repr sente u e e ainsi un ensemble de comportements qui doivent etre impl ment s dans les classes e e qui impl mentent cette interface). Elle contient un certain nombre de m thodes e e abstraites quil faut red nir. Ici, on red nit non trivialement la seule m thode e e e windowClosing qui permettra de g rer la fermeture de la fen tre. e e
import java.awt.*; import java.awt.event.*; public class Fenetre extends Frame implements WindowListener { public Fenetre() { setSize(400, 300); } public void windowClosing(WindowEvent event) { System.exit(0);
110
windowClosed(WindowEvent event) {} windowDeiconified(WindowEvent event) {} windowIconified(WindowEvent event) {} windowActivated(WindowEvent event) {} windowDeactivated(WindowEvent event) {} windowOpened(WindowEvent event) {}
public static void main(String arg[]) { Fenetre Test = new Fenetre(); Test.setTitle("ma fenetre JAVA"); Test.show(); Test.addWindowListener(Test); } }
Dans la suite de ce chapitre(4.3.2), nous donnerons une alternative plus all g e a cette gestion d v` nements attach s a des fen tres, en sappuyant sur e e ` e e e ` e un exemple. Les diff rentes parties dune fen tre e e Une fen tre g r e par lAWT peut comorter plusieurs el ments cae ee e ract ristiques : e Une page de fond ou canevas, dans laquelle on pourra tracer des gures g om triques comme celles qui ont et d crites au paragraphe 4.2.1 ; e e e e Une etiquette (Label) qui permet dafcher un texte ; Une zone de texte (TextArea) pour un afchage pouvant etre modi ; e Une liste d roulante permettant de faire un choix (List) ; e Une zone de saisie de texte (TextField) ; Un bouton (Button) ; Une case doption (Checkbox) ; Un menu d roulant (Menu et MenuBar). e Un exemple : un compteur Dans lexemple comment suivant, on met en uvre une petite interface grae phique incluant diff rents boutons et g rant des ev` nements. e e e
import java.awt.* ; import java.awt.event.* ; class FenetreCompteur extends Frame {
111
// un champ qui permettra dafficher la valeur du compteur // en param`tre : la taille des caract`res e e TextField affichageCompteur = new TextField(7); //gestion des v`nements provoqus e e e //par les clics sur les boutons class ActionIncr implements ActionListener { public synchronized void actionPerformed(ActionEvent e) { compteur ++; afficherCompteur(); } }; class ActionDecr implements ActionListener { public synchronized void actionPerformed(ActionEvent e) { compteur --; afficherCompteur(); } }; class ActionQuit implements ActionListener { public synchronized void actionPerformed(ActionEvent e) { System.exit(0); } }; void afficherCompteur() { affichageCompteur.setText(String.valueOf(compteur)); } // constructeur public FenetreCompteur(String nom) { super(nom); compteur = 0; setSize(240, 80); setLayout(new FlowLayout()); add(boutonIncr); add(boutonDecr); add(boutonQuit); add(affichageCompteur); boutonIncr.addActionListener( new ActionIncr());
112
e Gestion des ev` nements Sur lexemple pr c dent, on a vu comment utiliser des ev` nements de type e e e ActionEvent a partir des composants Button et TextField. ` Dautres types d v` nements existent : e e MouseEvent pour les mouvements et cliquage de souris ; FocusEvent pour savoir si la souris est au-dessus de la zone consid r e ; ee KeyEvent pour lenfoncement dune touche ; TextEvent pour la modication de texte pour un composant int grant une e zone de texte. Il faut alors cr er, relativement a un ev nement de type xxxEvent, une classe e ` e qui impl mente xxxListener o` lon d nira le traitement a faire lorsque e u e ` l v nement a lieu (m thode actionPerformed). Dans la classe fen tre, on e e e e lancera l coute des ev` nements avec addListener. e e Placement des composants Les diff rents composants dune fen tre peuvent etre plac s de plusieurs e e e mani` res avec un gestionnaire de placements (layout manager) : e
113
FlowLayout range les composants ligne par ligne et de gauche a droite ; ` BorderLayout place les composants dans 5 zones : le centre et les 4 c t s ; oe GridLayout place les composants sur une grille 2D ; GridBagLayout place les composants sur une grille 2D, avec des coordonn es. Les zones nont pas toutes n cessairement la m me dimension. e e e
4.3
Nous allons maintenant pr senter quelques classes qui permettent deffectuer e des trac s simples de courbes scientiques bidimensionnelles. Nous proposons e une organisation en plusieurs classes par soucis de g n ricit et de r utilisabilit . e e e e e Pour ne pas alourdir les programmes qui se veulent avant tout p dagogiques, e nous pr sentons des constructions qui peuvent etre grandement am lior es sur e e e leurs aspects esth tiques. e
4.3.1
Le graphisme scientique n cessite de repr senter des courbes dont les doe e maines de d nition des coordonn es peuvent etre tr` s variables dune utilisation e e e a lautre. On souhaite malgr cela afcher a l cran ou sur un autre dispositif daf` e ` e chage des graphiques qui vont tous occup s une place a peu pr` s similaire. Il e e faut donc d nir : e un domaine correspondant a la variation des coordonn es des diff rents ` e e points de la gure a repr senter ; ` e un domaine correspondant a lespace utilis sur le dispositif dafchage. ` e Pour cela, nous d nissons deux classes el mentaires qui vont respectivement e e repr senter ces deux domaines : e
class DomaineDouble { public double xmin, ymin, xmax, ymax; DomaineDouble(double x0, double y0, double x1, double y1) { xmin=x0; ymin=y0; xmax=x1; ymax=y1; } } class DomaineInt { public int xmin, ymin, xmax, ymax;
114
Il faut aussi d nir un processus de passage dun domaine a lautre, ce qui est e ` d crit dans les paragraphes suivants. e
4.3.2
Nous d crivons dabord une classe d riv e de la classe Frame qui va g rer un e e e e environnement fen tr rudimentaire qui est constitu de deux composants situ s e e e e lun en-dessous de lautre (cest-` -dire dans les parties North et Center du a gestionnaire de mise en page BorderLayout) : un Canvas o` seront trac es la ou les courbes ; u e un Label qui donne un titre a la fonction trac e. cette information sera sou` e vent r cup r e dune m thode appel e libelle que nous avons ajout e a e ee e e e ` linterface FoncD2D, d j` utilis pr c demment et qui s crit maintenant : ea e e e e
interface FoncD2D { public double calcul(double x); public String libelle(); }
Par ailleurs, nous ne faisons quune gestion minimale de la fen tre que lane cera notre programme nal, en ne soccupant que de sa fermeture, gr ce a lic ne a ` o sup rieure droite de la barre de titre. Nous avons choisit une m thode alternative e e a ce que nous avons pr sent pr c demment (4.2.2) : On utilise une classe d riv e ` e e e e e e de la classe pr d nie WindowAdapter. Ceci nous permet de ne red nir exe e e plicitement que la m thode windowClosing, comme on le voit dans le listing e qui suit :
import java.awt.*; import java.awt.event.*; import DomaineInt; class MiniWinAdapter extends WindowAdapter { public void windowClosing(WindowEvent e) {System.exit(0);} } class FenetreGraphe extends Frame { FenetreGraphe(DomaineInt de, Canvas c, String texte) { setTitle(new String("graphe dune fonction")); setSize((int)(de.xmax - de.xmin), (int)(de.ymax - de.ymin)+50); setLayout(new BorderLayout());
115
4.3.3
Dans la classe qui suit, nous avons r unit un ensemble de proc dures utiles e e pour faire des trac s de courbes : e mapX et mapY soccupent de faire le changement de coordonn es a partir e ` du domaine que lon doit repr senter, vers le domaine du dispositif dafe chage et ceci, respectivement, pour chacune des coordonn es. e Line et Carre effectuent les trac s g om triques el mentaires correspone e e e dant a leur d nomination. ` e coloreFond colore le fond du Canvas dafchage. tracePoints et tracePolyline afchent un ensemble de points dont les coordonn es sont donn es en param` tres. Pour la deuxi` me e e e e m thode, les points sont reli s par des segments. e e traceAxes afchent des axes de coordonn es passant par lorigine en e afchant les valeurs des coordonn es des extr mit s des axces. Ces axes e e e ne sont effectivement afch s que sils sont situ s dans la vue repr sent e e e e e qui est d nie par le domaine a repr senter. Pour cette raison, on d nit e ` e e lalternative suivante. traceAxesCentres effectuent le m me travail a la diff rence que les e ` e axes sont centr s par rapport au milieu du domaine dafchage et ne passent e donc pas, en g n ral, par lorigine. e e traceFonction effectue le trac graphique dune fonction de type e FoncD2D, pass e en param` tre. e e
import import import import java.awt.*; FoncD2D; DomaineDouble; DomaineInt;
class ManipGraphe { DomaineInt ce; // coordonnees ecran DomaineDouble crv; // coordonnees reelles visualisees DomaineDouble cr; double dx; // pas sur x
116
ManipGraphe(DomaineDouble domReel, DomaineInt domEcran) { ce=domEcran; cr=domReel; // calcul dune marge autour du domaine utilisateur double deltax = (domReel.xmax - domReel.xmin)/10; double deltay = (domReel.ymax - domReel.ymin)/10; crv = new DomaineDouble (domReel.xmin - deltax, domReel.ymin - deltay, domReel.xmax + deltax, domReel.ymax + deltay); dx = (cr.xmax - cr.xmin)/30; } public int mapX (double x) { return ce.xmin + (int) ((x-crv.xmin)/(crv.xmax-crv.xmin)* (ce.xmax-ce.xmin)); } public int mapY (double y) { return ce.ymin + (int) ((crv.ymax-y)/(crv.ymax-crv.ymin)* (ce.ymax-ce.ymin)); } public void Line(Graphics g, double x1, double y1, double x2, double y2) { g.drawLine(mapX(x1), mapY(y1), mapX(x2), mapY(y2)); } public void Carre(Graphics g, double x, double y) { g.drawRect(mapX(x)-2, mapY(y)-2,4,4); } public void coloreFond(Graphics g, Color c) { g.setColor(c); g.fillRect(ce.xmin, ce.ymin, ce.xmax-ce.xmin, ce.ymax-ce.ymin); } public void tracePoints(Graphics g, Color c, double[] x, double[] y) { g.setColor(c); for (int i=0; i<x.length; i++) Carre(g, x[i], y[i]); }
117
public void tracePolyLine(Graphics g, Color c, double[] x, double[] y) { g.setColor(c); for (int i=1; i<x.length; i++) Line(g, x[i-1], y[i-1], x[i], y[i]); } public void traceAxes(Graphics g, Color c) { g.setColor(c); Line(g, 0, cr.ymin, 0, cr.ymax); Line(g, cr.xmin, 0, cr.xmax, 0); g.drawString(new String(String.valueOf(cr.ymin)), mapX(dx/2), mapY(cr.ymin)); g.drawString(new String(String.valueOf(cr.ymax)), mapX(dx/2), mapY(cr.ymax)+10); g.drawString(new String(String.valueOf(cr.xmin)), mapX(cr.xmin), mapY(dx/2)); g.drawString(new String(String.valueOf(cr.xmax)), mapX(cr.xmax)-30, mapY(dx/2)); } public void traceAxesCentres(Graphics g, Color c) { g.setColor(c); double crymid = (cr.ymax + cr.ymin)/2; double crxmid = (cr.xmax + cr.xmin)/2; Line(g, crxmid, cr.ymin, crxmid, cr.ymax); Line(g, cr.xmin, crymid, cr.xmax, crymid); g.drawString(new String(String.valueOf(cr.ymin)), mapX(crxmid+dx/2), mapY(cr.ymin)); g.drawString(new String(String.valueOf(cr.ymax)), mapX(crxmid+dx/2), mapY(cr.ymax)+10); g.drawString(new String(String.valueOf(cr.xmin)), mapX(cr.xmin), mapY(crymid+dx/2)); g.drawString(new String(String.valueOf(cr.xmax)), mapX(cr.xmax)-30, mapY(crymid+dx/2)); } public void traceFonction(Graphics g, Color c, FoncD2D f, double mini, double maxi) { double x1, y1, x2, y2; g.setColor(c); x2=mini; y2 = f.calcul(x2); for (x1=mini; x1<= maxi; x1 += dx) {
118
4.3.4
Un exemple dutilisation
Lutilisateur nal de cette biblioth` que graphique rudimentaire aura a ecrire e ` un programme similaire a celui qui est donn dans la suite. Il contient une classe ` e impl mentant linterface FoncD2D car il effectue le trac dune fonction qui est e e transmise sous ce type a la biblioth` que graphique. Il contient egalement deux ` e autres classes qui devront toujours apparatre lorsque lon sera amen a utiliser la e` biblioth` que : e une classe qui d rive de la classe pr d nie Canvas qui repr sente la partie e e e e de fen tre o` doit etre trac le graphique. Cette classe poss` de un construce u e e teur qui a pour param` tres les domaines - de lutilisateur et du dispositif e graphique - concern s et les composantes graphiques qui doivent etre afe ch es, ici une fonction. Cette classe contient une m thode essentielle qui e e est la m thode paint : cest ici que lon doit d crire pr cis ment tout ce e e e e qui devra etre trac au nal, a lex cution du programme. e ` e une classe contenant le programme principal et qui construit les domaines, le Canvas et la fen tre dafchage. e
import import import import import import java.awt.*; FoncD2D; ManipGraphe; FenetreGraphe; DomaineDouble; DomaineInt;
class CanvasGraphe extends Canvas { ManipGraphe mp = null; FoncD2D f; DomaineDouble cr; DomaineInt ce; CanvasGraphe(FoncD2D fonc, DomaineDouble domReel, DomaineInt domEcran) { cr=domReel; ce=domEcran;f = fonc;
119
setSize(new Dimension(ce.xmax-ce.xmin, ce.ymax-ce.ymin)); mp = new ManipGraphe(domReel, domEcran); } public void paint(Graphics g) { mp.coloreFond(g,Color.white); mp.traceAxes(g,Color.black); mp.traceFonction(g, Color.blue, f, cr.xmin, cr.xmax); mp.Carre(g,0,0); } } class MaFonction implements FoncD2D { public double calcul(double x) {return x*x;} public String libelle() {return "f(x)=x*x";} } class GraphFonc { static public void main(String argv[]) { MaFonction fct = new MaFonction(); DomaineDouble dr = new DomaineDouble(-2, -0.5, 2, 5); DomaineInt de = new DomaineInt(0, 0, 600, 450); CanvasGraphe cg = new CanvasGraphe(fct, dr, de); FenetreGraphe x = new FenetreGraphe(de, cg, fct.libelle()); x.show(); } }
120
, Soit une application de IR dans IR, dont on connait n+1 points pour . Le but du probl` me dinterpolation est de d terminer une e e fonction simple a calculer, telle que : `
Les points sont appel s points dinterpolation ou dappui. e Les fonctions les plus couramment utilis es sont des polyn mes des fractions e o rationnelles, des sommes dexponentielles etc . Dans ce volume on ne traitera que le cas o` est un polyn me. u o Th or` me 5 Une condition n cessaire et sufsante pour quil existe un polyn me e e e o unique interpolant est que les points dinterpolation soient tous distincts.
5.2
Interpolation de Lagrange
Interpolation lin aire Connaissant deux points dappui e et , on approche la valeur de , pour tout dans par lordonn e du point de m me abscisse se trouvant sur la droite joignant les deux e e points dappui. Dans ce cas le polyn me dinterpolation est du premier degr et s crit : o e e
121
'ded
'}mqk|{ z y mdpdeqk z y
ykx z z y k y z z y gd k d 'dkevte~y w
n mdedve
n mlkGih 8f jjj g
mdde z z
x cw
Remarque 6 La formule ci-dessus n c ssite un grand nombre dop rations pour e e e sa mise en oeuvre informatique ( au total ). En regroupant astucieusement les termes de , on peut economiser le nombre dop rations, do` , si on pose : e u et ; alors et
y x q0 y Gu x ' te d d d g te~ elGmmuuy x d e y q0 y u vte gd x Gx te d d x t j j j h g { f } ~dm6esudm6evl u}p cw ulkif { 'ded4 d x t 6w }up{ y 22 x dte d p te~y Gx xt cw d gd x x qq))m' vte gd d d g u gd d'd m vte d d e vte~y Gx te vx x l l V z U
, on alors .
m}mqk { z y 'ddeqke z y
Interpolation de Lagrange, cas g n ral e e de degr n bas s sur les points dappui e e polyn mes de degr n : o e
Interpolation quadratique Connaissant trois points dappui , et , on approche la valeur de , pour tout x dans par lordonn e du point de m me abscisse se trouvant sur la parabole passant e e par les trois points dappui. Dans ce cas le polyn me dinterpolation est du second degr et s crit : o e e
ulkGf jjjh g
Th or` me 6 (erreur de linterpolation de Lagrange) Soit e e le polyn me dinterpolation de o sur les points soit . Pour tout , il existe lerreur soit
'ddepe mdde z z
Si on pose
. Le polyn me dinterpolation de o
5.3
Th or` me 7 Si les points dappui e e sont tous distincts, alors il existe un polyn me P et un seul de degr au plus 2n+1 tel que les egalites (*) soient veri es. o e e Ce polyn me P s crit o e
d gd e x vte~y Gx qU V g d d l d ze x z z 'dte~y Gx vt d te d d x t j j j h g { f } ~dm6esudm6evl u}p cw ulkif { mddee d x te cw u}p{ z z x gd G xtC d gd te x ed vteC dte z C}d dv z eivtC { gd d 'teC w dmtC x ute w d d gd x x lukjjGhpsf8qedeepvede j g g edude ww gU4 g d
avec .
Th or` me 8 (erreur de linterpolation dHermite) Soit e e le polyn me dinterpolation de Hermite de sur les points o . Pour tout , il existe lerreur est :
En plus de la valeur de aux n+1 abscisses on xe la valeur de sa derivee en ces m mes abscisses, on cherche donc un polynome tel que : e
o` u o` u
Interpolation dHermite
124
5.4
Exercice 32 : . Soit D terminer le polyn me dinterpolation de Lagrange pour les points dappui e o dabscisses : -2, -1, 0, 1, 2 . Discuter lerreur dinterpolation.
Exercice 35 : a) Re crire la formule dinterpolation de Lagrange dans le cas o` les points dape u pui sont equidistants. b) Utiliser le m me tableau qu` lexercice pr c dent compl t par la vraie vae a e e ee leur de et estimer la valeur de . Exercice 36 : a) Utiliser la formule dinterpolation de Lagrange pour trouver la cubique passant par 0.4, 0.5, 0.7, 0.8 pour b) M me question pour e .
1. Determiner le polyn me o 0, 1 et 2.
2. Calculer et , et comparer aux valeurs exactes. Evaluer lerreur dinterpolation en ces deux points. Commentaires ?
d te w
Exercice 37 : Soit
dh )ih
GgmUkmiUg z g y hh
Exercice 33 : Avec quelle pr cision peut-on calculer e grange, si on prend les points :
te d h h i
B ut gd y g d 6mvt
q g d y y vte h h )i
125
, et comparer a la valeur exacte. Evaluer lerreur dinterpola` 2. Calculer tion en ce point. Commentaires ? Exercice 39 : Calculer le polyn me dHermite Q tel que : o Q(0)=f(0), Q(0) =f(0), Q(5)=f(5), Q(5)=f(5), pour En d duire la valeur de Q(4), comparer f(4) a Q(4). e `
g d y y vte
d te w
d % w g d yy vte
.
126
5.5
Exercice 40 : D montrer le th or` me 5, qui donne condition n cessaire et sufsante pour quil e e e e existe un polyn me o unique interpolant une fonction , a savoir que les points ` dinterpolation soient tous distincts. Exercice 41 : Soit
1. Determiner le polyn me o 0, 1 et 2.
et , et comparer aux valeurs exactes. Evaluer ler2. Calculer reur dinterpolation en ces deux points. Commentaires ? Exercice 42 : On se donne les trois points dinterpolation suivants : , , . Avec quelle pr cision peut-on calculer e a laide de linterpolation de Lagrange ` appliqu e a une fonction que vous donnerez ? e ` Exercice 43 : . Soit
1. Determiner le polyn me o 0, 1 et 2.
2. Calculer , et comparer a la valeur exacte. Evaluer lerreur dinterpola` tion en ce point. Commentaires ? Exercice 44 : Approcher par interpolation de Lagrange, sachant que et . Donner une majoration de lerreur th orique e de cette interpolation et la comparer a lerreur effectivement commise (utiliser ` . une dalculatrice pour avoir la valeur exacte de
g d pVvk
g z g y k g
d U0Uv
d te w d te w
x 6w
g g g g g te u d
avec
d d e~s d d d v vh v d d dh e~e dqskeqdke~d ke y z y y qdeqde~d z d d d e~ e h d d d h hUh d d d e~ e qd eqd e~mdk e z y qdeqd e~mdk z y
g tey d
te g d d v d p vte w g d g d z g 'dk y g d 2 g 2 g z rk g y h g
exercice 22
Rappelons que le polyn me de Lagrange bas sur les points dappui dabso e cisses est dordre N et s crit : e
5.6
qt g d x d u d e p vte cw
'akm y
avec
m g d vt u
g g h g z gfk y g z vt gd
exercice 23
M thodes num riques avec Java e e
Soit
te te d d
E 8C Y `C & 6 XWVI C U ED F@C C PH C RH D G C I & & D BC D RH C RH D G C 4 D TH C TH C GH D G C S & & & I I I & & D BC ED F@C D PH C PH D R Q4 D PH C PH C G C I I & C I I I & # & 9 # 9 & 6 # 6 & ) # ) & # A%$B!(A%$@754%28754"3210('%$"! &
avec
q es V d d d d d d e~ e~ es d d d d e~ dU e~ es d d d d d e es V
129
Finalement,
Calculons lerreur th orique sur cette interpolation. celle-ci est donn e ou point e e par :
&
o` u
o` , u
h iU0ipg qd d d h g g )hipVd z d z |vd yz h g U0ivd yz w 0iud yz y yz w y h g g P z e~ z es g d v te te d d d d h h z z es g d v t t d d d d h h { h g } z V G t ac8d z %XU hh g }V z VU t { z y vte t h gd t Hd C d V z sV g h h t t% t tf % d f z d fh UU UU g fh f Rf d g t
(Ceci peut etre par exemple obtenu en d composant de la facon suivante, e . On calcule alors la d riv e dordre e e , ce qui est plus simple,
y y yz g y y 'd$r !chpibqd a
On a clairement
do` u
est
.) donne , (pour trouver , cest a dire les racines de l quation ` e , on a recours au chapitre 2 sur la r solution des equations non lin aire dans ). e e Finalement,
Application a `
. On a
. Or
h h g d Uupih pih uih d d d d d d d d uihz ih pih~y pih pih v uih w g uih w d fpih g d fpihz g d fpihy g d
soit .
g d h d h dh ui%pi%Gi% d h dh d i%~Gi%~Gih g d eqd mdk e z y d qdeqd e~'dk g uih u z y d pih u quih g d d v d p uph w m g d vt u 6 d g d te p vte w d )ih6
, on a
d g te
d yz d yz d yz
P
Ainsi,
De m me, on trouve : e Calculons tout dabord les nombres On cherche donc (Il est de d gr 3 car on a 4 points dappui), avec e e
exercice 25
Par cons uent q , linterpolation de Lagrange, dans ce cas, donne une bonne approximation de .
Soit Estimons la valeur de gr ce a une interpolation de a ` Lagrange bas e sur les points dappui don s dans lexercice. Le polyn me de e e o Lagrange s crit e 131
V gdh h d d 0ih 0h d hG 0iV0i%p0h w h g d U iwh v)ih h U d U t z d y wpih R)ih V V d d h d h d d h )ih e~0i0ie~)h te F F h dt t z g t uih g d g gd t vte gd vte y xt m y vte dte ute z gd gd gd z d qdeqde~mdykd e te d te y | !d (uy x b a g x
Estimation de lerreur th orique dans ce cas. Elle est major e par e e
y Gx qdtd ~y el t d x
de
par est donc de Donc, dans ce cas, linterpolation de Lagrange donne un bon r sultat. e
Ainsi,
o` u
exercice 26
Cherchons et Donc,
a) On cherche la formule de Lagrange dans le cas o` les u points sont equidistants. Dans ce cas on a , (o` u ), do` u . Dautre part, pour tout , il existe un r el tel que e
g k `l j e
j k
m g i hg f k y BeaGhtf
j m
f s g
. On a . Ainsi,
. En fait, on a
. Lerreur effectivement commise lors de lapproximation , donc , , . Or, la valeur exacte . Donc . 132
VU 0ih g d d d d i )U% )C C% g d d d d rnrn~rnn l fVho g d y y iUdx 0h% g h d d d h d )%~0UC)i%)ih V g d d d d d rn qn rn~ qn % g d d d d d h d g d rn~qn rn~ qn l%i h fVC o up ix te h g d gn aih n en V0i u h g j g h g )ig 0i )i k ig h h g h g z h g y h qd el %t d dkl rna qn x rnaq qn n g d d d l p g l n j~j n n n g j jjj n m g j j x j en j m g d j e x dj d j ejen e m g d x g d o g d j d e m rqnpven u vte v gd g x j en
. Par cons quent, e , . , , donc cinq points , alors, . avec 133
rw
g d y y vt
g rn od p d
134
i0i h g t u d e u d
s
g Vh w d
h Gi)i
exercice 29
Soit
avec
et
135
Ainsi,
Ainsi on a et pour comparaison . L cart peut sembler important, mais un calcul de lerreur th orique sur line e terpolation dHermite montre que lerreur effectivement commise est plus petite que cette erreur th orique, (laiss en exercice). En outre, la valeur e e est relativement proche du bord de lintervalle dinterpolation qui est , et en g n ral, e e pour linterpolation de Lagrange ainsi que celle dHermite, lerreur samplie au bord de lintervalle dinterpolation (ce ph nom` ne est dit de Runge), voir la partie e e travux pratiques.
5.7
On pr sente dans la suite une mise en uvre dun calcul dinterpolation e polyn miale, bas sur la formule de Lagrange d crite dans le paragraphe 5.2, o e e sous sa forme enonc e dans la remarque 5 de ce paragraphe. e Soient pour tion. Le calcul de linterpol en e
h } d V0h h }d Gai~e t U U z U h d z Uh %~d z d V d z % z U d mdke mdteqy d 'te 'dkmy d mt y d y d d e mte u d e'te p d d y g z | x evte yz mdkvtey d gd y gd g z y x evt z d vte dh g d gd
, les n points dappui du calcul dinterpolas crit : e
g
z z
} pih{
p te vte~y cw d gd x x y x x l xf h
edB
g g g g d rt
t
136
Pour effectuer ce calcul, on utilise un chier pour r cup rer les coordonn es e e e des points de support. On ecrit pour cela une classe TableauFileIn, similaire a celle ecrite dans le paragraphe 3.4.4 et qui effectue ce travail. Les deux tableaux ` des abscisses et des ordonn es sont lus lun apr` s lautre. Cette classe correspond e e a: `
import java.io.*; import java.util.*; class TableauFileIn { FileReader fichier=null; BufferedReader lecbuf; String line; public TableauFileIn(String nomfichier) { try{ fichier = new FileReader (nomfichier); lecbuf = new BufferedReader (fichier); } catch (FileNotFoundException e) { System.out.println("fichier inexistant !"); } } public double[] lectureTableau() { String line, word; double [] tlu = null; StringTokenizer st; try { // lecture de la taille du tableau sur la ligne 1 : line = lecbuf.readLine(); int nb = Integer.parseInt(line); tlu = new double[nb]; // lecture des coef. du tableau sur 1 seule ligne : line = lecbuf.readLine();
d e g te x d x d e m g y x
137
st = new StringTokenizer(line); for (int j=0; j<nb; j++) { word = st.nextToken(); tlu[j] = Double.valueOf(word).doubleValue(); } } catch (IOException e) { System.out.println("erreur de lecture"); } catch (NumberFormatException e) { System.out.println("erreur de conversion chaine vers double"); } return tlu; } public void fermer() { try { fichier.close(); } catch (IOException e) { System.out.println("Le fichier ne peut pas tre fermer"); e } } }
On pr sente ensuite la classe InterPoly qui permet de repr senter une e e interpolation polyn miale dont le constructeur se chargera de m moriser les o e tableaux des coordonn es des points dappui qui lui sont transmis en param` tres. e e Ce constructeur commence egalement le calcul des coefcients qui ne d pendent e pas de labscisse a laquelle se fera la calcul dinterpolation : il sagit des `
coefcients
// // // //
nombre de points dinterpolation abscisses des points dinterpolation ordonnes des points dinterpolation coefficients de la formule dinterpolation
et nalement
138
private void calCoef() { double prod; int k,j; for (k=0; k<n; k++) { prod=1; for (j=0; j<k; j++) { prod *= xk[k]-xk[j]; } for (j=k+1; j<n; j++) { prod *= xk[k]-xk[j]; } ydp[k] = yk[k]/prod; } } public double interP(double x) { double diff; diff = x- xk[0]; if (Math.abs(diff) < epsilon) return yk[0]; double som = ydp[0]/diff; for (int k=1; k<n; k++) { diff = x-xk[k]; if (Math.abs(diff) < epsilon) return yk[k]; som += ydp[k]/diff; } return som*gamma(x); } }
Nous pr sentons ensuite une classe qui contient un programme de test qui e lit un chier contenant les coordonn es des points dappui et qui afche dans e une fen tre un graphique qui contient les points de supports (sous la forme de e
139
petits carr s) et une courbe de la fonction dinterpolation construite a partir de e ` ces points. Ces trac s graphiques utilisent la biblioth` que d crite dans la chapitre e e e pr c dent et sont d crits dans la m thode paint de la classe CanvasGraphe e e e e dont le constructeur initialise les composants graphiques qui seront utilis s et qui e sont transmis en param` tres. e Le domaine de repr sentation de ce graphique est obtenu en recherchant e les coordonn es extr` mes des points de support. Ceci se fait gr ce a la classe e e a ` MaxminTabDouble construite a cet effet et d crite dans le listing qui suit : ` e
import import import import import import import import import import
java.lang.*; java.io.*; java.util.*; java.awt.*; TableauFileIn; InterPoly; DomaineDouble; DomaineInt; ManipGraphe; FenetreGraphe;
class CanvasGraphe extends Canvas { ManipGraphe mp = null; DomaineDouble cr; DomaineInt ce; FoncD2D f; double[]xdata; double[]ydata; CanvasGraphe(DomaineDouble domReel, DomaineInt domEcran, double[] x, double[] y, FoncD2D fonc) { cr = domReel; ce = domEcran; xdata = x; ydata = y; f = fonc; setSize(new Dimension(ce.xmax-ce.xmin, ce.ymax-ce.ymin)); mp = new ManipGraphe (domReel, domEcran); } public void paint(Graphics g) { mp.coloreFond(g, Color.white); mp.traceAxesCentres(g, Color.black); mp.tracePoints(g, Color.red, xdata, ydata); mp.traceFonction(g, Color.blue, f, cr.xmin, cr.xmax);
140
class PrgInterPolyGra { public static void main(String args[]) { // lecture du fichier de donnes e TableauFileIn f = new TableauFileIn("donnees.dat"); double[] xlu = f.lectureTableau(); double[] ylu = f.lectureTableau(); f.fermer(); // calcul des extrema des tableaux : MaxminTabDouble mxlu = new MaxminTabDouble(xlu); double maxxlu = mxlu.getmaxi(); double minxlu = mxlu.getmini(); MaxminTabDouble mylu = new MaxminTabDouble(ylu); double maxylu = mylu.getmaxi(); double minylu = mylu.getmini(); // construction de linterpolation polynomiale : InterPoly pp = new InterPoly(xlu, ylu); // representation graphique du calcul : DomaineDouble dr = new DomaineDouble(minxlu, minylu, maxxlu, maxylu); DomaineInt de = new DomaineInt(0, 0, 600, 450); CanvasGraphe cg = new CanvasGraphe(dr, de, xlu, ylu, pp); FenetreGraphe x = new FenetreGraphe(de, cg, pp.libelle());
141
Premier exemple Le chier dentr e qui a et utilis pour les coordonn es des points dappui e e e e est compos de 4 points et permet dobtenir un r sultat pr visible et satisfaisant. e e e Il correspond aux donn es suivantes : e
4 0.4 0.5 0.7 0.8 4 -0.91 -0.69 -0.85 -0.22
La fen tre graphique obtenue comme r sultat de ce programme, a partir de ces e e ` donn es, correspond a la gure 5.1. e `
F IG . 5.1: Fen tre g n r e par 1er exemple de calcul dinterpolation polyn miale e e ee o
Deuxi` me exemple e
142
Nous prenons maintenant lexemple du a Runge et qui consiste a calculer une ` ` interpolation polyn miale a partir de points dappui extraits de la courbe suivante : o `
Runge a montr que lerreur commise entre cette fonction et son interpolation e polyn miale tendait vers linni lorsque le degr dinterpolation tendait lui-aussi o e vers linni. Le chier de donn es utilis est alors le suivant : e e
11 -5 -4 -3 -2 -1 0 1 2 3 4 5 11 0.038 0.059 0.1 0.2 0.5 1 0.5 0.2 0.1 0.059 0.038
Comme le laisse pr voir la propri t enonc e pr c demment, la courbe dine ee e e e terpolation va pr senter des oscillations, ces derni` res se situent pour les valeurs e e dabscisses ayant les plus grandes valeurs absolues. Cest effectivement ce que donne la repr sentation graphique obtenue par le programme et qui est repr sent e e e e sur la gure 5.2.
z vt gd
143
, pour , de . Dans le chaOn consid` re les n+1 points e pitre pr c dent, on sest int ress a la recherche et au calcul de la fonction dine e e e` terpolation qui passe exactement par ces points. Dans ce chapitre, on cherche a ` construire une courbe qui, dans un sens a pr ciser, sapproche des points ` e , ces points pouvant provenir de mesures, par exemple, et donc contenir des erreurs exp rimentales. e
y
ci
p(x) xi x
F IG . 6.1: Approximation de donn es par une fonction p(x) e On recherche donc une fonction dapproximation, encore appel e mod` le et e e not e e qui va r pondre a cette question. Ce mod` le d pend de param` tres : e ` e e e
144
Bdp"4e
ulaaGPg f h
edp"4
d tecu
145
par exemple, sil correspond a une fonction polyn me dun degr donn , les pa` o e e ram` tres sont les coefcients du polyn me. e o Le probl` me que lon se pose consiste donc a rechercher le meilleur jeux de e ` param` tres de facon a ce que la courbe repr sentative du mod` le passe au plus e ` e e pr t des points de donn es. e e La notion de meilleure proximit retenue ici est le crit` re des moindres e e carr s. Il consiste a rechercher le minimum de la fonction : e `
Le minimum est r alis pour des valeurs particuli` res des param` tres qui core e e e respondent donc a lajustement du mod` le par rapport aux points de donn es. ` e e
6.2
ci
F IG . 6.2: R gression lin aire e e On recherche la droite d quation e la plus proche de lensemble des points , , au sens des moindres carr s. Si on note e l cart entre la droite de r gression et le point consid r , on cherche e e ee le minimum de
an dobtenir les meilleures valeurs des param` tres e Le minimum est obtenue si
et .
h pg
z ddecu x
xi
rw
h g
146
y=ax+b
ci ax+b i ei
x xi
Cest a dire `
p$ g d o o w8 z x x x l x g z
147
on obtient :
Et donc la valeur de
Il reste alors a d terminer la pertinence du calcul de r gression lin aire par ` e e e rapport aux donn es. Pour cela, on d nit le coefcient de corr lation lin aire : e e e e
On montre que Si est voisin de 0 alors il ny a pas de liaison lin aire entre les 2 coore donn es des points de donn es et le calcul de r gression lin aire nest pas e e e e repr sentatif de ces donn es ; e e est voisin de 1 alors les points de donn es sont proches dun alignee Si ment et le calcul de r gression se justie. e
6.2.1
Nous pr sentons maintenant une mise en uvre du calcul de r gression e e lin aire en utilisant les formules pr c dentes. Nous calculons les coefcients e e e de la droite de r gression et le coefcient de corr lation a partir du calcul des e e ` diff rentes sommes intervenant dans les formules. e La classe Reglin effectue ces calculs dans la m thode calculCoef. Elle e poss` de un constructeur qui a deux param` tres correspondants aux deux tableaux e e contenant les coordonn es des points dappui. Ces deux tableaux sont m moris s e e e dans des donn es membres. Le calcul des coefcients est alors lanc en n de e e construction. On acc` de aux r sultats, stock s dans des donn es membres, gr ce e e e e a a des op rateurs dacc` s du type getxxx. ` e e
148
public double calcul(double z) {return a*z+b;} public String libelle() {return "regression lineaire";} }
Nous pr sentons maintenant un programme utilisant la classe Reglin e pour calculer la droite de r gression a partir de donn es stock es dans un e ` e e chier. Ce programme est, en fait, tr` s similaire au programme dexemple du e chapitre pr c dent sur linterpolation polyn miale. On utilise la m me classe e e o e CanvasGraphe qui nest pas r ecrite ci-dessous. e
149
import import import import import import import import import import import
java.lang.*; java.io.*; java.util.*; java.awt.*; TableauFileIn; Reglin; DomaineDouble; DomaineInt; ManipGraphe; FenetreGraphe; MaxminTabDouble;
class PrgReglin { public static void main(String args[]) { // lecture du fichier de donnes e TableauFileIn f = new TableauFileIn("donnees.dat"); double[] xlu = f.lectureTableau(); double[] ylu = f.lectureTableau(); f.fermer(); // calcul des extrema des tableaux : MaxminTabDouble mxlu = new MaxminTabDouble(xlu); double maxxlu = mxlu.getmaxi(); double minxlu = mxlu.getmini(); MaxminTabDouble mylu = new MaxminTabDouble(ylu); double maxylu = mylu.getmaxi(); double minylu = mylu.getmini(); // construction de linterpolation polynomiale : Reglin rl = new Reglin(xlu, ylu); System.out.println("Resultats du calcul de regression lineaire :"); System.out.println("Fonction de regression : " +rl.geta()+ " x + " +rl.getb()); System.out.println("coefficient de correlation : "+rl.getr());
// representation graphique du calcul : DomaineDouble dr = new DomaineDouble(minxlu, minylu, maxxlu, maxylu) DomaineInt de = new DomaineInt(0, 0, 600, 450); CanvasGraphe cg = new CanvasGraphe(dr, de, xlu, ylu, rl); FenetreGraphe x = new FenetreGraphe(de, cg, rl.libelle()); x.show(); }
150
Le programme renvoie des r sultats sous forme texte qui sont les suivants : e
java PrgReglin Resultats du calcul de regression lineaire : Fonction de regression : 1.0312158159925882 x + -3.047626180872437 coefficient de correlation : 0.9939141140402419
Le programme lance egalement louverture de la fen tre graphique suivante e repr sent e par la gure 6.4. e e
6.3
Nous allons etendre le calcul de r gression lin aire a un mod` le plus g n ral e e ` e e e du type :
Les fonction sont connues alors que les coefcients sont les param` tres e a ajuster par rapport aux donn es. ` e Un tel mod` le est appel lin aire en raison de son expression qui est effectie e e vement lin aire par rapport aux param` tres . e e On retrouve le mod` le de r gression lin aire en posant e e e , et . Lexpression du mod` le est donc e .
4 vtcu y gd gt g d y
l vf phqdB4e d gd t y vte6u
vtey gd
151
F IG . 6.4: Fen tre g n r e par le programme de test du calcul de r gression lin aire e e ee e e
Comme pour le calcul de r gresxion lin aire, on applique le crit` re des e e e moindres carr s qui consiste a rechercher le minimum de la fonction e `
Ce minimum est atteind lorsque les d riv es partielles de e e chaque coefcient , , sont nulles :
par rapport a `
v u d h qg v h m!u h v y de d g v h u g zv h x 1de go v h u g v h u x x d e y
v u h
zv u h
d x "~GGG q de g c d uU l
mGGig h 1de x de x h h
uqGGGi h g y g de de y x g de de % y x g 'dede y y % de % g d y G G y
6.3.1
On pose
La solution
correspond aux
matrice dordre
u !u
coefcients
cherch s. En effet e
152
153
6.3.2
Nous pr sentons maintenant une mise en uvre de ce calcul matriciel permete tant une identication dun mod` le lin aire, a partir dun ensemble de points dape e ` pui. Nous utilisons les diff rentes classes construites dans les chapitres pr c dents, e e e a savoir : ` vecteur : la classe de vecteurs d nit en 1.3.4 ; e matrice : la classe de matrices d nit en 3.4.2 ; e sysGeneLU : la classe de syst` mes lin aires g n raux d nit en 3.4.5. e e e e e Nous utilisons aussi une classe dexception SysLinException d nie e dans le m me chapitre et appel e lorsque la r solution dun syst` me lin aire e e e e e echoue (matrice num riquement singuli` re, par exemple). e e Le constructeur de la classe Modlin qui suit se charge uniquement de r cup rer le tableau de fonctions pass s en param` tres et laffecte a une donn e e e e e ` e propre du m me type. La m thode identifie se charge de faire le calcul e e didentication sous forme matriciel comme d crit pr c demment : les matrices e e e et vecteurs n cessaires sont construits et on appelle la m thode de r solution de e e e syst` me de la classe sysGeneLU. Une m thode getcoef permet de renvoyer e e un des coefcients identi s. On d nit aussi les deux m thodes de linterface e e e FoncD2D que notre classe impl mente. Ces m thodes seront utilis es, par e e e exemple, pour permettre une repr sentation graphique gr ce a la biblioth` que e a ` e d nie au chapitre 4. e
import import import import import vecteur; matrice; sysGeneLU; SysLinException; FoncD2D;
class Modlin implements FoncD2D{ int m; // nombre de fonctions de base du modele vecteur coef; // coef. du modele a identifier FoncD2D [] phi; // fonctions de base Modlin(FoncD2D [] foncbase) { m = foncbase.length; phi = foncbase; } public void identifie(double[] xdata, double[] ydata) throws SysLinException { // 1. construction des matrices et vecteurs :
154
vecteur y = new vecteur(ydata); int n = ydata.length; matrice f = new matrice(n,m); matrice ft = new matrice(m,n); for (int i=0; i<n; i++) for (int j=0; j<m; j++) { double coefij = phi[j].calcul(xdata[i]); f.toCoef(i, j, coefij); ft.toCoef(j, i, coefij); } // 2. Construction et rsolution du systeme lineaire : e matrice a = matrice.produit(ft,f); vecteur b = matrice.produit(ft,y); sysGeneLU syst = new sysGeneLU(a,b); coef = syst.resolution(); } public double calcul(double x) { double result=0; for(int i=0; i<m; i++) result += coef.elt(i) * phi[i].calcul(x); return result; } public String libelle() {return "modele lineaire de moindres carres";} public double getcoef(int i) {return coef.elt(i);} }
Le programe suivant donne un exemple dutilisation de cette classe. Il a pour but de trouver une approximation par un polyn me de degr 3 dun ensemble de o e points lus dans un chier. Il est en grande partie similaire a celui du paragraphe ` pr c dent, sauf pour la construction dune instance de la classe Modlin. Lappel e e a la m thode didentication qui suit se fait en g rant lexception eventuellement ` e e d clanch e si la r solution du syst` me echoue. On remarquera le processus de e e e e construction des diff rentes fonctions de base du mod` le et du tableau qui les e e contient.
155
class Fbase1 implements FoncD2D{ public double calcul(double x) {return 1;} public String libelle() {return "f(x)=1";} } class Fbase2 implements FoncD2D{ public double calcul(double x) {return x;} public String libelle() {return "f(x)=x";} } class Fbase3 implements FoncD2D{ public double calcul(double x) {return x*x;} public String libelle() {return "f(x)=x2";} } class Fbase4 implements FoncD2D{ public double calcul(double x) {return x*x*x;} public String libelle() {return "f(x)=x3";} } class PrgModlinPoly { public static void main(String args[]) { // lecture du fichier de donnes e TableauFileIn f = new TableauFileIn("donnees.dat"); double[] xlu = f.lectureTableau(); double[] ylu = f.lectureTableau(); f.fermer(); // calcul des extrema des tableaux : MaxminTabDouble mxlu = new MaxminTabDouble(xlu); double maxxlu = mxlu.getmaxi(); double minxlu = mxlu.getmini(); MaxminTabDouble mylu = new MaxminTabDouble(ylu); double maxylu = mylu.getmaxi(); double minylu = mylu.getmini();
156
// construction de linterpolation polynomiale : Fbase1 f1 = new Fbase1(); Fbase2 f2 = new Fbase2(); Fbase3 f3 = new Fbase3(); Fbase4 f4 = new Fbase4(); FoncD2D [] fbase = {f1, f2, f3, f4}; Modlin ml = new Modlin(fbase); try { ml.identifie(xlu, ylu); System.out.println("Resultats de lidentifiaction des coef. :"); for (int i=0; i<fbase.length; i++) System.out.println("coef. "+i+" : "+ml.getcoef(i)); // representation graphique du calcul : DomaineDouble dr = new DomaineDouble(minxlu, minylu, maxxlu, maxylu); DomaineInt de = new DomaineInt(0, 0, 600, 450); CanvasGraphe cg = new CanvasGraphe(dr, de, xlu, ylu, ml); FenetreGraphe x = new FenetreGraphe(de, cg, ml.libelle()); x.show(); } catch(SysLinException e) { System.out.println("erreur au cours de lidentification"); } } }
13 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 13 -12 -13 -9 -7 -9 0 5 13 11 6 9 5 0
java PrgModlinPoly Resultats de lidentifiaction des coef. : coef. 0 : 4.160839160839161 coef. 1 : 3.772560772560772
157
Il provoque egalement louverture de la fen tre qui est d crite dans la gure e e 6.5.
F IG . 6.5: Fen tre g n r e par le programme de calcul dun mod` le lin aire en e e ee e e utilisant un polyn me de degr 3 o e
Le r sultat obtenue reste assez eloign des points de support car le degr e e e du polyn me est relativement peu elev par rapport aux variations des points o e de donn es. On montre ci-dessous comment il est tr` s simple de construire un e e nouveau mod` le, ici un polyn me de degr 9, et de lint grer au programme de e o e e test. Toutes les classes utilis es sont sufsamment g n riques pour ne pas avoir e e e besoin d tre modi e. Le programme de test devra d nir toutes les classes e e e qui vont permettre de construire les fonctions de base n cessaires, appel es ici e e Fbasexxx. Il ne restera plus qu` les instancier effectivement et utiliser ces a instances pour construire le tableaux des fonctions de base. Tout le reste reste inchang . Voici ci-dessous la partie de programme a modier : e `
...
158
class Fbase9 implements FoncD2D{ public double calcul(double x) {return x*x*x*x*x*x*x*x;} public String libelle() {return "f(x)=x8";} } class Fbase10 implements FoncD2D{ public double calcul(double x) {return x*x*x*x*x*x*x*x*x;} public String libelle() {return "f(x)=x9";} } class PrgModlinPoly { public static void main(String args[]) { // lecture du fichier de donnes e TableauFileIn f = new TableauFileIn("donnees.dat"); double[] xlu = f.lectureTableau(); double[] ylu = f.lectureTableau(); f.fermer(); // calcul des extrema des tableaux : MaxminTabDouble mxlu = new MaxminTabDouble(xlu); double maxxlu = mxlu.getmaxi(); double minxlu = mxlu.getmini(); MaxminTabDouble mylu = new MaxminTabDouble(ylu); double maxylu = mylu.getmaxi(); double minylu = mylu.getmini();
159
// construction de linterpolation polynomiale : Fbase1 f1 = new Fbase1(); Fbase2 f2 = new Fbase2(); Fbase3 f3 = new Fbase3(); Fbase4 f4 = new Fbase4(); Fbase5 f5 = new Fbase5(); Fbase6 f6 = new Fbase6(); Fbase7 f7 = new Fbase7(); Fbase8 f8 = new Fbase8(); Fbase9 f9 = new Fbase9(); Fbase10 f10 = new Fbase10(); FoncD2D [] fbase = {f1, f2, f3, f4, f5, f6, f7, f8, f9, f10}; Modlin ml = new Modlin(fbase); ...
Les r sultats obtenus sont donn s ci-apr` s, ainsi que la fen tre graphique e e e e g n r e dans la gure 6.6. e ee
java PrgModlinPoly Resultats coef. 0 : coef. 1 : coef. 2 : coef. 3 : coef. 4 : coef. 5 : coef. 6 : coef. 7 : coef. 8 : coef. 9 : de lidentifiaction des coef. : 7.005477494642518 8.749201812979114 -2.1606780667741687 -1.4914188653043547 0.22366539817694758 0.1196340396538589 -0.00928900068800065 -0.003989574631021212 1.2400793650802364E-4 4.5863252708478754E-5
Nous montrons maintenant un nouveau calcul, a partir des m mes donn es, et ` e e qui utilise un mod` le constitu dune somme de 4 fonctions trigonom triques : e e e
...
160
F IG . 6.6: Fen tre g n r e par me programme de calcul dun mod` le lin aire en e e ee e e utilisant un polyn me de degr 9 o e
class Fbase1 implements FoncD2D{ public double calcul(double x) {return Math.cos(x/2);} public String libelle() {return "f(x)=cox(x/2)";} } class Fbase2 implements FoncD2D{ public double calcul(double x) {return Math.sin(x/2);} public String libelle() {return "f(x)=sin(x/2)";} } class Fbase3 implements FoncD2D{ public double calcul(double x) {return Math.cos(1.5*x);} public String libelle() {return "f(x)=cos(1.5*x)";} } class Fbase4 implements FoncD2D{ public double calcul(double x) {return Math.sin(1.5*x);} public String libelle() {return "f(x)=sin(1.5*x)";} }
161
class PrgModlinTrigo { public static void main(String args[]) { // lecture du fichier de donnes e TableauFileIn f = new TableauFileIn("donnees.dat"); double[] xlu = f.lectureTableau(); double[] ylu = f.lectureTableau(); f.fermer(); // calcul des extrema des tableaux : MaxminTabDouble mxlu = new MaxminTabDouble(xlu); double maxxlu = mxlu.getmaxi(); double minxlu = mxlu.getmini(); MaxminTabDouble mylu = new MaxminTabDouble(ylu); double maxylu = mylu.getmaxi(); double minylu = mylu.getmini(); // construction de linterpolation polynomiale : Fbase1 f1 = new Fbase1(); Fbase2 f2 = new Fbase2(); Fbase3 f3 = new Fbase3(); Fbase4 f4 = new Fbase4(); FoncD2D [] fbase = {f1, f2, f3, f4}; Modlin ml = new Modlin(fbase); ...
Les r sultats num riques et graphiques (cf. gure 6.7) sont donn s ci-apr` s. e e e e
java PrgModlin Resultats coef. 0 : coef. 1 : coef. 2 : coef. 3 : de lidentifiaction des coef. : 5.208201909446939 10.348725340528471 1.4466187029503472 3.250853663738151
Nous remarquons une assez bonne solution gr ce a ce polyn me trigoa ` o nom trique alors que, seuls, quatre coefcients sont a calculer, comparativement e ` aux 10 coefcients de lapproximation polyn miale pr c dente. Toutefois, il est o e e n cessaire que les fr quences des fonctions trigonom triques entrant en jeu soient e e e correctement ajust es aux donn es dentr e. En effet, ces fr quences ne sont pas e e e e
162
F IG . 6.7: Fen tre g n r e par me programme de calcul dun mod` le lin aire en e e ee e e utilisant un polyn me trigonom trique a 4 termes o e `
calcul es par la m thode dajustement. Pour quelles soient d termin es par un e e e e processus de moindres carr s, il serait n cessaire dintroduire des coefcients e e a identier a lint rieur des fonctions trigonom triques : le mod` le nest alors ` ` e e e plus lin aire et la m thode d crite, ici, nest plus sufsante. Il faut elaborer une e e e m thode dajustement de mod` les non lin aires. Pour cela, un proc d classique e e e e e serait de plonger la m thode pr c dente dans un processus it ratif o` lon reme e e e u place les fonctions non lin aires par leur d veloppement limit au premier ordre. e e e La convergence du processus it ratif permet alors dobtenir la solution de notre e probl` me non lin aire. Nous nirons pas plus loin, dans le cadre de cet oue e vrage, sur cette m thode sugg r e ici, m me si les classes que nous avons d j` e ee e ea pr sent es, notamment la classe IterGene du chapitre 2, nous fournissent des e e outils int ressants de d marrage pour une mise en uvre. e e
163
6.4
Exercice 45 : ....... Exercice 46 : ....... Exercice 47 : ....... Exercice 48 : ....... Exercice 49 : .......
164
6.5 6.6
C}y mv|{
55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
555 555 555 5 555 5 555 5 5 555 5 5 555 5 55 5 555 5 5 555 5 5 555 5 55 5 555 5 555 5 555 555
u}p{
u}p{
d 8t kg
Les m thodes dint gration num rique, interviennent essentiellement lorsque e e e e une primitive de est dexpression assez compliqu e ou inconnue, ou lorsque nest connue que par points, par exemple si elle r sulte de mesures physiques, e on peut lapprocher alors par interpolation ( chap. pr c dent), puis on int` gre e e e num riquement linterpol e. On traitera seulement les int grales du type : e e e
7.1.1
7.1
o` u
Chapitre 7
est un intervalle ni de IR et
f(x)
165
j m
f c g
Figure 9 .
x
55 55 55 5 55555 555 5 5 55 55 55 55 55555 555 5 55 55 5 55555 555 5 5 55555 555 5 55 55 55 55 55 55 55555 555 5 5 5 55555 555 5 55 55 55 55 55555 555 55555 555 55 55 55 55 55 55 55555 55 55 55 55 55555 55 555
55 55 55 55 55 55 55 55 55
166
connues pour . Puis sur chaque sous-intervalle ,( ) on remplace la fonction par dans le cas de la m thode e des rectangles sup rieurs (g 8) et par e dans le cas de la m thode des e rectangles inf rieurs (g 9). e
7.1.2
x1
x2
Figure 10 Cette fois-ci on prend pour chaque sous-intervalle comme hauteur du rectangle, on a alors
do` u
7.2
On consid` re une subdivision de [a,b] en sous intervalles egaux e de bornes ,( ), et . On suppose connues les valeurs pour . Sur chaque intervalle on remplace la fonction par la droite : .
d z 4}y m4 {
g f C}y mv|{
,
y d te dee mdy e ede de g C}y ulkGigf ede jjjh g m4 { g j x p uloGiIg f mjf Pg g g jjjh 4}y m4 { x
e d t | ed c@a d x b% z d f g j ej vd j 8t } d y x y y x d j } d y 8t
'dy de t d
ulkiwf jjjh g
jjj p8ulkGih de
167 du trap` ze. Par cons quent en some e ,( ), on obtient une , alors
Pour justier ce proc d il faut montrer que e e peut etre rendu aussi proche que lon veut de pourvu que le pas soit assez petit et que soit assez r guli` re e e ( voir les r f rences donn es en n de ce polycope). On d montre que lerreur ee e e commise par application de cette m thode est donn e par : e e
Donc si
7.3
M thode de Simpson e
Dans cette m thode on suppose que n est pair (soit n=2s), puis on subdivise e en s sous intervalles egaux de longueur , ( ), puis on remplace sur chaque intervalle non pas par une droite comme dans les trap` zes, mais par une parabole ayant aux abscisses e les m mes valeurs que ; cest a dire par une interpolation quadratique sur ces trois e ` points. Le polyn me o dinterpolation en est (voir chapitre 4) :
Dautre part la surface d limit e par cette parabole, les droites e e et laxe des abscisses sobtient en calculant : do` ; u
'd'dy e ed %dy e d 1tey w g y g j A dmy z ede mdy e j dmy z mdy e ede A j edz 'dy e mdy e y wr w mqy }Cy { mqy C}y mqy {
g t
g te~y w d yw
d t
f h f
u}p{
cest a dire : `
Donc si
, alors
Remarque 7 En g n ral la m thode de Simpson donne une meilleure approxie e e mation que celle des trap` zes, ( sous certaines conditions de r gularit de , voir e e e r f rences ...), car lerreur commise lorsquon applique les trap` zes est proporee e tionnelle a , alors que pour Simpson elle est proportionnelle a , et comme par ` ` une transformation de la variable dint gration on peut toujours se ramener de e a et qualors , on a donc . ` Remarque 8 Comparaison des erreurs :
7.4
x g
M thode de Romberg e
Cest un proc d dacc l ration de la convergence dautres m thodes comme e e ee e les trap` zes. En g n ral pour calculer e e e , on xe un pas et on approxime par , o` u est lerreur commise, e e avec lhypoth` se que cette erreur tend vers 0 avec pour sufsamment r guli` re. e
j d rj rj qjof d d d g d g 8t 8htf f
j @
}4}dz Hz jj j
j
pour
} { Gih
d htf
} ~Gih{ u}p{ zj
l f g
j
169
Lid e de lalgorithme de Romberg est de prendre une combinaison lin aire de e e et de qui donnera une meilleure approximation de , puis de recommencer avec , etc . Prenons par exemple la m thode des trap` zes on a e e o` u d signe lapproximation pour n subdivisions de e de longueur . Dans le cas o` lon peut faire un d veloppement limit en on a : u e e
). Dautre part :
Si on fait , (cest a dire ` ), les termes en sont elimin s, donc e lerreur commise est equivalente a , ce qui est bien s r meilleur. ` u En continuant ce raisonnement avec on obtient lalgorithme de Romberg dans lequel, pour clarier les notations, les valeurs obtenues directement par les trap` zes seront not es e e , au lieu de De m me e le r sultat de la e combinaison de Romberg, voir le on notera tableau ci-dessous qui r sume cet algorithme : e
. . .
On construit la premi` re ligne qui correspond aux trap` zes avec subdivisions, e e subdivisions, etc... et on d signe par les ches et les diff rentes combinaisons e e e a lorigine de la che , donc la deuxi` me ligne est obtenue gr ce a : ` e e a ` la troisi` me ligne est obtenue gr ce : e a r currence qui donne le passage de la e ligne a la ` , etc... do` la r` gle de u e ligne :
y z g m z v v l l
jj j z @ jjj G z jjj y y y G x 6@ x z c8 x 6 x ~ x ~ x @ x t@ x jjj G j y q y B q zj y d f z d jr d d w j d d i htg x t jj z w j j z wz j z j j z } 'drj ew z j w z j w j `j z @ji vrj d jj z y g d d rj ew z j w z j w j `j z @ji htg x jj z y d f
d y 'v z z g y y v
jj j y x 6
jj j V z y x t y x 6
jj j x y z t z x y z t y x z 6
jj j
x y x y t z x y t y x 6
drjtg x f g d t d z tf qjof d
f j
170
la ligne du tableau de Romberg donne des approximations de lint grale e pour lesquels lerreur est en ; donc est plus pr cis que e pour , et dautre part est moins pr cis que e qui lest moins que , . La pr cision augmente de haut en bas et de gauche a droite du tableau, mais ate ` tention, pas n c ssairement sur les diagonales. e e Remarque 9 . On remarque que dans la deuxi` me ligne du tableau de Romberg, e est exactement le r sultat de la m thode de Simpson. e e
jj j x ~ x
x z ~ x ~ j x q z y z z g x y p jj j x ~ x z q x ~C %
Une fois calcul s e , ,
, on a
z x o
171
7.5
Exercice 50 : a) Donner les formules des rectangles approchant . b) Trouver lerreur commise en appliquant la m thode des rectangles, ainsi que le e nombre minimum de subdivisions de pour avoir a 1/100 pr` s ` e c) Donner la m thode des rectangles a point milieu. e ` d) Trouver lerreur commise en appliquant la m thode des rectangles a point mie ` lieu. M me application qu` la question b). e a
Exercice 52 : On lance une fus e verticalement du sol et lon mesure pendant les premi` res 80 e e secondes lacc leration : e
Calculer la vitesse V de la fus e a linstant t=80 s, par les Trap` zes puis par Simpe ` e son.
Exercice 54 : Trouver le nombre N de subdivisions n cessaires de lintervalle dint gration e e , pour evaluer a ` pr` s, gr ce a Simpson, lint grale : e a ` e .
Exercice 55 : Evaluer a laide de la m thode des Trap` zes, lint grale : e e e erreur inf rieure a e ` .
, avec une
8d z ek' g
Exercice 53 : Calculer a laide de la m thode des Trap` zes lint grale ` e e e N=5 puis N=10 points dappui).
d 8te
Exercice 51 : D terminer par le m thode des trap` zes puis par celle de Simpson e e e la base du tableau suivant :
w y d g 1te f
} Gh{
h 0ih
h
sur
(avec
A% ~ } k@uP{
172
Exercice 56 : Evaluer a laide de la m thode des trap` zes puis celle de Romberg bas e sur les e e e trap` zes, lint grale : e e , avec une erreur inf rieure a e ` . Comparer les vitesses de convergence. Comparer a la valeur exacte . ` Exercice 57 : Soit . Combien faut-il de subdivisions de [0,1] pour evaluer a pr` s en utilisant e 1. la m thode des trap` zes e e 2. la m thode de Simpson e
h
y y y
r 0
r h w
G C h d g te d
173
7.6
Exercice 58 : Soit . Combien faut-il de subdivisions de [0,1] pour evaluer a pres en utilisant
est donn e par e , on int gre e ( qui commence comme suit : ...
1. Donner lerreur commise sur le r sultat si on se contente du d veloppement e e a lordre 6 de ` . 2. Estimer alors a cette erreur pr` s, et comparer a la valeur exacte ob` e ` tenue par votre calculette.
1. En utilisant la m thode des trap` zes, combien faut-il de subdivisions de e e pour evaluer a ` pr` s ? e 2. D terminer alors e Exercice 62 : Soit par les trap` zes a e `
1. En utilisant la m thode de Simpson, combien faut-il de subdivisions de e pour evaluer a ` pr` s ? e 2. D terminer alors e Exercice 63 : Soit par la m thode de Simpson a e `
pr` s . e
1. En utilisant la m thode de Simpson, combien faut-il de subdivisions de e pour evaluer a ` pr` s ? e 2. D terminer alors e
} Gih{
h
h z G
d z$ h d z |s
Exercice 61 : Soit
pr` s . e
h
r r r A8 $
'd m ut gd
'd$rkm
d 1tvc8A cy
h g } e ih{
d C d te
h d G C z t g d d C } |@h{
. en subdivisant
174
1. En utilisant la m thode de Simpson, combien faut-il de subdivisions de e pour evaluer a ` pr` s ? e 2. D terminer alors e Exercice 65 : Soit par la m thode de Simpson a e `
pr` s . e
1. En utilisant la m thode de Simpson, combien faut-il de subdivisions de e pour evaluer a ` pr` s ? e 2. D terminer alors e Exercice 66 : Soit
1. En utilisant la m thode de Simpson, combien faut-il de subdivisions de e pour evaluer a ` pr` s ? e 2. D terminer alors e Exercice 67 : Soit .
1. En utilisant la m thode des trap` zezs, combien faut-il de subdivisions de e e pour evaluer a ` pr` s ? e 2. D terminer alors e Exercice 68 : Soit par la m thode des trap` zezs a e e `
pr` s . e
en
sous intervalles .
egaux de bornes
et
commise par la m thode des trap` zes sur un sous e e 1. Retrouver lerreur intervalle . Montrer que la formule g n rale de lerreur e e commise par application de cette m thode, sur tout e , est donn e par : e
En d duire que si e
, alors
2. Soit
et
} Gih{ } w {
y f r dr A8's g z r u'd$r g w z Hzy 'dsre | ed cw h b a g z u}pfe { d g z @jd w u}p{ fg C}y 4@r4r { d qjC g l r g r jjjh g gj x g gg ulkGsf mjf po4r l u}p{ r dr A8's 8f g
h
h G
d h G d
} h{
175
a un bon changement de variable). ` (b) En utilisant le fait que des trap` zes. Si e m thode. e
, approximer
(c) Combien faut-il de subdivisions de [0,1] pour evaluer en utilisant la m thode des trap` zes. e e
(a) Rappeler la formule des trap` zes ainsi que lerreur commise par son e application. Donner une d monstration de lerreur. e (b) Exprimer en fonction de dint gration n cessaire pour calculer e e . (c) Trouver
et en d duire N. e
d t m pg
2. Pour calculer
1. Montrer que lon peut d terminer un r el strictement positif e e . (Indication : majorer par .
tel que
Exercice 69 : Pour approcher num riquement lint grale e e forme o` u et ment positif).
h y G i
y i
a `
F F y g y F g g y f
08 2
o` u
et o` u
gd w t2on
"0ih g j h g w a d t on i if gy y g y
, (penser
d Fy
yy
f g
yz h
yz h
n n ' r
, donc,
nq u d n h g dh d h x'dsr d g h
exercice 31
Les points dappui donn s dans cet exercice correspondent a la fonction e ` . Et . On constate donc que lapproximation de par Simpson est meilleure que celle par les trap` zes, puisque e et .
g f V iU0hi hh h g f f '
mU0ih mjj0h d h j d j dU7 z
UU0hih g m f g
jU0ih jj dU y 2 7
f
hh i U0hU g h g 2 j g
d 8te g
7.7
a) Soit par,
exercice 32
b) Soit
lapproximation de
UUh UU0ih g h G j j 7h h! hG d h Uh g v d z d 6m j z d 6m z d 6' z d m$ 6' d z $6m u ! h gj h g e h iUVih g d h6m d z $m0u h g d x e d j g v 8d z d m z d 6' z d 6m z d k'2 ! d y ee y x g j f z m kg f
. Calculons
a) Calculons par la m thode des trap` zes. Ici, dapr` s le tableau des valeurs, e e e .
alors que la valeur exacte est approximativement petit lapproximation num rique est meilleure. e
f f
exercice 34
h g j
Soit
a)
b) Calculons
f e
177
e !
h g d ee ! rrj de x h g d j d w rrj e e g j ! g gf A
exercice 36
u}p {
donc,
exercice 35
o` u
Soit
d f te vlGn
donc,
, o` est lerreur permise, il suft de prendre u tervalle dint gration telles que e Soit , par cons quent, e
v rie e
( (
l u r #t%
l
q s r `
h P
Etudions alors cette equation : Graphiquement, en tracant les courbes repr sentatives dans e de et de , on voit rapidement (` faire) que le a seul point dintersection de et de est dabscisse . On en d duit que e atteint ses extremas sur en ou ou . , le d veloppement limit en e e de donne : Cherchons
c db
A % RQP A B
.
86 97 3
@
3 4
A%
) 0 ! 21 ( ' "
% ! &$# "
m A m z d !w e d %
et
Do` u
Cherchons
. On a
v rie, e
ou celles de ,( 179
( pAAA ` f ii9hgf R% e
r 5 r | " !
( ` ~ hq h ( { { % x ( U i d ~ ` { r ~ { { { ow h ( ` # @ ( f R% A
, il suft de prendre o` u
r 1r
l l
e x e } x 96 8 B } F
A ( R% 5 ( ` ( % { G` t Tzx { y
Donc, et
On a a) Cherchons le nombre de subdivisions de pr` s en utilisant la m thode des trap` zes. e e e Lerreur de la m thode des trap` zes est : e e
h ( %
#
Application. Prenons alors, , do` u lint grale par la m thode des trap` zes : e e e
e r 1r ( x
exercice 38
Soit
. Par ailleurs, on v rie facilement que, e , et par cons quent de l quation (1) on obtient, e e
subdivisions de lintervalle
pour evaluer
et
180
181
Ainsi, lin quation (1) devient e , soit . Avec subdivisions, lerreur commise lors de lapproximation de cette int grale par la e m thode des trap` zes serea plus petite que e e .
donc,
o` u
, o` u telles que
, il suft de prendre
v rie, e
Cherchons . On a , et . Donc . Ainsi, lin quation (2) devient e , soit . On prendra alors puisque, dans les cas de la m thode de Simpson, le nombre de e subdivisions de lintervalle dintegration doit toujours etre pair.
h (
b) Cherchons le nombre de subdivisions de pr` s en utilisant la m thode de Simpson. e e Lerreur th orique de cette m thode est : e e
pour evaluer
3 5 y f R r r s T ! r
{ {
G% p %
G% p y
7e Be %p x x y ) ) {% { ) ~ 1r r r r p ) ! ) ~ p ! ) % ( ) ~ G y r hq )
( f R% ` G
( ~ ) % A ) r h h ( % g ( U i % { r ) ~ ) { { d ) ~ ! ) { ow r "h ( G % w # ! ) )
h ( % e
182
7.8
Nous pr sentons des mises en uvre des m thodes des Trap` zes, de Simpson e e e et de Romberg.
7.8.1
Les deux premi` res m thodes impl ment es, celle des Trap` zes et de Rome e e e e berg, n cessitent des interfaces analogues, tout en mettant en uvre des calculs e diff rents. Nous avons d crit des classes abstraites pouvant etre d riv es avec e e e e lune ou lautre m thode. Ce proc d permettra dutiliser ces classes abstraites e e e pour la m thode de Romberg qui pourra alors etre utilis e avec lune ou lautre e e m thode. e Deux approches sont mises en uvre qui d pendent de la situation pratique e dans laquelle se trouve lutilisateur : Lutilisateur dispose dune repr sentation analytique ou informatique de e la fonction dont il cherche lint grale sur un intervalle e . La classe abstarite suivante va permettre de d crire cette situation. Elle utilise la e classe FoncD2D d crite et utilis e de nombreuses fois dans les chapitres e e pr c dents : e e
abstract class IntNumFct { double a,b; FoncD2D f; IntNumFct(double b1, double b2, FoncD2D fonc) { a = b1; b = b2; f = fonc; } abstract public double calcul(int nbSub) throws NbSubException; }
Lutilisateur peut ne connatre une fonction qu` partir dun tableau de va a leurs en des points r guli` rement espac s. Dans ce cas, sil ignore la forme e e e analytique de la fonction, il ne pourra utiliser que ce tableau de valeurs qui e e xe le pas s parant chaque point d valuation de la fonction. La classe abstraite suivante va permettre de d crire cette situation. Elle utilise une e description de la fonction dans un tableau de valeurs :
abstract class IntNumTab { double pas; double[] valf; IntNumTab(double longIntervalle, double[] t) { valf = t; pas = longIntervalle/(t.length - 1); }
f 0
183
Par ailleurs, il a et remarqu dans les paragraphes suivants que le nombre e e de subdivisions devait respecter des propri t s de parit pour pouvoir utiliser la ee e m thode de Simpson. Cest pour cette raison, que nous allons utiliser un traitee ment dexception pour g rer une situation ne v riant pas la condition ad quate. e e e Nous cr ons donc la classe dexception qui suit : e
class NbSubException extends Exception { public String toString() { return ("Nombre de subdivisions impropre"); } }
7.8.2
Nous pr sentons ci-apr` s deux classes impl mentant de mani` re el mentaire e e e e e la formule des trap` zes telle que d crite dans les paragraphes pr c dents. Chacune e e e e des classes d rive dune des deux classes abstraites pr c dentes. e e e
class ITrapFct extends IntNumFct { ITrapFct(double b1, double b2, FoncD2D fonc) { super(b1,b2,fonc); } public double calcul(int nbSub) throws NbSubException { double pas = (b-a)/nbSub; double x = a; double s = f.calcul(a) + f.calcul(b); for (int i=1; i<nbSub; i++) { x += pas; s += 2*f.calcul(x); } return s*pas/2; } } class ITrapTab extends IntNumTab { ITrapTab(double longIntervalle, double[] t) { super(longIntervalle,t); } public double calcul() throws NbSubException{ int nbSub = valf.length-1;
184
7.8.3
Nous pr sentons ci-apr` s deux classes impl mentant de mani` re el mentaire e e e e e la formule de Simpson telle que d crite dans les paragraphes pr c dents. Chacune e e e des classes d rive dune des deux classes abstraites pr c dentes. Ces classes sont e e e succeptibles de lancer des exceptions si la parit du nombre de subdivisions nest e pas satisfaite.
class ISimpsonFct extends IntNumFct { ISimpsonFct(double b1, double b2, FoncD2D fonc) { super(b1,b2,fonc); } public double calcul(int nbSub) throws NbSubException { if ((nbSub % 2) != 0) throw new NbSubException(); double pas = (b-a)/nbSub; double x = a; double s = f.calcul(a) + 4*f.calcul(a+pas) + f.calcul(b); for (int i=3; i<nbSub; i++,i++) { x += 2*pas; s += 2*f.calcul(x) + 4*f.calcul(x+pas); } return s*pas/3; } } class ISimpsonTab extends IntNumTab { ISimpsonTab(double longIntervalle, double[] t) { super(longIntervalle,t); } public double calcul() throws NbSubException { int nbSub = valf.length-1; if ((nbSub % 2) != 0) throw new NbSubException(); double s = valf[0] + 4*valf[1] + valf[nbSub]; for (int i=2; i<nbSub; i++,i++) s += 2*valf[i] + 4*valf[i+1];
185
7.8.4
Nous pr sentons maintenant un programme de test des 4 classes pr c dentes e e e et qui calcule lint grale de la fonction e sur lintervalle . La valeur exacte etant egale a 1. `
class SinF implements FoncD2D { public double calcul(double x) { return Math.sin(x); } public String libelle() { return "f(x)=sin(x)"; } } class TestIntNum { public static void main(String args[]) { SinF f = new SinF(); double a=0, b=Math.PI/2; double longueur=b-a; int nbSub=4; // lecture du fichier de donnes e TableauFileIn fic = new TableauFileIn("donnees.dat"); double[] flu = fic.lectureTableau(); fic.fermer(); ITrapFct itf = new ITrapFct(a, b, f); ISimpsonFct isf = new ISimpsonFct(a, b, f); ITrapTab itt = new ITrapTab(longueur, flu); ISimpsonTab ist = new ISimpsonTab(longueur, flu);
` f GxR%
8 U6 F
186
try { System.out.println("Integration numerique de sin(x)"+ "entre 0 et Pi/2, avec "+ nbSub+"subdivisions"); System.out.println("Met. Trapezes version fct : "+ itf.calcul(nbSub)); System.out.println("Met. Trapezes version tab : "+ itt.calcul()); System.out.println("Met. Simpson version fct : "+ isf.calcul(nbSub)); System.out.println("Met. Simpson version tab : "+ ist.calcul()); } catch(NbSubException e) { System.out.println(e); } } }
Nous donnons ci-apr` s le chier dentr e utilis par les m thodes travaillant e e e e sur des tableaux. Les valeurs suivantes correspondent a une tabulation de la ` sur , avec un pas de . fonction
5 0 0.382683 0.707107 0.923880 1
Les r sultats obtenus sont les suiavnts. Ils respectent parfaitement les calculs e derreurs enonc s dans les paragraphes pr c dents. e e e
java TestIntNum Integration numerique de sin(x)entre 0 et Pi/2, avec 4subdivisions Met. Trapezes version fct : 0.9871158009727754 Met. Trapezes version tab : 0.987115900693632 Met. Simpson version fct : 1.0001345849741938 Met. Simpson version tab : 1.000134660650108
7.8.5
Nous pr sentons maintenant une classe impl mentant de mani` re r cursive e e e e la formule de calcul de la m thode de Romberg, telle quelle est d crite dans les e e paragraphes pr c dents : e e
` f GR%
8 U6 F
187
class Romberg { IntNumFct methInt; Romberg(IntNumFct mi) {methInt = mi;} public double calcul(int ordre, int nbSub) throws NbSubException { int k=ordre-1; if (ordre==1) return methInt.calcul(nbSub); else { double ddk = Math.pow(2,2*k); return (ddk*calcul(k, 2*nbSub)-calcul(k, nbSub))/(ddk-1); } } }
Le programme qui suit teste la m thode de Romberg en donnant les r sultats e e de cette formulation pour diff rentes valeurs de lordre et du nombre de sube divisions. Par ligne dafchage, lordre est constant : il commence a 1, puis a ` ` 2 et enn a 3. Sue chaque ligne, on calcule la formule pour des nombres de ` subdivisions respectivement egaux a 2, puis 4 et enn 8. `
class SinF implements FoncD2D { public double calcul(double x) { return Math.sin(x); } public String libelle() { return "f(x)=sin(x)"; } } class TestRomberg { public static void main(String args[]) { SinF f = new SinF(); double a=0, b=Math.PI/2; ITrapFct itf = new ITrapFct(a, b, f); Romberg rmb = new Romberg(itf); System.out.println("tableau des valeurs approchees"+ "de lintegrale de sin(x) entre 0 et pi/2"); System.out.println("sur la ligne k : Tk,2 Tk,4 Tk,8"); try {
188
");
java TestRomberg tableau des valeurs approcheesde lintegrale de sin(x) entre 0 et pi/2 sur la ligne k : Tk,2 Tk,4 Tk,8 0.9480594489685199 0.9871158009727754 0.9967851718861696 1.0001345849741938 1.0000082955239675 1.0000005166847064 0.9999998762272857 0.9999999980954223 0.9999999999703542
un intervalle ferm de IR et une application donn e e e IR IR, . Et soit une application diff rentiable de IR e IR. On appelle equation diff rentielle du premier ordre, la relation e (8.1)
On dit que est la solution de cette equation diff rentielle sur e si v rie la e relation (1) pour tout . On appelle probl` me de Cauchy ou probl` me de condition initiale l quation e e e diff rentielle a laquelle on adjoint la condition initiale e ` o` u est un nombre donn e : e (8.2)
Remarque 10 1. Si est une fonction du temps, il est dusage de noter la par et de lappeler vitesse. De m me la d riv e seconde e e e d riv e e e sera not e et appel e acc leration. e e e 2. Si on consid` re une equation diff rentielle dordre sup rieure e e e
on peut ramener le probl` me a celui dun syst` me d quations diff rentielles e ` e e e et on obtient le du premier ordre, en posant 189
f 0
x H
Sha
r ! x f f ! f f
f f x f
u f
r r r A g7 f r
t7f tf
r
hr a
r f 0 c
"
f 0
190
(8.3)
. . .
= =
Revenons au probl` me de Cauchy (2), un r sultat fondamental est donn par le e e e th or` me ci-dessous, mais rappelons tout dabord la d nition dune application e e e lipschitzienne. D nition 4 Soit f une application d nie sur e e IR ; sil existe une constante ind pendante de e et telle que IR, et , alors est dite Lipschitzienne de rapport L sur IR (ou simplement L-lipschitzienne). IR continue et LTh or` me 9 Si f est une application d nie sur e e e lipschitzienne par rapport a , alors le probl` me de cauchy (2) admet une solution e ` unique sur [a,b] et ceci pour toute condition initiale , ( IR). Proposition 4 Une condition sufsante pour que les hypoth` ses du th or` me e e e soient v ri es est que soit d rivable par rapport a et que sa d riv e soit e e e e e ` born e. ( dem en exercice ...) e (Le th or` me est en g n ral faux sans la condition de Lipschitz.) e e e e
8.2
La M thode dEuler e
r r
Soit a int grer num riquement le probl` me de Cauchy (2), et soit ` e e e la valeur exacte de la solution de ce probl` me a labscisse . Une m thode danalyse e ` e num rique pour int grer cette equation diff rentielle consistera a fournir des ape e e ` proximations de pour , entier donn . e
i f 0 r f V { S { { f
e e c k f 0
i f f
5 x 1r x
r {
f f
x
posons
et
r f f f x f
= =
5
= = . . .
x f
r
x
syst` me : e
x r
f 0
x c
191
Les diff rentes m thodes dint gration se distinguent par la mani` re dobtenir e e e e ces . La m thode dEuler, est la plus simple et consiste a substituer la d riv e e ` e e par lexpression (8.4)
o` u est le pas dint gration num rique. e e Consid rons alors une subdivision de e en N sous intervalles de longueur , et , avec et . Lexpression (4) entraine do` u . Par cons quent, partant de la condition intiale e , et prenant un pas r gulier e , on obtient, en posant approximation de : (8.5)
Interpr tation g om` trique e e e approximation de est calcul e a partir e ` de calcul s pr c demment gr ce a la formule de r ccurence (5) et a la e e e a ` e ` condition initiale . On calcule une approximation de la solution en tout point en remplacant dans la courbe int grale e passant par par sa tangente en .
Solution Euler
t0
t1
t2
Remarque 11 On dit que la m thode dEuler est une m thode a pas s par s ou e e e e ` ne fait intervenir que . a un pas, parceque le calcul de `
r f n x r e er r r r f r e r r Rf Q r r r n s x r r f f 0
t3
t4
t5
Figure 11
f f
r r y x r r r f n x e h f x x r e e e r r d Rs f f % r
donn e
r x
r h r f
192
8.2.1
IR ).
o` u
2. Pour que
il suft que
IR .
On donne dans la suite des m thodes dordre plus elev que celui de la m thode e e e dEuler, donc plus rapides et plus pr cises. e
8.3
la courbe solution de l quation e Lid e consiste a remplacer sur e ` diff rentielle non plus par une droite mais par une parabole. En effet e
et en n gligeant les termes dordre sup rieur, on obtient alors lalgorithme de Taye e lor dordre deux : , (
Cependant cette m thode pr sente un inconvenient certain qui r side dans le calcul e e e de qui peut etre difcile ; pour eviter ce probl` me on utilise souvent la e m thode de Runge-Kutta-2 donn e plus bas. e e
f f %
donn , e
Remarque 12 1. Ce r sultat sexprime sous la forme e que la m thode dEuler est dordre 1. e
, cest a dire `
).
Th or` me 10 Supposons que lapplication e e deux variables, et lipschitzienne par rapport a ` que . On pose
soit continue par rapport aux uniform ment par rapport a , et e ` , alors on a la majoration
I b { {
par
r Rf
r f ` ( h { I { ~ ! x { r { U i GP ~ r t7f i f 0 x c x r r f
r w r e f e x B Bg Q h f r x r Q
r r r r Rf t7f
{ x { b
f c
c Pb
r I q Q
f c
r x q Q B B
193
Th or` me 11 Supposons que e e IR , -lipschitzienne et -lipschitzienne par rapport a uniform ment par rapport a . Poe ` ` sons , alors on a la majoration
o` u
8.4
8.4.1
M thodes de Runge-Kutta e
Runge-Kutta dordre 2 : RK2
On reprend lalgorithme de Taylor dordre 2 en remarquant qu` des termes a en pr` s on a gr ce a un developpement de Taylor : e a `
do` u
o` u
et
8.4.2
Dans la pratique on utilise la m thode plus performante de Runge-Kutta e dordre 4 (RK4), pour des fonctions sufsamment r guli` res on a alors e e : , ,
et
8.5
Les m thodes a un pas, aussi appel es m thodes a pas s par s, sont toutes de e ` e e ` e e la forme :
o` u
I { {
r ) f x f r ) ` ` x
r a r r ! # u f f
R f f %
r r r a ` 7 f f f n x
r r x( f f Rs f f % x a
r e f 3 ( h h I { I { ~ ! !
i r f t7f c
g { r { U i GPQ ! " x x x
r f r x a wf x )
r I q Q
~ B E
194
o` est une application continue de u IR dans IR ; ( est le rayon de stabilit de la m thode, souvent on prendra ici e e ). Les notions th oriques que doit v rier la fonction an que soit effectivee e ment une approximation de sont la consistance, la stabilit th orique et la e e convergence. D nition 6 Une m thode a un pas est consistante avec l quation diff rentielle e e e e ` si pour toute solution continue
Th or` me 12 Une condition n c ssaire et sufsante pour quune m thode a un e e e e e ` pas soit consistante est que pour tout et tout IR . D nition 7 Stabilit th orique : e e e ) les solutions r spectives de e Soient et (
= IR
donn e
et de
= IR
donn e
Th or` me 13 Si v rie une condition de Lipshitz par rapport a la seconde e e e ` variable pour sufsamment petit, alors la m thode a un pas est stable. e ` D nition 8 On dit quune m thode a un pas est convergente si : e e ` IR
Th or` me 14 Si une m thode a un pas est stable et consistante alors elle est e e e ` convergente.
On dit que la m thode a pas s par s est stable sil existe deux constantes e e e ` ind pendantes de telles que : e
r r f xf f %
e v d6 UU r r r r % { B f y x ( { GP f
e e { { GP { { x n{ I { ow d
e e H f R% c
e v r d U9 d6 % s { { ow
e 4 I r I x c I f f e c r f 7f x I RQ f f %
r f c
i f 0
e c
et
195
8.6
Lapplication de lalgorithme dEuler a ce syst` me se fait composante par compo` e sante do` : u
Cet algorithme sapplique aux equations diff rentielles dordre 2 (ou plus ...) a e ` condition de les r duire au pr alable a des syst` mes diff rentiels du premier ordre, e e ` e e comme vu pr c demment. e e Lapplication dautres algorithmes par exemple RK2 se fait moins simplement, voir exercices corrig s. e
I r I I f 7f r f f
x I x
196
8.7
Exercice 70 : Soit l quation diff rentielle a condition initiale e e ` et . Approcher la solution de cette equation en a laide de la m thode dEuler ` e en subdivisant lintervalle de travail en 10 parties egales. Comparer a la solution ` exacte. Exercice 71 : 1. Soit une suite de nombres r els positifs telle que e et sont des constantes positives ; montrer que 2. Montrer que et ,
IR ,
3. Utiliser les deux questions pr c dentes pour d montrer le th or` me 10 du e e e e e cours. 4. De m me pour le th or` me 11. e e e
Comparer a la solution exacte. ` Exercice 73 : En donnant les solutions de l quation diff rentielle ci-dessous avec la condition e e initiale puis , r el non nul, v rier quelle conduit a des e e ` sch mas instables. e
2. Appliquer la m thode dEuler a ce probl` me, avec e ` e solution en . Comparer a la solution exacte. `
r ` x A %
Exercice 72 : Approcher la solution de l quation diff rentielle ci-dessous en e e sant RK2, avec un pas
en utili-
, puis evaluer la
( g x u e c x x
r r
A % R
r hP
( r f R% c
r 3G5 r G5 A ' (
r
r r
`R A %
jG%
q i
c 5 A % s
2%
197
Exercice 76 : Ecrire lequation diff rentielle mod lisant le mouvement du pendule simple. Ape e pliquer la m thode dEuler puis celle de Taylor dordre 2. e Exercice 77 : Soit l quation diff rentielle du second ordre a conditions initiales : e e `
et
1. Ecrire cette equation diff rentielle sous la forme dun syst` me diff rentiel e e e de deux equations diff rentielles dordre un. e 2. Appliquer la m thode de RK2 a ce syst` me . e ` e Exercice 78 : On consid` re le probl` me diff rentiel e e e = =
et
et
par
avec
et
0 | 7f f g r f f e x
= =
Q H x 7f
` o x
On divise
et
. Donner
r n r r r f 0 c f u 7B f
( r ` r s'r h r h f 0 c os o` `
2. Appliquer la m thode dEuler a ce probl` me, avec e ` e solution en . Comparer a la solution exacte. `
A % R
( r f R% c
, puis evaluer la par
r h
G`
u
A % s
( y
r ` x x q f 0
198
o` et sont continues sur u et pour tout . (Ces hypoth` ses e assurent lexistence et lunicit de la solution.) e 1. Montrer que si est quatre fois continument d rivable dans e alors
avec . 2. On subdivise en N+1 intervalles de longueur et on pose , , on appelle une approximation de et on remplace par dans (1). Ecrire le syst` me e d quations lin aires ainsi obtenu. On appelle A la matrice de ce syst` me. e e e 3. Montrer que o` est une matrice tridiagonale et u une matrice diagonale, donner et . Exercice 81 : Soit l quation diff rentielle du second ordre a conditions initiales : e e ` , et
x ` x ( x T f f % | x h f 0 V 7f @ c ( ` ! ) o ` ( f 0
f c 0
f c
( ` sh 5 H ` u
y(a) =
et
y(b)=
i r f c wtf
f c 0
% y 1
f '7f
f f
f 0
( y
( y
, et sont des r els de e ). 1. Pour quelles valeurs du triplet ( ) retrouve t-on la m thode dEuler ?. e M me question pour la m thode RK2 ?. e e 2. On suppose dans la suite de lexercice que IR et Llipschitzienne en y : (a) Pour quelles valeurs la m thode propos e est stable ? e e (b) Quelle relation doit satisfaire ( ) pour que la m thode soit consise tante ? (c) Quon conclure pour la convergence ?
r t7f
est continue de
r r Rf r xf f f n
i f 0 7f
199
1. Ecrire cette equation diff rentielle sous la forme dun syst` me diff rentiel e e e de deux equations diff rentielles dordre un. e 2. Appliquer la m thodede RK2 a ce syst` me . e ` e 3. Appliquer la m thodede de Taylor dordre 2 a ce syst` me . e ` e
200
8.8
Exercice 82 : Soit une application de IR dans IR o` u IR, , et soit IR . 1. Donner le th or` me assurant lexistence et lunicit de la solution du e e e probl` me de Cauchy : e , , donn dans IR e
2. Donner une condition n c ssaire et sufsante sur pour quelle soit lipe e schitzienne en uniform ment par rapport a e ` 3. Quels sont parmi les probl` mes ci dessous, ceux qui admettent une solution e unique :
1. Donner la solution g n rale de ce probl` me. e e e , puis donner la 2. Appliquer la m thode dEuler a ce probl` me avec e ` e solution num rique en e ,a ` pr` s. e 3. Donner lerreur th orique de la m hode dEuler dans ce cas et la comparer e e a lerreur effectivement commise. Commentaires ? ` Exercice 85 : Soit le probl` me de Cauchy suivant : e ,
`R A %
A % R
( r f R% c
1. Trouver la solution exacte de ce probl` me. e 2. Appliquer la m thode dEuler a ce probl` me, avec e ` e solution en . Comparer a la solution exacte. `
G`
( r f % c
( ( r r f R% c f
x Gr % j
, puis evaluer la
( r f R% c
% sr % t
f 0 c
hr r r u f
sf
( %
r c
( r %
p Rs A %
r %
#" #"! r x
f % s
201
3. Donner lerreur th orique de la m hode deuler dans chacun de ces cas et la e e comparer a lerreur effectivement commise. Commentaires. ` Exercice 86 : Soit le probl` me de Cauchy suivant : e
1. Montrer que est lipshitzienne par rapport a ` port a , et donner une constante de Lipshitz. ` 3. Donner la solution exacte de (1), ainsi que
2. Montrer que ce probl` me admet une solution unique. e 4. Appliquer la m thode dEuler a ce probl` me, ecrire lalgorithme correse ` e pondant et donner lapproximation de y(0.2) obtenue a laide dun pas de ` discr tisation num rique e e . 5. Rappeler lerreur th orique de la m thode dEuler et la comparer a lerreur e e ` commise sur le calcul de ; commentaires ? .
, et
).
1. Pour quelles valeurs du triplet ( ) retrouve t-on la m thode dEuler ?. e M me question pour la m thode RK2 ?. e e 2. On suppose dans la suite de lexercice que lipschitzienne en y : IR et L-
f '7f
7 f 0
Exercice 87 : Pour r soudre l quation diff rentielle : e e e , o` est continue de u dans IR, on propose la m thode a un pas suivante : e `
i r f c wtf
( r f R% c
A `R%
r Rf ( r % ( r r ` t7f H
r Rf
A % Rs
A G`R%
f f
(b)
1r r x
,a ` ,a `
( % ( %
p R A % r p R A %
A % ` A %
pr` s. e pr` s. e
IR
202
o` est deux fois contin ment d rivable dans u u e IR, on suppose que est born e. On approche num riquement la solution de (1) par le sch ma a un pas : e e e ` = =
donn dans IR e
et
IR
Soit donc a approcher les solutions de (1) par la m hode (2), avec ` e o` u
et
et
et
1. Ecrire cette equation diff rentielle sous la forme dun syst` me diff rentiel e e e de deux equations dordre un.
$ %
r f7f g e $ V r f c x% Rf ! A B BB x ! %
5 5 5 5 r r r ` f ` g x f f f BRf x
f xR%
( ( r G% ( r r % r f % c j H `
e f R%
f xR%
r r %f tf Gx7f
e r
x
f %
o` u
est une application de IR dans IR ( est un r el positif e ), et . On donne le th or` me suivant qui pourra etre utilis sans d monstration : e e e e Th or` me : si est deux fois continument d rivable dans e e e IR et si existent et sont continues dans IR alors le sch ma (2) est dordre e 2 si et seulement si
( A If RQ AAA f %
f x%
r f f
e f R%
r f xR% c
f xR%
e x
( er
203
2. On applique la m thode dEuler a ce syst` me, ecrire lalgorithme correse ` e pondant. M me question pour la m thode de RK2. ( on notera le pas e e num rique). e 3. Donner la solution exacte de (1), ainsi que et pour . Comparer ces deux r sultats a ceux num riquement obtenus gr ce au sch ma e ` e a e dEuler de la question pr c dente en prenant e e . Exercice 90 : Soit l quation diff rentielle du second ordre a conditions initiales : e e ` , et
1. Ecrire cette equation diff rentielle sous la forme dun syst` me diff rentiel e e e de deux equations diff rentielles dordre un. e 2. On applique la m thodede dEuler a ce syst` me, drire lalgorithme core ` e e respondant. M me question pour la m thode de RK2. (on notera h le pas e e num ique). e et pour . Com3. Donner la solution exacte de (1), ainsi que parer ces deux r sultats a ceux num riquement obtenus gr ce au sch ma e ` e a e . dEuler de la question pr c dente en prenant e e Exercice 91 : Soit l quation diff rentielle du second ordre a conditions initiales : e e `
et
1. Ecrire cette equation diff rentielle sous la forme dun syst` me diff rentiel e e e de deux equations dordre un. 2. On applique la m thode dEuler a ce syst` me, ecrire lalgorithme correse ` e pondant. M me question pour la m thode de RK2, ( on notera le pas e e num rique). e et pour . Com3. Donner la solution exacte de (1), ainsi que parer ces deux r sultats a ceux num riquement obtenus gr ce au sch ma e ` e a e dEuler de la question pr c dente en prenant e e . Exercice 92 : Soit l quation diff rentielle du second ordre a conditions initiales : e e `
et
` A %
` A %
`Rs A %
( r f R% c
( 5 r wG% ( r % r r f % c j H `
( r ( % r r` r % f R% c p `
( A % Rs r r
( A % Rs r r
( A % Rs r r
( ` r % r 4 % 5 r `
204
1. Ecrire cette equation diff rentielle sous la forme dun syst` me diff rentiel e e e de deux equations dordre un. 2. On applique la m thode dEuler a ce syst` me, ecrire lalgorithme correse ` e pondant. M me question pour la m thode de RK2, ( on notera le pas e e num rique). e 3. Question Facultative : Donner la solution exacte de (1), ainsi que et pour . Comparer ces deux r sultats a ceux num riquement e ` e obtenus gr ce au sch ma dEuler de la question pr c dente en prenant a e e e .
1. Donner le th or` me assurant lexistence et lunicit de la solution du e e e probl` me de Cauchy : e , , donn dans IR e
3. Quels sont parmi les probl` mes ci dessous, ceux qui admettent une solution e unique :
Exercice 94 : Soit l quation diff rentielle du second ordre a conditions initiales : e e ` y(x) +2y(x) =2y(x), y(0) = 1 et
1. Ecrire cette equation diff rentielle sous la forme dun syst` me diff rentiel e e e de deux equations diff rentielles dordre un. e 2. Appliquer la m thodede RK2 a ce syst` me . e ` e Exercice 95 : Soit l quation diff rentielle du troisi` me ordre et a conditions initiales : e e e ` et
%
( f c R%
G`
%
( r f R% c
% sr % t
2. Donner une condition n c ssaire et sufsante sur e e schitzienne en uniform ment par rapport a e `
hr r r u f
IR dans IR o` u
IR,
, et soit
f 0
sf
r c
#" #"! r x
IR .
`R% A
( A R% r
205
1. Ecrire cette equation diff rentielle sous la forme dun syst` me diff rentiel e e e de trois equations diff rentielles chacune dordre un. e 2. On applique la m thode dEuler a ce syst` me, ecrire lalgorithme correse ` e pondant. (On notera le pas dint gration.) e Exercice 96 : Soit le probl` me de Cauchy suivant : e
1. Montrer que est lipshitzienne par rapport a ` port a , et donner une constante de Lipshitz. ` 3. Donner la solution exacte de (1), ainsi que
2. Montrer que ce probl` me admet une solution unique. e 4. Appliquer la m thode dEuler a ce probl` me, ecrire lalgorithme correse ` e ` pondant et donner lapproximation de y(0.2) obtenue a laide dun pas de discr tisation num rique e e . 5. Rappeler lerreur th orique de la m thode dEuler et la comparer a lerreur e e ` . Commentaires ? commise sur le calcul de Exercice 97 : On consid` re la m thode a pas s par s suivante (*) : e e ` e e
1. Etudier la consistance, la stabilit th orique, la convergence. e e 2. On veut calculer une valeur approch e de e . Montrer que ce probl` me peut etre remplac par la r solution dun probl` me e e e e de Cauchy dont on pr cisera la condition initiale, on posera e Comment peut-on obtenir une valeur approch e de . ? e Si on utilise la m thode (*) pour calculer , donner lexpression de , exe primer lerreur en fonction de .
&
&
r x r r ` 7 f 7f 7f x
( r f R% c
r r
&
A `R%
r Rf ( ( r r r 96 r % 8 Rf q F
&
A % Rs
A G`R%
&
r r
206
8.9
exercice 39
Lintervalle dint gration est e . Remarquons tout dabord que etant continue et lipshitzienne par rapport a ` le probl` me de Cauchy e admet une solution unique (th or` me 9 de Cauchye e Lipshitz). M thode dEuler Elle s crit : e e
Cest a dire que lapproximation en ` de , est . Solution exacte de cette equation Appliquons la m thode de la variation de e la constante. ` 1ere etape : equation sans second membre.
est une solution evidente. Les autres solutions sont donn es par e . Do` u avec . nde 2 etape : une solution particuli` re On applique la m thode de la variae e tion de la constante do` u que lon reporte dans : ainsi, . en int grant par parties on trouve e
mAR%
A%
1r b b
G` ) c 0Pb r r n r
1 2
( 12 r 1r
AR% 3
r (
s AR% s
1r
p R% A p e e x
b r 1r ( k b r b b b b d
3G5 `5 A A% 5
et
( p A 5 ( p 5 ( A 'A (% ( ' % e e x r
( ( Rf r r r r 4 ( r r f % A % Rs
( ( f % Gr % Y
207
donn par e
dans
Ainsi, la solution exacte de est . Estimation de lerreur. La solution exacte ci-dessus donne . Ainsi, lerreur effectivement commise lors de lapplication de la m thode dEuler est e . Cherchons lerreur th orique qui est donn e par : e e
De m me, on a e
Clairement, , donc la m thode dEuler donne une bonne ape proximation de la solution de ce probl` me de Cauchy en e .
( % ( 5 3 p A % Rs ( e ( ` ( x % ` ! x x
w{ {
{ {
9 { @ {
Ainsi
. Donc,
par rapport
(
33 s `R { p ( A 5 GG5 Ap 5 { { @ { 9 A % (
` r ( r ( ` r (
r
x r ~ { { U GP ` ( h ~ !
% 2 r 1
7 8e 2 1
{ u { { f r tf r {
% q
w
donc,
, on d termine , do` e u
6 1 %2
( 4 5 ( (
r h
% ~ ` s 33 GG5 5 Ap `
208
exercice 42
e Remarquons tout dabord que etant continue et lipshitzienne par rapport a ` ce probl` me de Cauchy admet une solution unique (th or` me 9 de Cauchye e e Lipshitz). Lintervalle dint gration est e et le pas dint gration est e . M thode de RK2 Elle s crit : e e
soit
, avec
et
. Donc
Ce qui est une equation diff rentielle lin aire du 1 ordre. On lint` gre par e e e la m thode de la variation de la constante comme a lexercice pr c dent. e ` e e L quation sans second membre est e de solution ou . Une solution particuli` re par la variation de la constante. On a e
avec
. Do` , dans u
ce qui implique
P b
1r p
% P
A B9
r ` G` x 5 D` C
` H (
on a
do` u
` Hh x
33 GG3 ( ( A ~ x ~ ` ( 33 GG3 ( ( ( mA R% A
% W
` s
` Hh
fr
uQ
G`
. Ainsi, lapproximation en
de
, est
( f A G`A h`R%
`s A %
~ x ~ ` f B x
`RR% A %f
r r r t7f Q x x ( S
) Ec
. On pose
209
par parties :
G Hr 1 2 1 I ` (
. La solution g n rale est donc e e comme , . Finalement, . Ainsi, . Comme alors . Estimation de lerreur. La solution exacte est . Donc lerreur commise est . On peut comparer cette erreur effective a lerreur th orique sur RK2, donn e ` e e par : (le th or` me du cours) e e
exercice 43
Soit le probl` me de Cauchy suivant e
P Rf r r q r ` S U r Y c
Remarquons tout dabord que etant continue et lipshitzienne par rapport a ` le probl` me de Cauchy e admet une solution unique (th or` me 9 de Cauchye e Lipshitz). M thode dEuler. Elle s crit : e e
P aS W
W S
de
avec le pas
P W p ` aS aS W
W GYW` aS ` aS
r P aS W
W `P 'a GWaS S P
S(S W P
On a aussi Donc
et , do` le tableau, u
, est
4 P r ` r ` r f
e aS x ' W Q U S
e P W ` p aS x
`Y W X S U 1
avec
S B
` t r R r 1 G P `
Q r P ` 1r ` 1r ` F ( 0p
) Ec
P P
210
Solution exacte de cette equation. En appliquant la m thode de la variation e de la constante, comme au premier exercice, on trouve la solution g n rale, e e . Estimation de lerreur. La solution exacte ci-dessus donne . Ainsi, lerreur effectivement commise lors de lapplication de la m thode e dEuler est . Cherchons lerreur th orique e qui est donn e par : e
Clairement, , donc la m thode dEuler donne une bonne ape proximation de la solution de ce probl` me de Cauchy en e .
exercice 44
, puis
En appliquant la m thode de la variation de la constante, comme au premier e exercice, on trouve la solution g n rale, e e o` u est la constante dint gration. e 2. Si , alors
1
Conclusion : En comparant et , on voit que la diff rence e . M me si est tr` s petit, cet ecart tend vers e e , les deux solutions divergent lune de lautre. Ce probl` me est donc tr` s sensible aux Conditions Inie e tiales.
x y
r {
r w
r w
1. Si
, alors
1 v
r
W S
W p ` P s (SaS
1 v
S P
P
t u
X
r s
r ` YX
r
p qe P aS W s e qe d p x
S r U Y c
w{ {
{ {
9 { @ {
S P k B S B
Ainsi
. Donc,
`` W W S S jX aB
` ~
'
P (aS SW
X h
f d gh e
P W 9 { p aS G a#S{ { @ { `` W
cc
x r ~ { c c { U GP
X i
r r ` H `
par rapport
{ r w
c c
o`
`
cc
c
.
r f 0 c
r `
c h e P r r h Y c ` c c
6 S
B I 6 qF D FGIC 4 P 6 I Q qF 4
I I 4
I x x
l 1
r W r f f
r f
f
, soit
qF I
7 I I f f f 7f
r r
r
r f f r f f
exercice 45
Ecrivons sous la forme de deux equations diff rentielles dordre 1 chacune. e , do` u . Ainsi, on obtient le syst` me : e Pour cela on pose
` r f
I I x x r f qF f I I x x R gF
r f Q f
qF Rc
c c e
r
qF
r c c
1. Appliquons Euler :
c
P
avec
Avec
et
Avec
exercice 48
1. On pose
On obtient donc,
donn s. e
do` u
f `qu `
G`
et
I i
I `H ` I i 7
` l P f
`
S
r f
~ x x ~ ~ x
avec :
r f
~ x ~ ` I I I` l i
I ` ` ` l P ` l P `
S X
6 4 x
f g d 6 g d f 4
r 7f f
f ) C `
S P
` l l P i
.
G`
i i
`S i
r f
e ` s I x x I l I i l i x x Y
c
6 4 l i c
`P f l
et
r f
tc
h
r f 0 c
ou
avec
et
r
. Appliqu e a e `
elle s crit : e
. Calculons 212
r f
`
S
I PQ P ` X 1 ` I P P 1
I x x
Par cons quent e
P P I X ` P P ` ` I ` 7 H
I x x
Donc
I I G`H ` 1 p ` ` l P I I ` ` ~ x ~ `
I o` ` l I i i x I l x i i
i i i i
~
:
Calculons
Ainsi, 213
214
8.10
On pr sente dans la suite une mise en uvre des m thodes de r solution e e e num rique des equations diff rentielles, puis des syst` mes diff rentiels. On utie e e e lise dans les deux cas, les m thodes dEuler et de Runge-Kutta dordre 2 et 4. e
8.10.1
Nous d composons nos programmes en plusieurs classes : e une classe abstraite de description de l quation diff rentielle. Elle permet e e d tre utilis e dune mani` re g n rique dans les m thodes et programmes e e e e e e de traitement ; une classe abstraite d crivant un processus dit ration de r solution qui e e e pourra etre utilis e dans des classes g n rique de traitement. Elle est d riv e e e e e e en trois classes de processus, la m thode dEuler et les m thodes de Rungee e Kutta dodre 2 et 4 ; une classe de traitement g n rique qui d crit un processus it ratif de calcul e e e e de solution et une repr sentation graphique associ e, ceci ind pendamment e e e de l quation diff rentielle et du processus utilis s ; e e e et nalement, une classe d crivant une equation diff rentielle particuli` re e e e et la classe contenant le programme principal qui met en uvre le traitement g n rique pr c dent auquel on transmettra une instance de la classe e e e e particuli` re construite et le processus choisis. e Une classe abstraite de description de l quation e La classe abstraite suivante fait r f rence a une equation diff rentielle qui doit ee ` e etre d crite dans la m thode calcul. e e
abstract class FoncEDO{ public double t0; public double y0; public double pas; public int nbpas; FoncEDO(double pt0, double py0, double ppas, int pnbpas) { t0=pt0; y0=py0; pas=ppas; nbpas=pnbpas; } abstract public double calcul (double t, double x); abstract public String libelle();
215
Des classes de description des m thodes e Nous d crivons ici une classe abstraite faisant r f rence a un processus e ee ` de r solution num rique d quation diff rentielle qui doit etre d crite dans la e e e e e m thode iter. e
abstract class IterEDO { FoncEDO f; double h; double yCourant; double tCourant; IterEDO(FoncEDO fonc, double pas, double y0, double t0) { f=fonc; h=pas; yCourant=y0; tCourant=t0; } public void set_yCourant (double y0) { yCourant=y0; } public void set_tCourant (double t0) { tCourant=t0; } abstract public double iter(); public double iter (double t, double y) { set_tCourant(t); set_yCourant(y); return iter(); } }
La classe suivante d rive de la pr c dente et d crit le processus de r solution e e e e e bas sur la m thode dEuler. e e
class IterEuler extends IterEDO { IterEuler (FoncEDO fonc, double pas, double y0, double t0) { super(fonc, pas, y0, t0); } public double iter() { yCourant = yCourant + h*f.calcul(tCourant, yCourant); tCourant += h; return yCourant;
216
class IterRK2 extends IterEDO { IterRK2 (FoncEDO fonc, double pas, double y0, double t0) { super(fonc, pas, y0, t0); } public double iter() { double k1 = f.calcul(tCourant, yCourant); tCourant += h; double k2 = f.calcul(tCourant, yCourant + h * k1); yCourant = yCourant + h * ( k1 + k2 )/2; return yCourant; } }
class IterRK4 extends IterEDO { IterRK4 (FoncEDO fonc, double pas, double y0, double t0) { super(fonc, pas, y0, t0); } public double iter() { double k1 = f.calcul(tCourant, yCourant); tCourant += 0.5*h; double k2 = f.calcul(tCourant, yCourant + 0.5*h * k1); double k3 = f.calcul(tCourant, yCourant + 0.5*h * k2); tCourant += 0.5*h; double k4 = f.calcul(tCourant, yCourant + h * k3); yCourant = yCourant + h * (k1 + 2*k2 + 2*k3 + k4)/6; return yCourant; } }
217
Nous d crivons maintenant un processus g n rique qui effectue un certain e e e nombre dit rations a partir dun processus de r solution arbitraire - de type e ` e IterEDO. Une repr sentation graphique est r alis e. Cette derni` re utilise la e e e e m thode CanvasGraphe d nies dans les chapitres pr c dents. e e e e
import import import import java.lang.*; java.io.*; java.util.*; java.awt.*;
class TraitFEDO { TraitFEDO(FoncEDO fedo, IterEDO methode) { double t0=fedo.t0, y0=fedo.y0, pas=fedo.pas; int nbpas=fedo.nbpas; double[] tc = new double[nbpas]; double[] yc = new double[nbpas]; tc[0]=t0; yc[0]=y0; for (int i=1; i<nbpas; i++) { tc[i] = tc[i-1]+pas; yc[i] = methode.iter(); } // calcul des extrema du tableau yc : MaxminTabDouble myc = new MaxminTabDouble(yc); double maxyc = myc.getmaxi(); double minyc = myc.getmini();
// representation graphique du calcul : DomaineDouble dr = new DomaineDouble(tc[0], minyc, tc[nbpas-1], maxy DomaineInt de = new DomaineInt(0, 0, 600, 450); CanvasGraphe cg = new CanvasGraphe(dr, de, tc, yc); FenetreGraphe x = new FenetreGraphe(de, cg, fedo.libelle()); x.show(); } }
Exemple dutilisation Nous d crivons maintenant une utilisation des classes pr c dentes. Nous e e e d nissons l quation diff rentielle a r soudre dans la classe FEDO et nous cr ons e e e ` e e
218
une instance du traitement g n rique pr c dent auquel nous transmettons des inse e e e tances de la classe FEDO et dun processus de r solution. e L quation diff rentielle r solue ici est : e e e
W aS S B r s R ` qF
class FEDO extends FoncEDO { FEDO (double pt0, double py0, double ppas, int pnbpas) { super(pt0, py0, ppas, pnbpas); } public double calcul(double t, double y) { return Math.sin(2*t-y); } public String libelle() {return "dy/dt = sin(2t-y)"; } } class PrgEdo{ public static void main(String args[]) { double t0=0, y0=0.5, pas=0.1; int nbpas=100; FEDO f = new FEDO(t0, y0, pas, nbpas); IterEDO methode = new IterRK4(f, pas, y0, t0); TraitFEDO work = new TraitFEDO(f, methode); } }
8.10.2
Nous suivons la m me construction pour ecrire un ensemble de classes de e r solution num rique de syst` mes diff rentiels. e e e e Une classe abstraite de description du syst` me e La classe abstraite suivante fait r f rence a un syst` me qui sera d crit dans la ee ` e e m thode calcul. e
219
abstract class SysEDO { public int dim; public double t0; public double[] y0; public double pas; public int nbpas; public int ixGraph; public int iyGraph; SysEDO(int pdim, double pt0, double[] py0, double ppas, int pnbpas, int pixGraph, int piyGraph) { dim=pdim; t0=pt0; y0=py0; pas=ppas; nbpas=pnbpas; ixGraph=pixGraph; iyGraph=piyGraph; } abstract public double[] calcul (double t, double[] x); abstract public String libelle(); }
220
La classe suivante est une construction abstraite qui fait r f rence a un ee ` processus it ratif de r solution de syst` me d crit par la m thode iter. e e e e e
abstract class IterSysEDO { SysEDO f; double h; public double[] yCourant; public double tCourant; int dim; IterSysEDO(SysEDO fonc, double pas, double[] y0, double t0) { f=fonc; h=pas; yCourant=y0; tCourant=t0; dim=y0.length; } public void set_yCourant (double[] y0) { yCourant=y0; } public void set_tCourant (double t0) { tCourant=t0; } abstract public double[] iter(); public double[] iter (double t, double[] y) { set_tCourant(t); set_yCourant(y); return iter(); } }
On construit une classe qui en d rive et qui d crit la m thode dEuler pour un e e e syst` me. e
class IterSysEuler extends IterSysEDO { IterSysEuler (SysEDO fonc, double pas, double[] y0, double t0) { super(fonc, pas, y0, t0); } public double[] iter() { int i; double[] yNew = new double[dim]; for (i=0; i<dim; i++) yNew[i] = yCourant[i] + h*(f.calcul(tCourant, yCourant))[i]; for (i=0; i<dim; i++) { yCourant[i] = yNew[i];
221
La classe suivante impl mente la m thode de Runge-Kutta dordre 2 pour un e e syst` me. e
class IterSysRK2 extends IterSysEDO { IterSysRK2 (SysEDO fonc, double pas, double[] y0, double t0) { super(fonc, pas, y0, t0); } public double[] iter() { int i; double[] k1 = new double[dim]; double[] k2 = new double[dim]; double[] yNew = new double[dim]; for (i=0; i<dim; i++) { k1[i] = (f.calcul(tCourant, yCourant))[i]; yNew[i] = yCourant[i] + h*k1[i]; } for (i=0; i<dim; i++) k2[i] = (f.calcul(tCourant+h, yNew))[i]; for (i=0; i<dim; i++) yNew[i] = yCourant[i]+0.5*h*(k1[i]+k2[i]); for (i=0; i<dim; i++) yCourant[i] = yNew[i]; tCourant += h; return yNew; } }
La classe suivante impl mente la m thode de Runge-Kutta dordre 4 pour un e e syst` me. e
class IterSysRK4 extends IterSysEDO {
222
IterSysRK4 (SysEDO fonc, double pas, double[] y0, double t0) { super(fonc, pas, y0, t0); } public double[] iter() { int i; double[] k1 = new double[dim]; double[] k2 = new double[dim]; double[] k3 = new double[dim]; double[] k4 = new double[dim]; double[] yNew = new double[dim]; for (i=0; i<dim; i++) { k1[i] = (f.calcul(tCourant, yCourant))[i]; yNew[i] = yCourant[i] + 0.5*h*k1[i]; } for (i=0; i<dim; i++) { k2[i] = (f.calcul(tCourant+0.5*h, yNew))[i]; yNew[i] = yCourant[i] + 0.5*h*k2[i]; } for (i=0; i<dim; i++) { k3[i] = (f.calcul(tCourant+0.5*h, yNew))[i]; yNew[i] = yCourant[i] + h*k3[i]; } for (i=0; i<dim; i++) k4[i] = (f.calcul(tCourant+h, yNew))[i]; for (i=0; i<dim; i++) yNew[i] = yCourant[i]+h/6*(k1[i]+2*k2[i]+2*k3[i]+k4[i]); for (i=0; i<dim; i++) yCourant[i] = yNew[i]; tCourant += h; return yNew; } }
Traitement g n rique e e On adapte le traitement g n rique pr c dent au cas dun syst` me diff rentiel. e e e e e e
223
class TraitSEDO { TraitSEDO(SysEDO fedo, IterSysEDO methode) { int dim=fedo.dim; double t0=fedo.t0; double[] y0=fedo.y0; double pas=fedo.pas; int nbpas=fedo.nbpas; int ixGraph=fedo.ixGraph; int iyGraph=fedo.iyGraph; int i; double[] tc = new double[nbpas]; double[][] yc = new double[nbpas][dim]; tc[0]=t0; for (i=0; i<dim; i++) yc[0][i]=y0[i]; for (i=1; i<nbpas; i++) { tc[i] = tc[i-1]+pas; yc[i] = methode.iter(); } double[] xgraph = new double[nbpas]; double[] ygraph = new double[nbpas]; for (i=0; i<nbpas; i++) { if (ixGraph != -1) xgraph[i] = yc[i][ixGraph]; else xgraph[i] = tc[i]; ygraph[i] = yc[i][iyGraph]; } // calcul des extrema des tableaux : MaxminTabDouble mxg = new MaxminTabDouble(xgraph); MaxminTabDouble myg = new MaxminTabDouble(ygraph); double maxx = mxg.getmaxi(); double maxy = myg.getmaxi(); double minx = mxg.getmini(); double miny = myg.getmini(); // representation graphique du calcul : DomaineDouble dr = new DomaineDouble(minx, miny, maxx, maxy); DomaineInt de = new DomaineInt(0, 0, 450, 450); CanvasGraphe cg = new CanvasGraphe(dr, de, xgraph, ygraph);
224
Exemple dutilisation sur un mouvement circulaire Nous testons les classes pr c dentes en effectuant une r solution num rique e e e e du syst` me diff rentiel : e e
YP S S B B r FD r GIC qF w
class SEDOCirc extends SysEDO { SEDOCirc(int pdim, double pt0, double[] py0, double ppas, int pnbpas, int pixGraph, int piyGraph) { super(pdim, pt0, py0, ppas, pnbpas, pixGraph, piyGraph); } public double[] calcul(double t, double[] y) { double[] result = new double[2]; result[0] = -Math.sin(t); result[1] = Math.cos(t); return result; } public String libelle() { return "Mouvement circulaire";} } class PrgCirc{ public static void main(String args[]) { int dim=2; double t0=0; double[] y0={1,0}; double pas=0.5; int nbpas=15; int ixGraph=0, iyGraph=1;
Nous tracons un portrait de phase, cest a dire la trajectoire des points de ` coordonn es e en faisant varier . la solution th orique correspond au e cercle trigonom trique. e
r r f 7 7B
225
SEDOCirc sf = new SEDOCirc(dim, t0, y0, pas, nbpas, ixGraph, iyGraph); IterSysEDO methode = new IterSysEuler(sf, pas, y0, t0); TraitSEDO work = new TraitSEDO(sf, methode); } }
Lavant derni` re ligne du programme contient le nom du processus effective e de r solution utilis e. Il suft simplement de modier cette ligne pour utiliser un e e autre processus. Cest ce qui est fait dans la suite. On utilise donc dabord la m thode dEuler qui donne de mauvais r sultats car e e elle amplie a chaque it ration sa d viance par rapport au cercle-unit solution ` e e e du probl` me. e
La trajectoire suivante est obtenue en utilisant la m thode de Runge-Kutta e dordre 2. On voit que la solution num rique approch e est meilleure que pour la e e m thode dEuler. e Finalement, nous utilisons la m thode de Runge-Kutta dordre 4 qui, a chaque e ` it ration, va fournir une solution situ e sur la trajectoire exacte du syst` me (ici, le e e e
226
cercle unit ). e
Exemple dutilisation sur les equations de Lorentz Nous appliquons maintenant notre programme pour r soudre les equations de e Lorentz :
DP S U S B 1n " q k yu
SEDOLorentz(int pdim, double pt0, double[] py0, double ppas, int pnbpas, int pixGraph, int piyGraph) { super(pdim, pt0, py0, ppas, pnbpas, pixGraph, piyGraph); }
S P
et
X D
S U
DP
227
public double[] calcul(double t, double[] y) { double[] result = new double[3]; result[0] = a*(y[1]-y[0]); result[1] = c*y[0]-y[0]*y[2]-y[1]; result[2] = y[0]*y[1] -b*y[2]; return result; } public String libelle() { return "Equations de Lorentz";} } class PrgLorentz{ public static void main(String args[]) { int dim=3; double t0=0; double[] y0={1,1,1}; double pas=0.01; int nbpas=4000; int ixGraph=0, iyGraph=2; SEDOLorentz sf = new SEDOLorentz(dim, t0, y0, pas, nbpas, ixGraph, iyGraph);
228
IterSysEDO methode = new IterSysRK4(sf, pas, y0, t0); TraitSEDO work = new TraitSEDO(sf, methode); } }
de
F IG . 8.5: R solution num rique des equations de Lorentz - Portrait de phase en e e (x,z)
en fonction