GUIDE DU CALCUL AVEC LES LOGICIELS LIBRES XCAS, Scilab, Bc, Gp, GnuPlot, Maxima, MuPAD
GUIDE DU CALCUL AVEC LES LOGICIELS LIBRES XCAS, Scilab, Bc, Gp, GnuPlot, Maxima, MuPAD
Guillaume Connan Professeur agrégé de mathématiques au lycée Jean Perrin (Rezé)
Stéphane Grognet Maître de conférences à l’Université de Nantes et directeur de l’IREM des Pays de la Loire
Illustration de couverture : Digital vision
© Dunod, Paris, 2008 ISBN 978-2-10-053934-5
Table des matières
I NTRODUCTION 1
2 3 4
Généralités a. Public visé b. Organisation Pourquoi des logiciels libres ? Liste des logiciels abordés Vive le calcul !
1 1 1 1 2 2 3
Partie I INTERFACE C HAPITRE 1 : A IDE 1.1 Installer les logiciels 1.2 Obtenir de l’aide a. Aide en ligne de commande b. Aide en ligne locale c. Aide en ligne par internet d. Documentation internet 1.3 Promenade avec bc 1.4 Promenade avec XCAS
C HAPITRE 2 : C OMMUNICATION 2.1 Communiquer avec un logiciel de calcul a. Écriture des nombres b. Saisie des instructions au clavier c. Mise en forme des résultats au format instruction 2.2 Obtenir des sorties compatibles avec le logiciel de typographie LATEX a. LATEX et les calculs avec XCAS b. LATEX et les sorties graphiques de XCAS c. LATEX et GnuPlot d. Combiner Bc, GnuPlot et LATEX 2.3 Utiliser des logiciels de calcul avec TeXmacs 2.4 Utiliser les logiciels de calcul en mode texte sous Emacs 2.5 Faire communiquer deux logiciels de calcul
5 7 7 7 7 8 8 8 8 9 13 13 13 13 14 15 15 18 20 23 26 27 29
a. Le copier-coller à la souris b. Communication via des fichiers c. Appel à l’interpréteur de commandes du système (shell) d. Un bon outil : la gestion des chaînes de caractères 2.6 Programmation interactive
C HAPITRE 3 : L A PROGRAMMATION 3.1 Avec XCAS a. Les procédures b. for c. while d. if e. Listes,ensembles et chaînes f. Programmation en français Pour tantque si 3.2 Avec MuPAD a. Les procédures b. for c. while d. if e. Listes, ensembles et chaînes 3.3 Avec Scilab
Partie II CALCUL C HAPITRE 4 : A RITHMÉTIQUE 4.1 Calcul en précision arbitraire a. Avec Bc b. Avec XCAS c. Avec Maxima d. Avec gp e. Avec Yacas 4.2 Erreurs d’arrondi avec GnuPlot 4.3 Changement de base avec Bc 4.4 Congruences 4.5 Nombres premiers a. Théorème des nombres x premiers 1 b. La fonction Li :x → dt et les nombres premiers 2 ln t 4.6 Nombres p-adiques
C HAPITRE 5 : É QUATIONS 5.1 Avec XCAS
vi
29 29 29 30 30 31 31 31 32 33 33 33 36 36 36 36 37 37 38 39 39 39 41
43 45 45 45 46 46 46 46 47 48 49 50 50 52 53 55 55
5.2 Avec MuPAD
C HAPITRE 6 : P OLYNÔMES 6.1 6.2 6.3 6.4 6.5
58 61
Avec Scilab Avec Maxima Avec XCAS Avec Gp Avec Yacas
61 62 63 64 65
C HAPITRE 7 : F ONCTIONS
67
7.1 Avec Gp 7.2 Avec Maxima 7.3 Avec XCAS a. Cas général b. Définir des fonction non numériques : un exemple en géométrie en classe de Seconde 7.4 Avec Bc 7.5 Avec Scilab a. Cas général b. Évaluation en rafale 7.6 Avec Yacas 7.7 Avec Octave
C HAPITRE 8 : A LGÈBRE LINÉAIRE 8.1 Avec Scilab a. Opérations élémentaires b. Résolution d’un système d’équations linéaires c. Réduction d’endomorphismes 8.2 Avec Octave 8.3 Avec Maxima 8.4 Avec XCAS, au gré d’activités diverses a. Déterminer un projecteur b. Puissances de matrices c. Inverse de matrices d. Trouver l’inverse d’une matrice avec la méthode de Gauss-Jordan e. Chaînes de Markov f. Chiffrement de Hill Codage Décodage
C HAPITRE 9 : G ÉOMÉTRIE AFFINE 9.1 Avec Scilab a. Équation de droite dans le plan b. Équation de plan dans l’espace tridimensionnel 9.2 Avec XCAS a. Propriétés géométriques
67 67 68 68 69 72 72 72 73 73 74 75 75 75 76 76 77 77 78 78 79 79 80 83 86 87 88 91 91 91 91 91 92
vii
Dans le plan Dans l’espace b. Une activité de 2nde 9.3 Avec GnuPlot
92 93 95 96
C HAPITRE 10 : S TATISTIQUES
99
10.1 Des statistiques sans tableur... a. Le problème du Duc de Toscane Un peu de (petite) histoire Simulation de l’expérience Simulation à grande échelle b. Lancers de dés c. Un problème d’ivrogne 10.2 Générateurs aléatoires 10.3 Régression linéaire 10.4 Statistiques 10.5 Application a. Loi uniforme b. Loi normale c. Pile ou face d. Jeu de dés
C HAPITRE 11 : C ALCUL DIFFÉRENTIEL 11.1 Premiers contacts a. Avec Scilab b. Avec Maxima c. Avec XCAS d. Avec Gp e. Avec Yacas 11.2 Calcul différentiel multidimensionnel 11.3 Courbes 11.4 Surfaces 11.5 Étude métrique des surfaces 11.6 Extrema d’une fonction de R2 dans R avec XCAS a. Extremum sous contrainte et multiplicateur de Lagrange b. Condition nécessaire et suffisante d’existence d’un extremum
C HAPITRE 12 : I NTÉGRATION 12.1 Primitives a. Avec Yacas b. Avec Maxima c. Décomposition en éléments simples d. Avec Scilab e. Avec XCAS f. Avec MuPAD 12.2 Changement de variable et intégration par parties
viii
99 99 99 99 100 101 103 105 105 105 106 106 108 109 110 113 113 113 114 114 116 116 116 117 119 125 132 132 135 139 139 139 139 140 142 143 143 144
a. Avec XCAS Changement de variables Intégration par parties Intégrale de Wallis b. Avec MuPAD 12.3 Calcul approché d’intégrales a. Méthode des rectangles avec XCAS b. Application au calcul d’une approximation de π avec XCAS
C HAPITRE 13 : D ÉVELOPPEMENTS LIMITÉS 13.1 13.2 13.3 13.4
Avec Yacas Avec Gp Avec Maxima Avec XCAS a. Généralités b. Visualisation de l’approximation d’une fonction par le polynôme de Taylor
C HAPITRE 14 : É QUATIONS DIFFÉRENTIELLES ORDINAIRES 14.1 Avec Scilab a. Résolution d’une équation du premier ordre unidimensionnelle b. Résolution d’une équation du premier ordre multidimensionnelle c. Résolution d’une équation du deuxième ordre unidimensionnelle d. Résolution d’une équation d’ordre et de dimension quelconques 14.2 Avec Octave 14.3 Avec XCAS a. Résolution exacte b. Résolution approchée c. Méthode d’Euler : cas général d. Méthode d’Euler et exponentielle : TP en Terminale S Approximation affine Subdivision Tracé d’une ligne brisée Tracé en boucle Procédure À vous de jouer Estimation de l’erreur 14.4 Résolution exacte avec Maxima 14.5 Avec MuPAD
C HAPITRE 15 : T RANSFORMÉE DE L APLACE 15.1 Avec Maxima 15.2 Avec XCAS
144 144 144 145 147 148 148 149 153 153 153 154 154 154 155 157 157 157 157 160 161 161 161 161 162 162 163 163 163 163 164 164 165 165 166 167 169 169 170
ix
Partie III THÈMES T HÈME 1 : XCAS AU LYCÉE ?
173
1.1 XCAS et la géométrie dynamique au lycée 1.2 XCAS et les suites 1.3 Ce que ni le tableur, ni un logiciel de géométrie ne peuvent faire a. Preuve d’un théorème b. Illustration graphique c. Bilan de cette activité 1.4 Moralité...
T HÈME 2 : L OGIQUE ÉLÉMENTAIRE 2.1 Premiers contacts 2.2 Algèbre de Boole 2.3 Le raisonnement par l’absurde
T HÈME 3 : T HÉORÈMES DE M ÉNÉLAÜS ET PAPPUS 3.1 Coordonnées barycentriques a. Une condition d’alignement b. Une démonstration rapide du théorème de Ménélaüs 3.2 Problème du Monde 3.3 Cercles de Pappus a. Approche historique b. Résolution astucieuse de représentations paramétriques et d’une inversion
T HÈME 4 : S UITES ET CHAOS 4.1 4.2 4.3 4.4
185 185 185 186 189 189 189 190 192 193 193 196
200 200 201 203
T HÈME 5 : C ONIQUES
205
5.1 Étude algébrique des coniques a. Étude mathématique au niveau Bac+1 Premier cas : ab = 0 second cas : ab = 0 b. Étude mathématique au niveau Bac+2 Écriture matricielle de l’équation Exemple c. Étude informatique 5.2 Étude analytique des coniques x2 a2
y2
+ b2 = 1 x2 a2
y2 b2
b. Hyperbole d’équation − = 1 5.3 Ensemble des points M du plan tels que MF = eMH 5.4 Foyer et directrice d’une conique
x
173 173 179 179 182 183 183
199
Modélisation Observation chiffrée Observation graphique Diagramme de bifurcation
a. Ellipse d’équation
171
205 205 205 206 208 208 209 210 211 211 213 214 214
a. Cas de l’ellipse b. Cas de l’hyperbole 5.5 Construction de la tangente à une conique a. Le théorème b. L’observation par XCAS c. La preuve par XCAS 5.6 Activités géométriques sur les paraboles a. Tracé d’une parabole à la règle et au compas b. Pourquoi les antennes paraboliques sont-elles paraboliques ? 5.7 Coniques et cônes a. Section d’un cône par un plan d’équation x = t b. Section d’un cône par un plan d’équation x = t + k · z
214 215 215 215 215 217 218 218 219 220 221 222
T HÈME 6 : S ÉRIES DE F OURIER
225
6.1 Exploration 6.2 Interprétation physique 6.3 Phénomène de Gibbs
225 228 229
T HÈME 7 : M USIQUE 7.1 Construction d’une gamme avec Scilab a. Génération de gammes candidates b. Élimination des permutations circulaires de colonnes c. Fonction principale : mode d’emploi 7.2 Fabrication de sons
235 235 235 236 237 238
T HÈME 8 : C ARRÉS MAGIQUES
241
T HÈME 9 : C ODES CORRECTEURS D ’ ERREURS
247
9.1 Méthode naïve a. Liste des éléments de Fk2 b. Distance de Hamming c. La procédure de test et de correction d. Code t-correcteur 9.2 Codes cycliques et polynôme générateur 9.3 Corps de Galois - Création de polynômes générateurs
T HÈME 10 : S URFACES DONT LA PROJECTION EST IMPOSÉE 10.1 Introduction 10.2 Construction du polynôme adapté a. Définition mathématique b. Construction informatique 10.3 Définition semi-algébrique d’un polygone convexe régulier a. Le polygone a un nombre pair de côtés b. Le polygone a un nombre impair de côtés c. Traduction informatique 10.4 Construction de l’ensemble algébrique à partir de la définition semi-algébrique
248 248 248 249 251 253 255 259 259 260 260 260 262 262 263 264 265
xi
a. Carré b. Hexagone 10.5 Prolongements
T HÈME 11 : TACHES DES ANIMAUX 11.1 11.2 11.3 11.4 11.5
Introduction Affichage des données Construction sur un rectangle Construction sur un tore Construction sur un cylindre
Partie IV ANNEXES
265 266 267 269 269 270 273 276 277
279
TABLEAUX COMPARATIFS
281
B IBLIOGRAPHIE
289
I NDEX GÉNÉRAL
291
I NDEX DES COMMANDES
297
xii
Remerciements
Je remercie chaleureusement Bernard PARISSE, d’une part pour développer de manière si active le logiciel XCAS, et d’autre part pour avoir bien voulu relire et améliorer bon nombre des algorithmes présents dans cet ouvrage. Je tiens également à m’excuser auprès de Claire, Marie, François, Suzanne et Rose à qui j’ai tourné le dos tant de jours pour faire face à mon écran et les remercie pour leur patience. Guillaume C ONNAN
Introduction
Cet ouvrage aborde les niveaux :
➥
collège
➥
lycée
➥
supérieur
tant pour les notions mathématiques que pour les capacités informatiques nécessaires. L’ouvrage est destiné :
➥
à l’élève ou l’étudiant qui cherche une vision différente des notions abordées en cours, ou qui désire se cultiver,
➥
à l’enseignant qui cherche une aide soit pour préparer des illustrations pour son cours, soit pour préparer des activités sur machine en travaux pratiques,
➥
au candidat professeur qui souhaite illustrer une leçon mathématique en utilisant des programmes de quelques lignes sans rentrer dans une programmation fastidieuse,
➥
au technicien et au scientifique de n’importe quelle discipline qui souhaite manipuler les objets mathématiques dont il a besoin.
Cet ouvrage aborde trois domaines de travail :
➥
Comment utiliser le plus confortablement possible les logiciels de calcul ?
➥
Quelles sont les connaissances de bases qui permettent à un non-initié d’aborder chaque logiciel ?
➥
Comment traiter avec les machines quelques thèmes mathématiques un peu plus élaborés ?
Les textes de confort découlent de notre pratique ; ils sont destinés à ceux qui s’intéressent aux mathématiques sans expérience de la programmation et correspondent à la partie 4. Les textes de recettes de base de la partie 3.3 répondent aux questions que nous nous sommes nous-mêmes posées : pour illustrer tel ou tel domaine des mathématiques, quels logiciels choisir, quels sont les outils minimums qu’on peut acquérir sans gros travail d’apprentissage pour manipuler les objets mathématiques ?
Les thèmes d’étude de la partie 15.2 nous paraissent instructifs pour plusieurs raisons. On peut utiliser les logiciels de calcul pour faciliter le travail dans un domaine mathématique que l’on connaît. Mais il apparaît que les logiciels libres disponibles sont suffisamment riches et suffisamment documentés pour qu’on puisse aussi découvrir un domaine mathématique à travers eux. La manière de penser l’échange de connaissances s’en trouve modifiée. L’utilisation d’un logiciel pour résoudre un problème ambitieux mène à une utilisation poussée : le logiciel libère sa puissance ; des routines sont créées, qui peuvent être utilisées dans bien d’autres situations ; la solution apportée fait naître d’autres envies et apporte de fécondes suggestions.
Les logiciels libres publient les sources de leur programmes, ce qui leur offre différents avantages. Le fait que tout un chacun puisse apporter des corrections est un gage de stabilité. Le développement de certains logiciels peut être repris par de nouvelles équipes sans que le savoir-faire ne soit perdu : c’est un gage de pérennité. Leurs concepteurs visent la compatibilité avec les versions antérieures et le respect des normes informatiques. Les logiciels libres sont destinés à communiquer entre eux, et le fait de pouvoir cumuler la puissance de plusieurs logiciels pour un projet de calcul est précieux. Le fait de pouvoir les dupliquer légalement est bénéfique pour le budget de l’État ou des entreprises.
Plusieurs logiciels sont utilisés dans cet ouvrage. Nous pointons les différences de syntaxe ; elles ne doivent pas rebuter le néophyte car elles ont leur raison d’être, et le fait d’apprendre plusieurs logiciels de calcul en même temps apporte un recul profitable à l’assimilation des règles d’utilisation. Des tableaux comparatifs sont présentés en annexe page 281. Les logiciels libres présentés ici sont bien dans la philosophie des logiciels libres et des systèmes d’exploitation libres de la lignée UNIX ; à l’opposé de la stratégie commerciale des logiciels propriétaires, les logiciels libres ne cherchent pas à tout faire, mais à agir dans un domaine déterminé le plus proprement possible : ce qu’ils font, ils le font bien. Toujours dans la philosophie UNIX, les logiciels utilisent des modes de communication ouverts (ils peuvent lire et écrire des fichiers texte ou dans des formats ouverts, lancer des commandes système et donc n’importe quel autre logiciel), et collaborent entre eux. Tel logiciel de calcul formel utilise un autre logiciel de dessin pour ses graphismes, et un autre logiciel de calcul numérique pour ses calculs approchés. Cette coopération apporte une puissance et un confort d’utilisation introuvables dans les logiciels propriétaires.
2
Fonctionne
Logiciel
Type
Fonctionne
en mode
en mode
Licence
texte
graphique
oui
Bc
calculette en précision arbitraire
GPL
GnuPlot
traceur de figures mathématiques
GPL
Gp(pari)
calculateur formel orienté corps de nombres
GPL
oui
Maxima
calculateur formel
GPL
oui
MuPAD
calculateur formel
Propriétaire
Octave
calculateur numérique matriciel
GPL
oui
Scilab
calculateur numérique matriciel
cecill
oui
oui oui
oui
oui oui
XCAS(giac)
calculateur formel
GPL
oui(iacas)
Yacas
calculateur formel
GPL
oui
Logiciels abordés Les logiciels qui fonctionnent en mode texte présentent deux avantages : ils peuvent être installés et (modérément) utilisés sur des machines peu performantes, et peuvent être utilisés à distance par ssh via une liaison lente. Ils fonctionnent évidemment sur un terminal en mode graphique. Les relations des logiciels de calcul avec le logiciel de typographie LATEX sont abordées ici.
Nous remercions les auteurs des logiciels libres qui diffusent leur savoir à l’ensemble de l’humanité depuis des décennies. Les systèmes libres Linux et *BSD sont des outils de travail remarquables. Nous remercions l’IREM des Pays de la Loire, le Département de mathématiques de l’Université de Nantes, le laboratoire Jean Leray pour leurs aides diverses. Nous remercions Bernard Parisse pour ses réponses aux questions sur XCAS. Nous aurions aimé aborder d’autres logiciels, tels que geogebra, axiom, xfig, R. . . Cet ouvrage vise à encourager les utilisateurs à parcourir la riche documentation des logiciels libres, il ne vise surtout pas à la remplacer. Nous espérons que le lecteur prendra autant de plaisir que nous à découvrir les logiciels libres de calcul mathématique, et utilisera ce livre en expérimentant directement les logiciels de calcul sur sa machine, en n’oubliant pas son éditeur de texte préféré pour créer et ajuster ses propres programmes.
3
Première partie
INTERFACE
Aide Logiciel(s) abordé(s) : Bc GnuPlot Gp Maxima Octave Scilab XCAS Yacas
Problématique : Comment obtenir le mode d’emploi ?
À part MuPAD, les logiciels décrits ici sont libres, c’est-à-dire librement copiables avec leurs programmes-sources. Ils sont souvent dans l’arborescence de logiciels disponibles sous votre système d’exploitation Linux ou *BSD préféré. Sous MacOSX, il est bon d’utiliser Fink, qui les place dans le répertoire \sw. Mais certains logiciels ne sont pas disponibles par Fink : ils sont souvent sur internet sous forme déjà compilée pour MacIntosh. Sous Microsoft Windows, les logiciels sont à télécharger sur internet. On peut avoir besoin d’un simulateur UNIX comme CygWin. Dans tous les cas, il ne faut pas hésiter à consulter les sites internet correspondants et à télécharger la documentation.
Certains logiciels fournissent une aide sommaire en ligne de commande avec une instruction du type programme -h : ou programme -help. bc --help gnuplot --help gp --help maxima --help octave --help scilab --help
Ceci peut varier suivant la version du logiciel installé sur la machine.
Certains fournissent une aide dans la norme UNIX avec la commande man de l’interpréteur de commande (Shell) : man programme.
bc gnuplot gp maxima octave
Quelques logiciels fournissent une aide substantielle avec la commande info du shell :
gnuplot maxima octave
Certains logiciels offrent une aide en ligne, soit en appuyant un bouton en mode graphique, soit en tapant une commande du type help, comme Octave, Maxima, Scilab, un point d’interrogation, comme GnuPlot, XCAS, Yacas, deux points d’interrogation, comme Gp. Par exemple le programme Yacas lance le navigateur en mode texte ; le logiciel Gp avec deux points d’interrogation lance le visualiseur sur un document d’aide (en mode graphique). Il arrive que l’aide fournisse une précieuse recherche par mot-clé.
Certains logiciels proposent leur aide en ligne par un navigateur qui va chercher ses données sur le réseau. Ceci pose problème quand on travaille hors ligne. . .
Une grande quantité de documents est disponible sur internet dans de nombreuses langues. Il est intéressant de télécharger ces documents et de les consulter en travaillant.
Pour obtenir l’aide de Bc taper dans un terminal : man bc
on obtient une réponse du genre : Réponse du logiciel bc(1)
bc(1)
NAME bc - An arbitrary precision calculator language
8
SYNTAX bc [ -lwsqv ] [long-options] [
file ... ]
VERSION This man page documents GNU bc version 1.04. DESCRIPTION bc is a language that supports arbitrary precision numbers with interactive execution of statements. There are some similarities in the syntax to the C programming language. A standard math library is available by command line option. If requested, the math library is defined before processing any files. bc starts by processing code from all the files listed on the command line in the order listed. After all files have been processed, bc reads from the standard input. All code is executed as it is read. (If a file contains a command to halt the processor, bc will never read from the standard input.) This version of bc contains several extensions beyond traditional bc implementations and the POSIX draft standard. Command line options can cause these extensions to print a warning or to be rejected. This document describes the language accepted by this processor. Extensions will be identified as such. OPTIONS -l
Define the standard math library.
-w
Give warnings for extensions to POSIX bc.
-s
Process exactly the POSIX bc language.
-q
Do not print the normal GNU bc welcome.
-v
Print the version number and copyright and quit.
--mathlib Define the standard math library. --warn Give warnings for extensions to POSIX bc. --standard Process exactly the POSIX bc language.
On se déplace dans le visualiseur avec ↑ , ↓ , ou bien quitte le visualiseur en tapant .
,
,
-
,
-
. On
!"#$ L’aide est très fournie sur XCAS.
➥
Il existe tout d’abord un index des commandes qui donne un rapide résumé des fonctionnalités. Par exemple, pour se rappeler la syntaxe de , on tape limite puis → −− − −− −→
On obtient :
9
➥ ➥
Pour une aide plus détaillée, on peut cliquer sur Détails si on avait déjà ouvert l’index d’aide ; on peut y accéder directement en tapant puis en indiquant la notion qui nous intéresse dans la fenêtre. Pour une aide plus générale, il existe des manuels d’aide sur les grands sujets généraux. Par exemple, si on clique sur l’icône interface du menu d’Aide, on obtient le résumé suivant à la section... Aide : Réponse du logiciel
LE MENU AIDE Ce menu contient les différentes formes d’aide possible. * INTERFACE contient ce manuel, donc l’aide concernant l’interface de Xcas. * MANUELS 1. CALCUL FORMEL contient l’aide générale qui concerne toutes les fonctions de calcul formel, de géométrie, de statistiques mais qui ne concerne pas les instructions de programmation, ni les instructions déplaçant la tortue.
10
2. ALGORITHMES décrit une partie des mathématiques utilisées pour programmer un logiciel de calcul formel 3. GÉOMÉTRIE contient une aide plus détaillée pour certaines commandes car cette aide est illustrée par des exercices (mais on n’a pas toutes les fonctions de géométrie !). 4. PROGRAMMATION contient une aide détaillée des instructions de programmation. Dans cette partie vous trouverez l’écriture de plusieurs algorithmes avec la traduction de ces algorithmes en langage Xcas MapleV MuPAD TI89/92. 5. TABLEUR,STATISTIQUES contient une aide détaillée concernant le tableur et les fonctions de statistiques ainsi que leurs utilisations dans le tableur. 6. TORTUE contient l’aide concernant les instructions qui sont utilisées dans l’écran de dessin Tortue. Dans cette partie vous trouverez plusieurs activités que l’on peut faire avec des enfants (du CP au CM2) dans le but de leur faire faire des mathématiques. 7. AMUSEMENTS contient de nombreux exercices mathématiques originaux traités avec XCAS. * INTERNET 1. FORUM permet d’accéder à un forum de discussion. 2. SITE LYCÉE G. CONNAN renvoie vers un site merveilleux... 3. RESSOURCES BAC S renvoie vers les sujets de l’épreuve expérimentale du Bac S. 4. RESSOURCES AGRÉGATION renvoie vers les thèmes utiles aux agrégatifs. 5. METTRE À JOUR L’AIDE permet de mettre l’aide à jour. * INDEX donne toutes les commandes utilisables classées par ordre alphabétique avec une ligne d’entrée qui permet de se déplacer facilement dans cette liste : il suffit de taper le début d’un nom dans cette ligne pour avoir le curseur à cet endroit dans la liste, vous pouvez ainsi aller directement à une lettre ou à une commande. En cliquant sur l’une de ces commandes, vous avez une aide succincte qui s’affiche dans le bandeau général à l’endroit des messages, des exemples que l’on peut copier en cliquant sur l’un d’eux et le nom des commandes proches ou des synonymes. Pour avoir une aide plus complète, cliquez sur le bouton Détails L’aide s’affiche soit dans un navigateur (par défaut Mozilla sous Linux, Internet Explorer sous Windows), soit dans une fenêtre à part. Sous Linux, il est commode d’ouvrir Mozilla et de l’icônifier pour pouvoir ouvrir cette aide lorsque cela est nécessaire. Vous pouvez aussi taper ?nom_de_commande pour avoir en réponse l’aide succincte sur cette commande. Notez qu’en tapant sur le bouton bleu ? situé en bas à gauche dans le bandeau général, on ouvre l’Index et, notez aussi qu’en tapant le début d’une commande dans une ligne de commandes puis sur la touche de tabulation ou sur le bouton bleu ?, on ouvre l’Index à la commande commençant par ce début. * TROUVE recherche le mot demandé dans toutes les pages du manuel Calcul formel.
Tout est dit...
11
Communication Logiciel(s) abordé(s) : Bc GnuPlot Gp Maxima Octave Scilab XCAS Yacas
Problématique : Mettre en forme les productions des logiciels. Faire communiquer les logiciels entre eux.
"
En notation scientifique, les nombres apparaisent sous la forme suivante, et ils sont à saisir de même : -1.23456e-7
représente le nombre −1, 23456 · 10−7 dans plusieurs logiciels. Le symbole de la partie exponentielle varie suivant les logiciels.
Notation scientifique logiciels
symboles acceptés pour la partie exponentielle
Bc Yacas Gp GnuPlot XCAS Maxima Scilab Octave
e,E d,D,e,E
La plupart des logiciels de calcul obéissent à une ligne de commande que l’utilisateur saisit avec le clavier. La commande n’est exécutée que quand on appuie sur la touche . Éditer une commande, c’est modifier la ligne que l’on est en train de saisir. Certains logiciels présentent des facilités dans ce domaine. La plupart accepte d’effacer le caractère à gauche du curseur quand on appuie sur la touche d’effaçage vers la gauche.
Dans certains logiciels, en utilisant les flèches du clavier, on peut rappeler une commande précédente. Des raccourcis-clavier autrefois introduits dans l’interpréteur de commande C-shell ou l’éditeur de textes Emacs, et maintenant devenus habituels, sont parfois repris :
➥
-
pour effacer toute la ligne,
➥
-
pour effacer le reste de la ligne à droite du curseur,
➥
-
pour placer le curseur en début de ligne,
➥
-
pour placer le curseur en fin de ligne,
➥
-
pour effacer le caractère à droite du curseur
et caetera. L’effet de ces commandes peut varier d’un logiciel à l’autre : il est recommandé de faire des essais. Ces commandes sont tellement pratiques qu’il serait dommage de s’en passer. Beaucoup de logiciels sont sensibles à la hauteur de casse : dans le logiciel Scilab, l’instruction
(1) fonctionne mais l’instruction Sin(1)
ne fonctionne pas.
Pour utiliser le résultat obtenu dans un logiciel comme entrée dans un autre, comme dans la section a. page 29, il faut que la mise en forme du résultat soit compatible avec la saisie des instructions. La ligne de commande permet de modifier à la volée les différences mineures de notation d’un logiciel à l’autre. En copier-coller à la souris, on peut utiliser l’étape intermédiaire d’un éditeur de texte pour nettoyer l’instruction. En demandant aux logiciels d’écrire et de lire dans un fichier, il est possible d’utiliser des éditeurs de texte automatisés tels que sed, awk, Perl. . .
opération Logiciel Scilab
Maxima
obtenir la sortie au format de l’entrée
;
exemple x= (0,’x’) p=xˆ2+1 (p) xˆ2+1;
xˆ2+1;
14
Mise en forme du résultat obtenir la sortie au format enjolivé
exemple
il n’y a rien à faire
;
xˆ2+1;
; xˆ2+1;
Mise en forme du résultat
opération Logiciel
obtenir la sortie au format de l’entrée
Gp
il n’y a rien à faire
il n’y a rien à faire
Yacas
il n’y a rien à faire
XCAS
il n’y a rien à faire
il n’y a rien à faire
exemple
obtenir la sortie au format enjolivé
exemple
PrettyForm(%)
Chaînes de caractères et instructions Voici un exemple (Figure 2.2) d’aller-et-retour entre les chaînes de caractères et les instructions dans Scilab.
% &% %' ()!
Il est possible de demander à XCAS de calculer à partir d’un fichier LATEX. Pour cela, il faut commencer par indiquer à LATEX qu’on l’autorise à exécuter des tâches externes en modifiant le fichier ( ou l’équivalent sur des systèmes non libres ) /usr/share/texmf/web2c/texmf.cnf. Il suffit d’y remplacer shell_escape=f par shell_escape= t.
15
Une manière moins drastique est de spécifier à son éditeur ( Kile, TeXmaker...) de compiler le fichier avec l’option shell_escape : latex --shell-escape fichier.tex
Si on travaille sous Emacs avec AucTeX, il suffit de rajouter à la toute fin du fichier : %%%
Local
%%% m o d e :
Variables : latex
%%% T e X − m a s t e r :
−− s h e l l − e s c a p e
t
%%% E n d :
Ensuite, voici le code LATEX à placer en préambule : \ [12pt]{article} \ {fancyvrb} \
%c o m m a n d e
pour
faire
appel
à
giac
\ {\executGiac}[1]{ \ \ 18{giac <#1 } } \
Remplacer \write18{giac Microsoft.
<#1}} par \write18{giac
#1}} sur Windows
Cette commande permet de s’échapper ( escape... ) momentanément de LATEX pour exécuter une commande externe dans le Shell. Ici, nous appelons giac qui correspond à XCAS en mode texte. Ensuite, il faut créer un script qui sera lu par giac dans son langage. L’environnement de l’extension permet de placer un script dans un fichier mis en argument, ici Xcass.in : \ {VerbatimOut}{Xcass.}
(0); Sortie: ("xcass.tex"); ("xcass.out"); (()); Resultat: ( (()[0])); (Sortie, ,Resultat); (Sortie); \ {VerbatimOut}
Nous utilisons ensuite des commandes propres à giac et donc XCAS :
16
➥ ➥ ➥
(nom fichier) qui créer un fichier ; ("fichier externe") qui charge un fichier externe; (commande ou sortie) qui transforme en code LATEX une commande ou un résultat affiché dans XCAS ;
➥ ➥
(fichier,Unquoted,cible) qui écrit cible sans guillemets dans fichier ; (nom fichier) qui ferme le fichier.
On crée ensuite un nouvel environnement LATEX qu’on appellera Xcass pour faciliter la saisie. On utilise à nouveau l’environnement VerbatimOut, mais cette fois-ci nous devons spécifier l’option \ pour expliquer à LATEX qu’il s’agit d’un environnement en mode Verbatim : \ {Xcass} {\ \ {VerbatimOut}{xcass.out}} {\ {VerbatimOut} \executGiac{Xcass.in} \[\ {xcass}\]}
On peut maintenant faire des essais : \ {document} \ {Xcass} simplify(1-8*ln(sqrt(1/e))+sqrt(2)+1/2); \ {Xcass} \ {Xcass} solve(sin(x)1/2,x) \ {Xcass} \ {Xcass} desolve([y’+ysin(x),y(0)2],y)[0]; \ {Xcass} \ {document}
et on remarque que seuls les résultats des commandes sont affichés : Réponse du logiciel
cos (x) + sin (x) cos (x) + sin (x) cos (x) + sin (x)
17
!"
On peut procéder de la même manière pour obtenir des sorties graphiques produites par XCAS. Il faut donc maintenant placer ces commandes dans le préambule du fichier LATEX. Pour exécuter un programme giac : \ \ {\executGiac}[1]{ \ \ 18{giac <#1 } } \
Pour une sortie de calcul : \ {VerbatimOut}{Xcass.in} maple_mode(0); Sortie:fopen("xcass.tex"); read("xcass.out"); Resultat:cat(latex(ans()[0])); fprint(Sortie,Unquoted,Resultat); fclose(Sortie); \ {VerbatimOut}
Pour une sortie graphique : \ {VerbatimOut}{xcasf.in} Sortie:fopen("xcasf.tex"); courbe:read("xcasf.out"):; Resultat:cat(latex(courbe)); fprint(Sortie,Unquoted,Resultat); fclose(Sortie); \ {VerbatimOut}
Sortie en mode maths : \ {xcass} {\ \ {VerbatimOut}{xcass.out}} {\ {VerbatimOut} \executGiac{Xcass.in} \ {xcass} \ }
Sortie en mode maths centré : \ {Xcass} {\ \ {VerbatimOut}{xcass.out}} {\ {VerbatimOut} \executGiac{Xcass.in} \[\ {xcass}\]}
Sortie en mode graphique :
18
\ {xcasf} {\ \ {VerbatimOut}{xcasf.out}} {\ {VerbatimOut} \executGiac{xcasf.in} \ {xcasf}}
Il ne reste plus qu’à faire appel à cet environnement à l’intérieur d’un fichier LATEX :
La solution de l’équation différentielle y"+y0 avec les conditions particulières y(0)y’(0)1 est fournie par \Prog{XCAS} grâce à la commande \Com{XCAS}{desolve}. Il s ’agit de la fonction définie par~: \ {Xcass} desolve([y’’+y0,y(0)1,y’(0)1],y)[0]; \ {Xcass} Nous obtenons également son }~:
graphe grâce à la commande \Com{XCAS}{plot
\ {xcasf} plot(desolve([y’’+y0,y(0)1,y’(0)1],y)[0],x-PiPi,colorblue); \ {xcasf}
qui donne :
19
Réponse du logiciel
La solution de l’équation différentielle y" + y = 0 avec les conditions particulières y(0) = y (0) = 1 est fournie par XCAS grâce à la commande
. Il s’agit de la fonction définie par : cos (x) + sin (x) Nous obtenons également son graphe grâce à la commande :
courbe
#
Pour insérer une figure produite par GnuPlot dans un fichier LATEX, rien de plus simple. Il suffit tout d’abord d’installer l’extension gnuplottexa . Plusieurs possibilités s’offrent alors à nous :
➥
on insère directement le graphique dans le texte : Du texte présentant ce graphique~: \ {gnuplot}[scale1.1] set hidden3d set isosamples 10,10 r(x,y)sqrt(x**2+y**2) f(x,y)sin(r(x,y))/r(x,y) splot f(x,y) \ {gnuplot} et du texte après.
ce qui donne : a Disponible sur CTAN : http://tug.ctan.org/tex-archive/macros/latex/contrib/gnuplottex/
20
Réponse du logiciel
Du texte présentant ce graphique :
f(x,y)
1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 10 5 -10
-5
0 0
5
-5 10 -10
et du texte après.
Compilation directe de la figure GnuPlot Le problème, c’est que cette méthode « fatigue » très vite la mémoire de LATEX et qu’on ne peut pas demander de trop gros calculs à GnuPlot et donc à LATEX. Ainsi, le dessin produit est peu précis car on ne peut dépasser les valeurs 10 et 10 pour
➥
Mieux vaut donc passer par l’intermédiaire d’un fichier eps pour laisser LATEX en dehors des calculs. On inclut le graphique avec \
: \begin{gnuplot}
’tempgnu.eps’
100,100 r(x,y) (x**2+y**2) f(x,y)(r(x,y))/r(x,y) f(x,y)
#
Appel si
ÉVENTUEL vous
à
epstopdf
travaillez
avec
pour
transformer
le
fichier
eps
en
pdf
pdfLaTeX .
epstopdf --outfiletempgnu_eps.pdf tempgnu.
\end{gnuplot} Du texte présentant ce graphique~: \includegraphics{tempgnu. } et du texte après.
21
Réponse du logiciel f(x,y)
Du texte présentant ce graphique : 1 0.8 0.6 0.4 0.2 0 -0.2 -0.4
10 5 -10
0
-5 0
-5 5
et du texte après.
10-10
Inclusion de la sortie eps produite par GnuPlot ➥
On peut également utiliser MetaPOST : cela économise aussi la mémoire LATEX et permet éventuellement de changer le style de figure en retouchant le fichier .mp :
\begin{gnuplot}
mp ’tempgnu.mp’
100,100 r(x,y) (x**2+y**2) f(x,y)(r(x,y))/r(x,y) f(x,y) #
Appel
extérieur
pour
compiler
le
fichier
metapost
mpost tempgnu.mp #
Appel
ÉVENTUEL
MetaPOST
en
à pdf
mptopdf si
vous
mptopdf tempgnu.0
\end{gnuplot} \includegraphics{tempgnu.0}
ce qui donne :
22
pour
transformer
travaillez
avec
le
fichier
pdfLaTeX .
produit
par
Réponse du logiciel
Du texte présentant ce graphique : f(x,y) 1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 10 5 -10
0
-5
0
-5
5
10 -10
et du texte après.
Inclusion de la sortie produite par MetaPOST
$% #
Une possibilité extraordinaire des logiciels libres est de pouvoir faire travailler ensemble plusieurs logiciels pour utiliser au mieux chacun dans le domaine où il excelle. b Nous1 allons 1dans cet exemple illustrer la convergence de la suite de terme général un = 1 − n vers e . Partageons les tâches :
➥
Bc va se charger des calculs ;
➥
GnuPlot va se charger de l’illustration ;
➥
LATEX va se charger de la mise en forme des résultats.
Commençons par créer des commandes pour faire exécuter des commandes en dehors de LATEX. D’abord pour Bc : \ \ {\executBC}[2]{ \ \ 18{bc -q -l
#1> #2 }}
% #1
fichier
contenant
les
commande
% #2
fichier
contenant
les
résultats
de
bc
des
calculs
Ensuite pour GnuPlot : \ {\ExecuteGnuPlot}[1]{ \ \ 18{gnuplot #1} } \ b Merci beaucoup à Dariush G HORBANZ ADEH http://www.cnam.fr/maths/Membres/ghorbanzadeh/
23
Rentrons maintenant un script Bc qui va créer une liste de valeurs de la suite (un ) : \begin{VerbatimOut}{bcK.bc}
somme (n) { i,j ; /*
pour
bc
les
indices
démarrent
à
0
*/
( i 0; i <n; i !!) { x[i] (1-1/(i+1))^(i+1); / * c a l c u l e (1 −1/ n ) ^n } ( j 0; j <n-1; j !!) { j+1, " ", x[j] , "\n" ; } / * on c r é e l e s l a b e l s * / n+1, " ", x[n] ; } 6 ; / * 6 c h i f f r e s a p r è s l a v i r g u l e * / somme(199); / * 2 0 0 v a l e u r s * /
*/
\end{VerbatimOut}
On lance ensuite l’exécution par Bc : \executBC{bcK.bc}{donnes.dat}
On va ensuire inclure les données calculées par Bc au format attendu par GnuPlot dans le fichier fich.gnu : \begin{VerbatimOut}{fich.gnu} " at
1 "exp(-1)0.3679 lt 3
# On
-0.22, .99, 0.5
place
exp ( −1)
c omme
label
#
de
au
back
bon
endroit
[1:200] [0.245:0.37] ’donnes.dat’ y
aura
la
légende
1:2
’’
3 ’n’ # l a b e l d e s a b s c i s s e s ’approximation de (1-1/n)^n’
#
format
image
en
eps
out ’fich1.eps’ " 0.8, 0.8 # exp ( −1)0 . 3 6 7 9 (-1) ’’
3
\end{VerbatimOut}
On exécute le fichier fich.gnu dans GnuPlot : \ExecuteGnuPlot{fich.gnu}
24
4
pas
titre
LaTeX
#
label
des
ordonnées
puisqu ’ i l
Enfin, on inclut la figure dans le texte : Voici une illustration expérimentale de la convergence de la suite de terme général $u_n\ (1-\{1}{n}\ )^n$ vers $\{1}{e}$~: \ {center} \
{fich1.eps} \ {center} On a calculé les 200 premiers termes de la suite. On s’aperçoit que la convergence est assez rapide.
Ce qui donne : Réponse du logiciel
Voici une illustration expérimentale de la convergence de la suite de terme général n un = 1 − n1 vers 1e : exp(-1)=0.3679
approximation de (1-1/n)^n
0.36
0.34
0.32
0.3
0.28
0.26
20
40
60
80
100 n
120
140
160
180
200
On a calculé les 200 premiers termes de la suite. On s’aperçoit que la convergence est assez rapide.
Illustration de lim 1 − n1 n→∞
n
= e −1 avec bc,
GnuPlot et LATEX
25
De jolis graphiques avec LATEX Appeler GnuPlot n’est certes pas la seule manière d’insérer des graphiques dans un fichier LATEX. Cela peut même poser des problèmes de cohérence des polices (qui peut se régler en préférant un export MetaPOST par exemple). Il existe en fait des programmes spécialement conçus pour effectuer de magnifiques dessins en totale cohérence avec LATEX : il s’agit entre autres de PStricks (qui consiste en fait en une série d’extensions LATEX), de MetaPOST et de Tikz principalement. Il créent de magnifiques dessins mais sont limités en capacités de calcul dans des cas particuliers d’étude de courbes ou de surfaces. Un nouveau venu joue les trouble-fête depuis peu, Asymptote, qui allie les capacités « esthétiques » de ses « concurrents » avec la puissance de calcul du C++. Pour information, les dessins du présent ouvrage qui ne sont pas produits par des logiciels de calcul sont créés en MetaPOST, comme les figures des pages 220, 264, 193 ou 195 par exemple.
* (!
Le logiciel TeXmacs permet de créer des documents « à la LATEX », mais en « wysiwyg »c . Dans le cas qui nous occupe, il permet également d’insérer dans le texte des sessions de certains logiciels : giac/XCAS, Maxima, MuPAD, Yacas, PARI/Gp, GnuPlot, Shell,... On peut ensuite exporter le document obtenu au format pdf, ps, html, LATEX. Réponse du logiciel
AVEC XCAS Voici un exemple de session XCAS : on l’appelle en cliquant sur Insérer->Session->giac > int(sqrt(1-x^2),x,0,1) 1 4 ×π La commande s’affiche en bleu et le résultat en noir avec de belles polices. Notez qu’un menu giac apparaît avec les principales commandes.
AVEC M AXIMA Il en va de même avec Maxima : (%i1) integrate(sqrt(1-x^2),x,0,1) (%o1) π4
c What You See Is What You Get
26
! " !
On peut également obtenir une sortie graphique avec GnuPlot : Réponse du logiciel
Il faut toutefois noter que TeXmacs est gourmand en mémoire et provoque des crashs inopinés. L’export LATEX n’est pas optimum. Il peut cependant rendre de bons services lorsqu’il s’agit de créer une feuille de TD utilisant l’un des logiciels implantés.
* )
+
Plutôt que d’utiliser les éditeurs livrés avec les logiciels (quand il y en a), on peut préférer rester à l’intérieur de son éditeur préféré, Emacs, qui possède des modes permettant d’ouvrir
27
des sessions XCAS ( en fait giac ), Maxima, MuPAD, Yacas... Par exemple, pour utiliser Maxima sous Emacs on installe maxima-emacs.el. Les heureux utilisateurs de distributions Debian ou Ubuntu peuvent par exemple lancer dans un Shell en mode super-utilisateur :
apt-get install maxima-emacs
Pour XCAS, on installera mupacs.el et on regardera l’aide sur le site XCAS. Une session XCAS sous Emacs ressemble donc à ça :
Réponse du logiciel
Giac CAS for mupacs, released under the GPL license 2.0 | (c) 2007 B. Parisse & al (giac), F.Maltey & al (mupacs) | >> TEXTWIDTH:=148: // :2: syntax error, unexpected T_END_INPUT at end of input 148:undef >> int(ln(x),x,1,e) ; 1 >> nextprime(1234894343132) ; 1234894343159 >> A:=[[1,2],[3,4]] ; [[1,2],[3,4]] >> A^2 ; [[7,10],[15,22]] >> eigenvals(A) ; (-sqrt(33)+5)/2,(sqrt(33)+5)/2 >>
Il ne faut pas s’occuper des 5 premières lignes. Pour éditer une saisie précédente, on tape
Pour Maxima, cela donne :
28
- ↑ .
# $ ! %! !" ! Réponse du logiciel
Maxima restarted. (%i1) S(x):=1/(x^3+x^2+x+1); 1 S(x) := --------------3 2 x + x + x + 1
(%o1)
(%i2) partfrac(S(x),x);
(%o2)
, -
1 x - 1 --------- - ---------2 (x + 1) 2 2 (x + 1)
+
C’est nécessaire quand on a besoin à la fois de calcul formel et de calcul numérique sophistiqué. En général quand on utilise simultanément deux domaines des mathématiques éloignés, chacun des deux étant traité par deux logiciels distincts, il est nécessaire de les faire communiquer.
& '
La souris est utilisable aussi sans environnement graphique (sous UNIX). Les résultats doivent être au même format que les instructions (voir la section c. page 14) dans la mesure où les instructions voulues coïncident entre les deux logiciels ! Pour changer commodément les hauteur de casse d’une chaîne de caractères, on pourra passer par l’intermédiaire d’un éditeur de texte comme Emacs.
(!
Beaucoup de logiciels fournissent des instructions pour lire ou écrire des données dans un fichier texte. En écrivant le résultat obtenu par un logiciel dans un fichier, et en lisant ce fichier avec un autre logiciel, on réalise une communication entre logiciels.
' ) * + , !-
L’interpréteur de commande des systèmes UNIX est particulièrement adapté à la communication entre les logiciels grâce au tubage de processus. Certains logiciels de calcul présentent
29
des commandes pour faire exécuter des instructions par le Shell. Par exemple Scilab fournit la commande . L’instruction :
(’ls’) fonctionne souvent mieux que la commande interne sur certains systèmes. On peut aussi augmenter la précision du calcul. . . unix_w("echo ’’4*a(1)’’ | bc -l")
("echo
’’4*a(1)’’ | bc -l")
Il faut noter la manière dont les apostrophes sont protégées ici.
. / ! 0 +
Pour fabriquer des noms de fichiers où écrire, pour fabriquer des instructions GnuPlot (par exemple) à placer dans un fichier, pour utiliser ce qui précède en général, il est pratique de manipuler les chaînes de caractères dans le logiciel de calcul. Par exemple dans Scilab : un="echo ’’" deux="*a(1)’’ | bc -l" x=12 y=3 z= (x/y) chaine=[’#/bin/sh’; un+z+deux; ’exit 0’] instr="date +%d:%m:%Y-%H:%M:%S" D= (instr); nom=’essai’+D+’sh’ (nom,chaine) (’sh ’+nom)
Pour inclure la date et l’heure dans le nom du script, on utilise l’instruction
.
.
Des fichiers spéciaux qui ne sont pas des fichiers réguliers sont bien utiles : les entrées-sorties standard. On les obtient par les variables #$%& ; #$'& dans Scilab; elles peuvent être utilisées dans un script Shell par exemple par la commande . L’intérêt n’est pas que cosmétique : quand on veut tester beaucoup de paramètres différents pour un calcul donné cela fait gagner beaucoup de temps !
30
La programmation Logiciel(s) abordé(s) : MuPAD Scilab XCAS
Problématique : Description des techniques de contrôle de flux dans les instructions et de quelques astuces.
# !"#$
La syntaxe est proche de celle du langage C++ :a Nom_de_la_procedure(variables):{
.
le programme proprement dit
. }
On commence par ouvrir une session programme en tapant simultanément sur par le menu Edit->Ajouter->Programme. On accède ainsi à l’éditeur de programme. On rentre :
et
ou
double(x):{ (2*x) }
On clique sur OK pour vérifier si tout va bien. Normalement, on obtient un message encourageant : Réponse du logiciel Success // Success compiling double
Dans une session de calcul, on rentre alors a XCAS est écrit en C++, ce qui le rend beaucoup plus maniable et rapide : il peut être facilement exécuté par un autre
programme et est donc directement compilé par les librairies C++ de l’ordinateur, sans passer par un noyau propre comme MuPAD ou MAPLE.
double(37)
et on obtient le résultat escompté... On peut rendre le résultat plus convivial : double(x):{ "Le double de "+x+" est "+ 2*x }
On concatène ainsi des chaînes avec un « + ».
La syntaxe suit le même principe : p:1; / / i n i t i a l i s a t i o n ( k:1; k<7; k:k+1){ / / k v a r i a n t d e 1 p:p*k; / / p d e v i e n t p * k e t on r e c o m m e n c e
à
7
avec
un
pas
de
1
}
On calcule ainsi 7 ! On aurait pu remplacer l’incrémentation k:=k+1 par l’écriture équivalente k++, comme en... C++. Mais pour incrémenter d’une valeur différente de 1, on utilise k:=k+incr
Il ne faut pas utiliser i comme variable locale car i est un complexe !
On aurait pu écrire une procédure pour faire plus joli : factofor(n):{ k,p; / / o n i n t r o d u i t p:1; ( k:1; k<n; k:k+1){ p:p*k; }
}
32
n+"
"+p;
deux
variables
internes
au
programme
&
Le résultat est certes plus lisible avec la « décoration » du point d’exclamation, mais cela le rend aussi inutilisable par la suite en tant que résultat à l’intérieur d’un autre calcul. On pourra donc être amené à remplacer return n+" ! ="+p; par return p;
1!
Reprenons le calcul précédent avec un test d’arrêt tant que : p:1; k:1; ( k<7){ k:k+1; p:p*k; }
Ou, sous forme de procédure : factowhile(n):{
k,p; p:1; k:1; ( k<n){ p:p*k; k:k+1; }
p;
}
On ne change pas une équipe qui gagne : factif(n):{ (n0) 1; n*factif(n-1); }
et en plus on voit une procédure récursive.
% ! 0
Il faut bien distinguer
➥
les ensembles (set ) qui sont des collections « non classées » d’expressions toutes différentes séparées par des virgules et encadrées par des accolades précédées de % ou bien entre crochets précédés de
33
ens1: [2,4,1]; ens2:%{2,5,8,5%}
On peut effectuer les opérations usuelles sur les ensembles ens1
ens2; ens1
ens2; ens1
ens2;
l’ensemble vide se note
[] %{%}
➥
les suites (sequence) qui sont des collections « classées » d’expressions (c’est-à-dire avec des éléments d’indice 0, 1, etc.), différentes ou non, séparées par des virgules et encadrées ou non par des parenthèses. s:5,7,5,1,2,3
On peut aussi utiliser les opérateurs et $ pour des suites définies par une formule explicite
(k^2,k15) (p^2) (p15) m 5
➥
les listes (li st ) qui sont des collections classées d’expressions séparées par des virgules et encadrées par des crochets. La différence, c’est que l’on peut avoir des listes de listes et si une instruction a plusieurs arguments, une suite ne peut pas être l’un de ces arguments. Notez au passage quelques fonctions utiles : s1:(j) (j-22); s2:a,b,c,d,f; " (s2); / / s i z e c omme t a i l l e . s2[0]; s2[14]; s3:(s1,s2); / / l e s s u i t e s s e c o n c a t è n e n t n a t u r e l l e m e n t L1:[s1]; L2:[s2]; / / une l i s t e e s t une s u i t e e n t r e " (L2); / / nombre d ’ o p é r a n d e s L2[3]; L2[0]; / / n o t e z b i e n que l e p r e m i e r o p é r a n de numéro
crochets
porte
le
0
L2[24] (L1,L2) (x->x>0,L1); (x->x<0,L1); (L1,232); (L2,’3())’); supprimer
un
//
pour
substituer
ou
opérande
(L2,); "((x,y)->x*y,L1,L2); ➥
34
les chaînes de caractères (st r i ng ) sont des juxtapositions de caractères qui ne sont pas évaluées par XCAS si ce n’est en tant que simple sigle « muet ». On place les éléments de la chaines entre guillemets "".
& C:"è-&èçé_eàhdslqjbch123+4/*5-6*
^"
On concatène les chaînes avec l’opérateur + : D:"tralala"; F:", pouet pouet G:D+F
"
mid(C,5,2) renvoie une partie de la chaîne C de longueur 2 à partir du 6e caractère :
(C,5,2)
Pour XCAS, comme pour les mathématiciens, le premier entier naturel est 0.
Pour des utilisations particulières, je vous renvoie à l’aide. Voici par exemple un petit programme qui transforme un nombre entier en une chaîne de lettres : on groupe les chiffres deux par deux puis on traduit le nombre obtenu en lettreb en utilisant son code ASCII. Ce programme sert en particulier pour le décodage RSA. alph(n):{ // l,L; L:[];l: (n); chaîne
formée
on
rentre
// de
ses
L
un
est
entier
une
n
liste ,
cat
transforme
n
en
la
chiffres
(k:0;k<" (l);k:k+2){ L: (L, ( (l,k,2)))
//
expr
transforme
de
nombres
une
chaîne
en
nombre
}
(L); lettres
selon
// les
la
liste
codes
ASCII
est
transformée
en
}
Ou bien un autre qui écrit en majuscules un mot rentré en minuscules : majuscule(c):{ C:""; / / l a f u t u r e c h a î n e m a j u s c u l e , v i d e a u d é p a r t (j:0;j<" (c);j++){C:C+( (c[j])-32 )} ; }
Notez que ** ++(r)envoie la liste des codes ASCII des caractères de la chaîne et (liste) fait l’inverse. Voir aussi la section f. page 86. b En ASCII, les majuscules ne sont codées que par des nombres de deux chiffres.
35
Connaissez-vous le code ASCII ? La mémoire de l’ordinateur conserve toute donnée sous forme numérique. Pour coder chaque touche du clavier, on utilise depuis les années 60 le code ASCII (American Standard Code for Information Interchange). On dit que c’est un code 7 bits, c’est-à-dire que chaque caractère est codé par une liste de 7 chiffres égaux à 0 ou 1 : combien de caractères différents peut-on ainsi coder ?... Par exemple les codes 65 à 90 représentent les majuscules, les codes 97 à 122 représentent les minuscules, dans le même ordre. Il suffit donc de soustraire 32 au code de la minuscule pour obtenir la majuscule correspondante. Une fonction XCAS donne ces nombres : (“caractère”) et ([liste de nombres]) effectue l’opération réciproque.
2
XCAS offre la possibilité d’utiliser les instructions précédentes traduites en français.
Les boucles for deviennent des boucles avec une syntaxe différente : s:0; j
de 2*1-1
,
2*6-1
, avec la même syntaxe qu’en anglais ou bien
2
s:s+j;;
donne la somme des six premiers entiers naturels impairs.
Les boucles while deviennent des boucles , avec la même syntaxe qu’en anglais ou bien avec une syntaxe différente : k:1;
6^k%11
1%11
k:k+1;
;
donne le premier entier naturel non nul k tel que 6k ≡ 1[11].
Et c’est pareil avec au lieu de if : test_syr(u):{ u%20%2 u:u/2; u:3*u+1;
36
& '!(
; }
Ce code effectue un petit test pour construire la suite de Syracuse.
Tortue XCAS : programmation pour petits et grands... En tapant sur + on ouvre une fenêtre tortue pour permettre à de jeunes enfants de s’initier à la programmation en dessinant. Vous consulterez l’aide très complète à ce sujet. Voici par exemple des instructions permettant de construire une petite frise grecque : n:100; (n>0)
n;
;n:n-10;
et on obtient :
# / #0
La syntaxe générale: Nom_de_la_procedure:(variables)
le programme proprement dit
37
Par exemple double:(x)
2*x
On valide. Normalement, on obtient un message encourageant :
double(x)
On rentre alors double(37)
et on obtient le résultat escompté... On peut rendre le résultat plus convivial : double:(x) ( , ' (2*x)."
est le double de ". ' (n));
On concatène ainsi des chaînes avec un « . ».
La syntaxe suit le même principe : p:1: k p:p*k
;
1
7
1
On calcule ainsi 7 ! On aurait pu écrire une procédure pour faire plus joli : factofor:(n) k,p; p:1: k 1 7 1 p:p*k
; ( , ' (n)."!". ' (p));
38
& '!(
1!
Reprenons le calcul précédent avec un test d’arrêt tant que: p:1: k:1: k<7 k:k+1: p:p*k
: p;
Ou, sous forme de procédure : factowhile:(n) k,p; p:1; k:1; k<7 k:k+1: p:p*k
: ( , ' (n)."!". ' (p));
On ne change pas une équipe qui gagne : factif:(n) n0
1
n*factif(n-1)
;
:
qui est une procédure récursive.
% ! 0
C’est un peu le même principe que sous XCAS.
➥
les ensembles ens1:{2,4,1}; ens2:{2,5,8,5};
On peut effectuer les opérations usuelles sur les ensembles ens1
ens2; ens1
ens2; ens1
ens2;
l’ensemble vide se note {}
39
➥
les suites 5,7,5,1,2,3;
On peut aussi utiliser l’ opérateur $ pour des suites définies par une formule explicite : p^2 p15; m 5;
➥
les listes Notez quelques fonctions utiles : s1:i i-22; s2:a,b,c,d,e; L1:[s1]; L2:[s2]; (L2); / / nombre d ’ o p é r a n d e s L2[3]; / / e x t r a i t l e 3 ème o p é r a n d e L2[35]; (L1,x->x>0) (L2,b32); (L1,2z); (L2,5()); étant
la
liste
//
null ()
vide
(L2,); "(L1,L2,(x,y)->x+y); L3:L1.L2; / / p o u r c o n c a t é n e r ➥
les chaînes de caractères C:"è-&èçé_eàhdslqjbch123+4/*5-6* ^"; K:"tralala"; F:", pouet pouet !"; H:"" G:K.F.H
(C,5,2) renvoie une partie de la chaîne C de longueur 2 à partir du 6e caractère :
("123456789",4,
2)
Pour des utilisations particulières, je vous renvoie à l’aide. Voici un petit programme qui transforme un nombre entier en une chaîne de lettres qui peut servir pour le décodage RSA. alph:(n) / / on l,L; L:[];l: ' (n); formés
des
chiffres
rentre
un
entier
// de
L
est
n
une
k 0 (l)-1 2 L:L.[ ' ( (l,k,2))] la
chaîne
en
: 40
l
la
chaîne
//
text2expr
transforme
nombre
: -- .(L); lettres
liste ,
n
//
la
liste
L
est
transformée
en
chaîne
de
&&
# $ Pour exécuter un fichier dans Scilab, on peut taper nomDuFichier. Le logiciel Scilab n’aime pas les appels récursifs à des fichiers pour les exécuter dans des procédures : sa pile sature. Il vaut mieux tout placer dans des fonctions. On exécute les fichiers juste pour définir les fonctions, qui, elles, peuvent être appelées dans des procédures intriquées. Les instructions de contrôle de flux de Scilab sont décrites dans le chapitre Programming de l’aide en ligne. La syntaxe n’a rien de surprenant. Voici une boucle qui stocke des nombres dans un tableau vertical, en affichant l’élément à chaque étape. t1:3 T[] it,
(i,’i’); T[T;i];
T
On construit maintenant une fonction test qui effectue différentes procédures suivant les valeurs de la variable. Il faut noter la manière dont sont protégées les apostrophes dans les chaînes de caractères. La première boucle est tout ordinaire.
ytest(x) a"C’’est l’’étape" b’trois’ yx x3
(b,a) ;
or([xt]) ;
y (x)+" n’’appartient
pas à t"
La seconde boucle permet de terminer la fonction rapidement si la variable x appartient au tableau t déja défini. Elle peut être écrite aussi bien
and([x~t]) y (x)+" n’’appartient
pas à t"
Pour exploiter la fonction test, il suffit d’exécuter la boucle
i[3*t
t],
test(i)
Le logiciel Scilab travaille essentiellement avec des fonctions, des nombres réels en virgule flottante, des chaînes de caractères, des tableaux formés à partir de ces éléments, et des fonctions. En général, il n’y a pas à déclarer de types de variables.
41
Deuxième partie
CALCUL
Arithmétique Logiciel(s) abordé(s) : Gp Yacas XCAS Scilab Octave Maxima Bc GnuPlot
" % $
Pour calculer π avec 1000 décimales, taper dans un terminal : bc -;
on obtient une réponse du genre : Réponse du logiciel bc 1.05 Copyright 1991, 1992, 1993, 1994, 1997, 1998 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type ‘warranty’.
Il suffit de taper
1000 pour obtenir la précision voulue en ajustant la variable , et 4*(1)
pour obtenir le quadruple d’Arctan(1) : Réponse du logiciel 3.141592653589793238462643383279502884197169399375105820974944592307\ 81640628620899862803482534211706798214808651328230664709384460955058\ 22317253594081284811174502841027019385211055596446229489549303819644\ 28810975665933446128475648233786783165271201909145648566923460348610\ 45432664821339360726024914127372458700660631558817488152092096282925\ 40917153643678925903600113305305488204665213841469519415116094330572\ 70365759591953092186117381932611793105118548074462379962749567351885\ 75272489122793818301194912983367336244065664308602139494639522473719\ 07021798609437027705392171762931767523846748184676694051320005681271\ 45263560827785771342757789609173637178721468440901224953430146549585\ 37105079227968925892354201995611212902196086403441815981362977477130\
99605187072113499999983729780499510597317328160963185950244594553469\ 08302642522308253344685035261931188171010003137838752886587533208381\ 42061717766914730359825349042875546873115956286388235378759375195778\ 18577805321712268066130019278766111959092164201988
Le temps de réponse est variable suivant les machines, et augmente fortement quand on augmente encore la précision. Le résultat est-il juste ?
On règle la précision avec / ou /01023 qui doit être un nombre entre 1 et 1000
/ :1000:; 4* ( (1)) Voir aussi 5.1 page 56.
3
On règle la précision avec , puis on utilise :
: 1000; (4*atan(1));
La précision d’affichage est donnée ou fixée par l’instruction \. \p
4 4* (1) \p 1000
4
Le résultat est-il le même que pour Bc ?
4
La précision des calculs approchés est donnée par l’instruction
1 4 () Pour obtenir ponctuellement des calculs en précision arbitraire, il suffit de le demander lors du calcul approché.
((4,1000) Pour basculer la valeur de la précision, taper
46
! ) * !
4 (1000) ((4) Pour revenir à la précision précédente, taper
4 (10) ((1/4) ((4) Mais la précision maximale est conservée pour la valeur π.
) Le logiciel GnuPlot pose quelques problèmes avec des nombres trop grands ou trop petits comme le montre la retranscription de session suivante : gnuplot>
2**(30) Réponse du logiciel
1073741824
gnuplot>
2**(31) Réponse du logiciel
-2147483648
gnuplot>
2**(32) Réponse du logiciel
0
gnuplot>
2**(-30) Réponse du logiciel
9.31322574615479e-10
gnuplot>
2**(-31) Réponse du logiciel
-4.65661287307739e-10
47
gnuplot>
2**(-32) Réponse du logiciel
gnuplot> print 2**(-32) ^ undefined value
Le logiciel répète la dernière instruction accompagnée d’un commentaire pour avouer son impuissance.
"' 1 Le logiciel Bc détecte naturellement une entrée en base 16 avec la saisie des chiffres A, B, C, D, E. Le résultat par défaut est en base 10. Voici un exemple d’addition en base 16 avec le résultat en base 7 :
7 F+E
et Bc fournit le résultat 41. Pour rentrer des nombres dans une base différente de 10, il faut changer la variable , ce qui demande un peu d’attention. Dans la retranscription suivante, les instructions saisies sont repérées par un point-virgule final. % bc -lq
;
Réponse du logiciel 10
; Réponse du logiciel 10
7; ; A; Réponse du logiciel 13
48
!
66+22; Réponse du logiciel 121
A; A; 2*7; Réponse du logiciel 14
;
"
Les congruences de nombres entiers s’obtiennent souvent dans les logiciels de calcul par une instruction qui ressemble à mod(x,p). Les résulats ne sont pas toujours positifs, c’est-à-dire dans l’intervalle [0, p − 1] ∩ N. Cherchons à représenter l’entier relatif −5 dans Z/3Z : Avec Gp
5 (-5,3) Avec Maxima
5/)3:3; (-5); 5/)3:6.)3; Avec Octave mod(-5,3)
Avec Scilab
(-5,3) (-5,3) Avec Yacas
5 (-5,3) Avec XCAS -5%3
On peut bien sûr calculer dans Z/nZ :
49
x:7%9; y:4%9; 3*x^2-5* y^2
donne Réponse du logiciel 4 % 9
Si l’on veut connaître le chiffre des unités de 20082007
2009
, on peut faire :
(2008)^(2007^2009)%10
...mais cela ne donne rien de probant. Mieux vaut travailler tout de suite modulo 10 : (2008%10)^(2007^2009)
répond instantanément que le reste est 2. On peut préférer demander directement le reste avec la commande (n,p) :
((2008)^(2007^2009),10)
Si l’on veut l’image de p%n par l’application canoniquement associée de Z/nZ sur N, il suffit d’utiliser %0 : k:5%11; k^(2785); k^(2785)%0
Pour d’autres utilisations du calcul modulaire, voir le thème 7.2 page 247 et la section f. page 86.
, 2 %
! +
Le sujet est plus que vaste ! Contentons-nous d’une petite expérimentation sur le théorème des nombres premiers. Conjecturé par G AUSS (encore lui !) et L EGENDRE, approché par T CHEBYSHEV , ce théorème a fini par être prouvé indépendamment et simultanément par Jacques H ADDAMARD et CharlesJean de L A VALLÉE P OUSSIN en 1896.
50
# +
Théorème des nombres premiers En définissant, pour tout réel positif x, le nombre π(x) comme le nombre de nombres premiers inférieurs à x, le théorème des nombres premiers s’énonce de la façon suivante : π(x) ∼
x ln(x)
Construisons une fonction qui compte le nombre d’entiers premiers inférieurs à un nombre donné n. On utilise qui teste si un entier est premier. On peut d’abord penser à une définition récursive : pir(n):{ (n<2){ 0;} / / p o u r s a v o i r s ’ a r r ê t e r ( (n)){ pir(n-1)+1;} / / o n premier
et
on
rajoute
1
si
le
nombre
est
descend
pir(n-1);
}:;
Ça marche en ayant pris soin de régler le niveau de récursion du CAS au maximum (dans la fenêtre de configuration du CAS). Cependant, le niveau de récursion n’est pas infini et la fonction bloque sur notre ordinateur pour n = 4200. Nous allons donc plutôt utiliser un compteur et une boucle for : pif(n):{ k:0; (j:0;j<n;j++){ ( (j)){k:k+1;} premier
et
on
//
regarde
le
on
rajoute
1
au
compteur
si
j
est
suivant
k} }:;
Mais plutôt que de tester les nombres un par un, on peut utiliser la commande qui donne le premier nombre premier supérieur à n : pin(n):{ k:0; (j:2;j<n;j: k:k+1;} k}:;
(n)
(j)){
Il est à noter que XCAS utilise en arithmétique la librairie de PARI/Gp. Ainsi, affiche en réalité le plus petit entier pseudo-premier supérieur ou égal à n.
51
Il existe en effet deux tests : (n) et (n). Le premier test est sûr mais peut devenir très lent pour de très grands nombres. Le deuxième est plus rapide mais n’est fiable que pour une réponse négative. S’il répond 1, on peut juste penser que le nombre a « de bonnes chances » d’être premier car il a passé un certains nombres de tests de primalitéa . Pour de plus amples renseignements, vous pouvez également consulter le manuel PARI/Gp disponible dans la rubrique Aide de XCAS. 1 Maintenant, comparons cette fonction avec x → : ln(x) − 1 p:polygone_ouvert( ( ([50*k,pin(50*k)]),k02000)) les
points
( k , pin ( k ) )
avec
//
on
relie
un
de 50 jusqu’à 100 000 c: (x/((x)-1),x3100000, + 7) En 81 secondes, on obtient : Réponse du logiciel
Les courbes représentatives de π et x →
x ln x−1
sont extrêmement proches
/x →
x 2
1 t
ln t
e
G AUSS conjectura à la fin du XVIII siècle que π(x) était équivalent à Li(x) au voisinage de +∞. Établissons un petit tableau comparatif avec XCAS. Mais d’abord, définissons la fonction Li : Li(x): ( (1/(t),t,2,x)) Li(100000) a B EL ABAS , Karim Site officiel de PARI/GP . 〈URL: http://pari.math.u-bordeaux.fr/〉.
52
, + p - %!
Nous obtenons : Réponse du logiciel [9681.171008,9661.54761,9659.001899,9658.438958,9658.302243,9658.268308, 9658.25984,9658.257723,9658.257194,9658.257062,9658.257029]
Que se passe-t-il ? XCAS renvoie en fait une série d’approximations plus ou moins fines de l’intégrale : méthode des trapèzes, point milieu, Romberg, etc., la plus fine étant la dernière. Modifions donc notre définition de Li : LI(x):{ r: ( (1/(t),t,2,x)); r[" (r)-1]; / / o n p r e n d l e d e r n i e r }
de
la
liste
On peut alors créer un tableau comparatif : [["x","(x)","Li(x)","1/((x)-1)"], ([10^k,pin(10^k),Li(10^k), (1/((10^k)-1))],k28)]
et on obtient, après environ 8 minutes de compilation : Réponse du logiciel
⎡ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎣
x
π(x)
Li(x)
100
25
29.1
1000
168
176.6
10000
1229
1246.5
100000
9592
9658.3
1000000
78498
78984.6
10000000
664579
668749.5
100000000
5761455
5801743.9
⎤ 1/(ln(x)-1) ⎥ ⎥ ⎥ 27.7 ⎥ ⎥ 169.3 ⎥ ⎥ ⎥ 1218.0 ⎥ ⎥ ⎥ 9512.1 ⎥ ⎥ ⎥ 78030.4 ⎥ ⎥ ⎥ 661469.0 ⎦ 5740303.8
. 2 p 3
Le logiciel Gp connaît les nombres p-adiques. Il suffit de les rentrer avec la notation de Landau des développements limités. a:a49+O(5^3) a/5 a*5 (a)
53
Équations numériques Logiciel(s) abordé(s) : XCAS MuPAD
,
# !"#$
Comme pour de nombreux logiciels de calcul formel, XCAS permet d’obtenir dans certains cas les solutions d’une équationa sous forme exacte grâce à la fonction :
(x^2+3*x+10) / / x e s t (t^2+3*t+10,t) (x^2+3*x+1) / / 0 p e u t (x^2+x+10) / / n e p a s
l ’ inconnue
être
par
défaut
omis
oublier
de
cocher
" complex "
dans
" Cas
Configuration "
(x^2+a*x+10,x) (x^2+a*x+10,a) Notez que le paramètre a est considéré par défaut comme étant réel. Si l’on veut travailler avec des variables complexes, il faut cocher 8 dans le menu de configuration cas. Il faudra alors utiliser la fonction assume pour émettre des hypothèses sur a :
(x^2+a*x+10,x) ( (x^2+a*x+10,x)[0]) (a,real) ( (x^2+a*x+10,x)[0])
//
partie
//
a
est
réelle
de
maintenant
la
premiere
supposé
Toutefois, nous atteignons parfois les limites du calcul formel :
(x+(x)+1000) et c’est une approximation numérique que nous obtenons. a Nous examinerons plus précisément les équations polynomiales à la section 5.2 page 61.
réel
racine
! Configuration du CAS Selon les cas, il faudra veiller à bien configurer le CAS b : - ou non pour avoir des résultats exacts ou approchés; - 8 ou non pour avoir des résultats (exacts ou approchés) sous forme réelle ou complexe; - 8 ou non pour travailler avec des variables complexes ou réelles.
Il existe de nombreuses méthodes d’approximation. La plus célèbre est celle de Newton. On peut l’utiliser directement sous deux formes :
(x^2-2,x1) / / x 1 p r é c i s e (x^2-20,x1,newton_solver)
le
départ
de
l ’ algorithme
Pour connaître la précision de notre calcul :
(x^2-2,x1)- (2) Nous avons donc 15 bonnes décimales. Si nous en voulons plus, il existe deux appels optionnels à la fonction newton : le nombre maximum d’itérations et la précision minimum recherchée. Par défaut, ces valeurs sont respectivement fixées à 12 et 10−8 .
(x^2-2,x,1,12,1 -50)- (2)
//
1 e −50
signifie
10^( −50)
XCAS nous affiche -2.828427. Reflexion faite, ce nest pas étonnant : la variable / qui fixe le nombre de chiffres significatifs est par défaut fixé à 10. Si nous voulons plus de précisions, il faut faire varier / :
/ :100 (x^2-2,x,1,12,1 -50)- (2) et nous avons 100 bonnes décimales. Nous avons d’ailleurs besoin de moins de 12 itérations pour arriver à ce résultat. Voici un petit programme indiquant le nombre d’itérations nécessaires pour obtenir une précision donnée : Newton(f,pre,u0):{ un,aun,fp,k; fp: (f); k:0; aun: (u0); un: (u0-f(u0)/fp(u0)); ((un-aun)>pre) { aun:un; un: (un-f(un)/fp(un)); b Dans Cfg -> Cas Configuration
56
# k:k+1; }
un+" est la solution trouvée à " + (pre) + " près après "+ k +" itérations";
}
Exécutons ce programme : Newton(x->x^ 2-2,1 -100,2);
Il nous assure que 8 itérations sont nécessaires pour obtenir AU MOINSc 100 bonnes décimales... Pour des cas plus « lourds », nous pouvons utiliser la méthode de Steffenson qui accélère celle de Newton :
(x^2-20,x0,1 -10,steffenson_solver) Bizarre... C’est qu’en fait la méthode de Steffenson comme celle de Newton est très rapide, mais elle nécessite une bonne première approximation de la racined . Mieux vaut donc rentrer :
(x^2-20,x1,1 -10,steffenson_solver) Cet inconvénient est encore plus mis en valeur avec l’équation x + ln(x) + 100 = 0. En effet, si on appelle f la fonction associée, lim f (x) = −∞ et f e−100 = e−100 − 100 + 100 > 0, donc la x→0
solution appartient à l’intervalle ]0 ; e−100 [, ce qui indique que la solution est assez petite...
(x+(x)+1000,x (-100))- (-100) nous indique que nous sommes malgré tout assez proche de e−100 . Pour un choix de la méthode de résolution numérique d’un système d’équations linéaires ou non, voir l’exemple page 196.
Format de nombre Le format de nombre approché utilisé par XCAS est par défaut le format double (53 bits de précision relative, soit environ 10−16 ). Si /01023<16 (la precision est alors independante de Digits, seul l’affichage change). Si /01023 16, la librairie multiprécision mpfr est utilisée. Donc on peut demander la précision souhaitée jusqu’à DIGITS:=1000.
c C’est un-aun ( c’est-à-dire u
n+1 − u n ) qui doit être inférieur à la précision dans notre programme : cela est suffisant mais pas nécessaire pour avoir la précision voulue. d Voici un problème qui déborde du cadre de ce livre, mais qu’il serait très intéressant d’explorer, par exemple en étudiant M ARLE , Charles-Michel/P ILIBOSSIAN , Philippe Méthodes numériques itératives . Paris: Ellipses, 2006
57
! Calcul avec des flottants Attention au calcul avec des flottants : l’addition n’est pas toujours associative, 1− x avec x de l’ordre de 10−100 peut être égal à 1, enfin (0, 1×3)−0, 3 n’est pas forcément nul car les nombres sont codés en base 2, donc seuls les entiers et les rationnels dont le dénominateur est une puissance de 2 peuvent être représentés exactement. Ceci entraîne des résultats qui peuvent surprendre. Voir le cours de maths assistées par ordinateur de Bernard Parisse sur http://www-fourier.ujf-grenoble.fr/ ~parisse/francais.html\//mat249
, # / #0 L’outil général est solve :
(x^2-4*x+30,x); (x^2-x+30,x); C’est assez classique. Ce qui l’est moins, c’est la capacité de résoudre des équations dépendant de paramètres. S: (x^2 - s*x+p0,x):
Vous avez remarqué que les solutions des premiers exemples sont affichées entre accolades. Interrogeons MuPAD :
( (x^2-4*x+30,x)); La réponse /5 32 nous indique qu’il s’agit d’un ensemble. Ceci a une grande importance si nous voulons réinvestir les solutions trouvées. Pour en revenir à notre équation du deuxième degré, l’ensemble des solutions comportera deux éléments, ou plutôt opérandes en langage MuPAD. Nous pouvons demander le premier élément de cet ensemble grâce à la commande :
(S,1); qui affiche le premier opérande de l’ensemble S. Nous pouvons être également amenés à résoudre des équations non pas sur C mais sur un intervalle donné. Par exemple, si nous voulons résoudre l’équation x 2 = 4 sur R+ , nous indiquerons à MuPAD que notre x doit être positif :
(x>0); (x^24,x); On peut sinon utiliser les ensembles habituels avec les notations suivantes :
58
# '!(
N
NonNegInt
N∗
PosInt
−N∗
NegInt
Z
Integer
2Z
Even
2Z + 1
Odd
Q R
R
Real
R∗+ iR
Q
Rational
∗
∗+
PosRat
+
NonNegative
R∗−
Positive Imaginary
iZ
∗
Q
∗−
NegRat
Q
+
NonNegRat
∗
NonZero
Negative
C
IntImaginary
P
Ensembles de nombres et MuPAD
Prime
(x 2 --4 ): (x^2-40,x); Une autre ruse permet de selectionner les solutions : S : ((x*PI/7) 0, x); S / --0 (-22, 22) //
on
demande
des
solutions
dans
[ −22 ,22]
On peut résoudre également des systèmes linéaires :
(): ({x+2*y+a*z-1,a*x+y+z2,2*x+a*y-z3},{x,y,z}); Il existe des outils d’algèbre linéaire plus adaptés que nous verrons plus tard. On peut résoudre des inéquations
(x^2-2*x-4>2*x,x); des équations trigonométriques
((x)(x),x); À vous d’imaginer d’autres situations... Un « étudiant » taquin nous a par exemple proposé
((x)0*(x),x); Pour avoir une approximation de la solution, on utilise float et hold(solve)
( ( )(x+(x)+10)); ou numeric::solve(equation,inconnue)
-- (x+(x)+10,x); Au-delà, MuPAD semble jetter l’éponge :
( ( )(x+(x)+100)); puisque la réponse proposée est l’ensemble vide. Mais MuPAD utilise la méthode de Newton et a donc besoin d’une bonne approximation de départ :
-- (x+(x)+100,x1e-50 ( (-10)),9 3 ); indique à MuPAD de chercher une approximation de la solution dans [10−50 , e−10 ].
59
Polynômes
Logiciel(s) abordé(s) : Yacas Gp XCAS Maxima Scilab
Problématique : Manipuler les opérations élémentaires sur les polynômes, notamment la recherche de racines.
.
# $
Le logiciel Scilab peut traiter les polynômes. On peut définir la variable : x(0,’x’)
définir le polynôme x 2 + x + 1 : Px^2+x+1
et calculer ses racines :
(P) Le polynôme peut être construit avec ses coefficients Q([3 (Q)
2 1],’x’,’coeff’)
Il est à noter que si l’on ne précise pas le drapeau ’coeff’, le polynôme est défini par ses racines : R([3 (R)
2 1],’x’)
Le polynôme dérivé s’obtient comme suit :
(R) La matrice compagne du polynôme P est obtenue par : A
(P)
On peut retrouver le polynôme :
" #$
(x* ()-A) Les racines de P sont à comparer au spectre de la matrice compagnon (voir le chapitre 7.7) :
(A) Voici l’exemple d’une session Scilab qui cherche les racines de x 3 + x + 1 ; les commandes sont marquées (->) : Réponse du logiciel -->x=poly(0,’x’) x = x -->P=x^3+x+1 P = 3 1 + x + x -->roots(P) ans = ! - 0.6823278 ! ! 0.3411639 + 1.1615414i ! ! 0.3411639 - 1.1615414i ! -->
. # /+ Le logiciel Maxima traite les polynômes et les fractions rationnelles en général. Trouver les racines du polynôme P se fait comme suit : P(x):=x^2+2*x+3;
(P(x),x);
La dérivée est la dérivée formelle de toutes les fonctions :
(P(x),x); Voici l’exemple d’une session Maxima qui cherche les racines de x 3 + x + 1 ; les commandes sont marquées (Ci) et les réponses (Di) :
62
,& Réponse du logiciel (C1) P(x):=x^3+x+1; (D1) (C2) solve(P(x)=0,x);
3 P(x) := x + x + 1
SQRT(3) %I 1 ---------- - SQRT(31) 1 1/3 SQRT(3) %I 1 2 2 (D2) [x = (--------- - -) (- ---------- - -) - --------------------, 6 SQRT(3) 2 2 2 SQRT(31) 1 1/3 3 (--------- - -) 6 SQRT(3) 2 SQRT(3) %I 1 - ---------- - SQRT(31) 1 1/3 SQRT(3) %I 1 2 2 x = (--------- - -) (---------- - -) - --------------------, 6 SQRT(3) 2 2 2 SQRT(31) 1 1/3 3 (--------- - -) 6 SQRT(3) 2 SQRT(31) 1 1/3 1 x = (--------- - -) - --------------------] 6 SQRT(3) 2 SQRT(31) 1 1/3 3 (--------- - -) 6 SQRT(3) 2 (C3)
. # !"#$ Le logiciel XCAS traite les polynômes à plusieurs variables. On rentre le polynôme de manière symbolique : P(x):x^2+2*x+3
Trouver les racines du polynôme P se fait comme suit :
(P(x)) La dérivée est la dérivée formelle de toutes les fonctions :
(P(x),x) On peut obtenir un polynôme aléatoire de variable u, de degré inférieur ou égal à 6 et à coefficients entiers de valeur absolue strictement inférieure à 100.
(u,6) Voici l’exemple d’une session XCAS qui cherche les racines de x 3 + x + 1 ; les commandes sont séparées des réponses par des lignes de tirets :
63
" #$ Réponse du logiciel P(x):=x**3+x+1 -----------------------------------------// Parsing P // Success compiling P 3 x ->x +x+1 -----------------------------------------roots(P) -----------------------------------------Evaluation time: 0.17 3 Unable to isolate x in ([x])->x +x+1
XCAS ne trouve pas de solution exacte. Il peut toutefois trouver des approximations :
(P(x)) Réponse du logiciel
[−0.682328, 0.3411639019 + 1.1615414 ∗ i, 0.3411639019 − 1.1615414 ∗ i]
Pour un autre exemple d’activité sur les polynômes, voir aussi la section b. page 151.
. # % Le logiciel Gp traite les polynômes aussi avec des coefficients dans Z/pZ et dans les corps padiques. Trouver les racines du polynôme P se fait comme suit : P(x)x^2+2*x+3 (P(x))
La dérivée est la dérivée formelle de toutes les fonctions :
(P(x),x) Voici l’exemple d’une session Gp qui cherche les racines de x 3 + x + 1 :
64
,# .
Réponse du logiciel (21:15) gp > P(x)=x^3+x+1 (21:15) gp > polroots(P(x)) %2 = [-0.6823278038280193273694837397 + 0.E-28*I, 0.3411639019140096636847418698 - 1.161541399997251936087917687*I, 0.3411639019140096636847418698 + 1.161541399 997251936087917687*I]~ (21:15) gp >
., # 4
Le logiciel Yacas traite les polynômes comme les logiciels précédents. Trouver les racines du polynôme P se fait comme suit : Px^2+2*x+3 4 (P,x)
La dérivée est la dérivée formelle de toutes les fonctions :
/(x)
P
Voici l’exemple d’une session Yacas qui cherche les racines de x 3 + x + 1 : Réponse du logiciel In> Q:=x^3+x+1 Out> x^3+x+1; In> PSolve(Q,x) Out> {(Sqrt(31/108)-1/2)^(1/3)-(1/2+Sqrt(31/108))^(1/3),Complex((1/2+Sqrt(31/108)) ^(1/3)/2-(Sqrt(31/108)-1/2)^(1/3)/2,Sqrt(3/4)*(Sqrt(31/108)-1/2)^(1/3)+Sqrt(3/4)*( 1/2+Sqrt(31/108))^(1/3)),Complex((1/2+Sqrt(31/108))^(1/3)/2-(Sqrt(31/108)-1/2)^(1/ 3)/2,-(Sqrt(3/4)*(1/2+Sqrt(31/108))^(1/3)+Sqrt(3/4)*(Sqrt(31/108)-1/2)^(1/3)))}; In>
Les logiciels traités ici présentent de nombreuses fonctions arithmétiques sur les polynômes.
65
Fonctions Logiciel(s) abordé(s) : Bc Scilab Octave Yacas XCAS Gp Maxima
Notions informatiques : Définir une fonction. Utiliser une fonction.
Problématique : Les fonctions sont centrales dans l’utilisation des logiciels de calcul. Tous les logiciels n’ont pas les mêmes conventions pour définir une fonction mathématique, ni pour l’évaluer en un point. Les fonctions sont construites à partir d’opérations élémentaires et des fonctions classiques qui sont dans la bibliothèque du logiciel. Tous les logiciels n’ont pas la même bibliothèque : la fonction sécante qui est connue de Maxima et XCAS ne l’est pas pour Gp ; seul Maxima connaît la sécante hyperbolique. . .. La bibliothèque de Bc même avec l’option : est très réduite.
5
# %
Le logiciel Gp accepte les fonctions comme des expressions données par un égalité-définition. Pour définir la fonction machin, il suffit d’entrer l’instruction : machin(x)1/(x)
Pour calculer sa valeur en 2, on tape machin(2);
5 # /+ Le logiciel Maxima considère les égalités comme des quantités à évaluer ; une égalité-définition est indiquée par l’instruction -. machin(x):=1/(x);
L’évaluation demande forcément du travail, suivant le type de résultat que l’on désire. machin(2);
donne la valeur algébrique ;
% & (machin(2)); donne une valeur approchée et
(machin(2)); donne un résultat équivalent.
5 # !"#$
Le comportement de XCAS est sans surprise au vu de ce qui précède. machin(x):1/log(x)
définit une nouvelle fonction tout comme : machin:x->1/log(x)
machin(2)
donne sa valeur algébrique au point 2 et
(machin(2)) en donne l’approximation tout comme machin(2.0)
On peut transformer une expression en fonction avec
(expression,variable)
f:(x); f(2); f:(f,x); f(2);
On peut également définir la fonction dérivée d’une fonction : fp: fp(3)
68
(+2* );
/&
Fonction et expression Comme en mathématiques, il ne faut pas confondre fonction et expression. Par exemple,
attend comme argument une fonction et non pas une expression. Ainsi le code : fp:
((x)+2*x);
renvoie une erreur. Si l’on préfère travailler sur les expressions, alors mieux vaut utiliser
(expression,variable) : df(x): ((x)+2*x,x);
qui renvoie cos(x) + 2, puis : fp:(fp(x),x);
qui renvoie x → cos(x) + 2 ou plus directement : fp:( ((x)+2x),x)
qui renvoie x → cos(x) + 2. Voir aussi c. page 115.
( " / 3
Il existe depuis de nombreuses années des logiciels de géométrie dynamique qui sont utilisés au collège et au lycée. Cependant, n’étant voués qu’à dessiner ou éventuellement à donner quelques résultats numériques, leur utilisation est limitée et leur syntaxe, par souci d’ergonomie informatique, éloigne les élèves du problème mathématique. XCAS cependant, par sa puissance et sa souplesse, permet de « coller » au cours de mathématiques tout en permettant d’obtenir des résultats performants. Considérons par exemple le problème classique suivant donné en classe de Seconde : On considère un triangle ABC rectangle en A tel que AC = 3 et AB = 4. Soit M un point quelconque du segment [AC]. On construit le rectangle AMNP tel que N appartienne à [BC] et P à [AB]. Étudiez l’aire du rectangle AMNP en fonction de la position de M. Commençons par ouvrir une fenêtre de géométrie en tapant simultanément sur et puis définissons les points A et B dans un repère judicieusement choisi : A: (0,0) B: (0,-4) libre
pour
// // y
plaçons plaçons
tracer
la
A B
tel
courbe
que à
AB la
4 fin
en de
laissant la
le
1 er
quadrant
séance
69
% & Définissons ensuite le point C tel que le triangle ABC soit direct, rectangle en A et que l’on ait AC = 34 AB à l’aide de la commande :
(A,B,3/4,C) Créons maintenant un réel quelconque de [0; 3] que l’on pourra faire varier à la souris à l’aide de la commande : t:
(0
3)
Définissons maintenant le point M. Nous qui sommes à moitié mathématiciens, nous savons que nous allons créer en fait une fonction de [0; 3] dans le plan P qui à un réel x de l’intervalle [0 ; 3] associe le point du plan de coordonnées (0 ; x). Pour les élèves, la notation : M(x): (x,0)
est naturelle et rappelle que le point M dépend de la donnée de son abscisse x. Pour définir N, commençons par définir la perpendiculaire en M à la droite (AC). La syntaxe est tout à fait naturelle grâce à (Point,Droite). N’oublions pas qu’en fait d est une fonction de x : d(x): (M(x), (A,C))
Définissons ensuite N comme l’intersection de d et (BC) grâce à N(x):
:
(d(x), (B,C))
Pour obtenir P, nous commençons par définir la parallèle à (AC) passant par N (qui est bien sûr une fonction de x) à l’aide de (Point,Droite) : D(x): (N(x), (A,C));
puis l’intersection de D et (AB) : P(x):
(D(x), (A,B))
Il ne reste plus qu’à définir le rectangle APNM grâce à la commande : R(x): (A,P(x),N(x),M(x))
et à dessiner le rectangle dépendant du paramètre t :
(R(t),, + ) En faisant varier t à la souris, le rectangle « bouge ». Définissons maintenant la fonction qui à x associe l’aire du rectangle : f(x): (R(x))
Donnons son expression simplifiée :
(f(x)) 70
/& Réponse du logiciel
4 3
− x2 + 4x
Définissons le point X de la courbe représentative de f d’abscisse t : X: (t,f(t))
Traçons enfin la courbe représentative de f à l’aide de la fonction :
(f(x),x03, ) Voici une visualisation statique :
Le rectangle et la courbe représentative de f Pour une autre activité géométrique de Seconde, voir section b. page 95.
71
% &
assume ou element ?
Il aurait peut-être été plus simple pour des élèves de faire la construction en la voyant pas à pas tout en gardant une valeur formelle pour les expressions en utilisant au lieu de . Il suffit, dans le code précédent, de remplacer : t:
(03)
par :
(t[1,0,3]) où 1 représente une valeur arbitraire modifiable à la souris. On ôte ensuite toute référence à la variable formelle x qui devient inutile puisque t garde un rôle formel. Par exemple, le code contient : M: (t,0) d: (M, (A,C))
5 # 1 Dans la calculette en mode texte appelée par l’instruction définie comme suit :
:, la nouvelle fonction est
machin(x){ 1/(x)}
L’évaluation se fait naturellement. machin(2)
5, # $
Dans le logiciel de calcul matriciel Scilab, la définition d’une fonction est plus délicate.
ymachin(x) y1/(x)
L’évaluation se fait naturellement en un point.
72
/, .
machin(2)
L’évaluation en rafale qui est possible avec Scilab requiert un peu d’attention. En utilisant ce qui précède, t2:9 machin(t)
ne donne pas le résultat voulu. Les opérations élémentaires peuvent être forcées à la place des opérations matricielles en les précédant d’un point : ; à la place de ;. L’exponentielle matricielle et l’exponentielle coefficient par coefficient sont distinctes. Pour poursuivre l’exemple, il faut alors définir la fonction en utilisant la division ponctuelle : attention à l’espace derrière le nombre 1 !
ymachin(x) y1 ./(x)
t2:9 machin(t)
On a le bon résultat, ce qui permet de tracer un graphe directement :
(t,machin(t)) Le nombre de points d’évaluation est volontairement limité. L’évaluation marche avec des matrices quelconques : v1:5 uv’*t machin(u)
5. # 4
Le logiciel Yacas définit les fonctions de manière similaire aux autres logiciels de calcul formel. machin(x):1/)(x)
Pour calculer sa valeur en 2, on tape : machin(2)
Pour obtenir une valeur approchée, il suffit de le réclamer pour le résultat précédent.
((%) 73
% &
55 # Le logiciel Octave traite les matrices. Pour définir des fonctions, la procédure ressemble à celle de Scilab.
ymachin(x) y1 ./(x) ;
machin(2) t[2;3] machin(t)
Le point-virgule est nécessaire dans le corps de la définition de la fonction, car sinon la machine retournerait deux fois l’évaluation.
74
Algèbre linéaire Logiciel(s) abordé(s) : Scilab Octave Maxima XCAS
Notions informatiques : Les logiciels Scilab et Octave sont avant tout destinés au calcul matriciel. Maxima peut faire des calculs sur les matrices, XCAS est destiné à tout calcul...
Problématique : Calculer avec des matrices.
6
# $
Construisons un vecteur colonne u et un vecteur ligne v : u[2;3;5] v[7 11 13]
Le produit scalaire t et la matrice A de rang un associée s’obtiennent par multiplication : tv*u Au*v
On obtient les dimensions et le rang directement
" (u) " (A) (A) Le logiciel Scilab présente une sorte de produit tensoriel ; u .*. A
La norme d’un vecteur est par défaut la norme euclidienne (v). On peut réclamer la norme Lp : (v,p) ou L∞ : (v,’inf’). Pour les matrices, ces instructions donnent les normes linéaires associées aux normes Lp sur les vecteurs, au sens des applications linéaires : la norme de A est le maximum des normes de Av pour v parcourant la boule unité. L’instruction (A) donne la norme spectrale, c’est-à-dire le maximum des modules des valeurs propres.
' La norme sur les matrices donnée par la formule par l’instruction (A,’fro’).
tr t A ∗ A , souvent utilisée, est obtenue
5 ) * + )"
On se donne un système de trois équations à trois inconnues dont les données sont aléatoires. A (3,3) B (3,1) V(A)*B
On vérifie que le vecteur AV − B a des coordonnées proches de la précision de la machine. A*V-B
On se place maintenant dans un cas dégénéré : on cherche l’espace propre associé à la valeur propre −1. A[0 1 0;1 0 1;1 1 0] R ((A,’t’)) BA-R(2)* (3,3)
L’espace propre est engendré par la famille V ici réduite à un vecteur. Z" (3,1) [U,V] (B,Z)
Ce cas particulier se résout aussi par l’instruction V (B)
5 ) !
Pour obtenir les vecteurs propres v p et la matrice diagonalisée D correspondant à la matrice A, il suffit de taper : [vp,D] (A)
On vérifie en tapant A*vp(:,1)/D(1,1) A*vp/D
La décomposition de Schur donne les valeurs propres sur la diagonale de la matrice triangulaire T. [U,T](A)
76
0
6 # La syntaxe de base d’Octave est commune avec Scilab. Les instructions ci-dessous sont encore valables. u[2;3;5] v[7 11 13] tv*u Au*v " (u) " (A) (A)
Les instructions ci-dessous donnent aussi des résultats similaires. A (3,3) B (3,1) V(A)*B A*V-B
L’instruction (A) donne les coefficients du polynôme caractéristique de A. On peut calculer le pseudo-inverse de la matrice dégénérée. p(A) R (p) BA-R(2)* (3,3) c(B) c*B B*c
La décomposition de Schur est la même que pour Scilab : [U,T](A)
6 # /+ On définit une matrice avec (%i1)
:
([1,2],[3,4]);
On calcule son déterminant : (%i2)
(%i1);
Elle est donc inversible. On demande son inverse : (%i3)
(%i1);
Calculons le produit pour vérifier. On utilise le produit non commutatif symbolisé par ·, un point : (%i4) )%i1%o3;
77
' et on obtient bien l’identité. Les valeurs propres s’obtiennent avec : (%i5)
(%i1);
On vérifie qu’il s’agit bien des solutions du polynôme caractéristique donné par : (%i6)
((%i1,x)=0,x);
On calcule la puissance quatrième. On utilise << : (%i7) (%i1)^^4;
6 # !"#$7
6
Qu’est-ce que l’endomorphisme de R2 d’expression analytique canonique ⎧ ⎪ ⎨ x
=
⎪ ⎩ y
=
1 2 − x− y 5 5 3 6 x+ y 5 5
On détermine la matrice associée : A:[[-1/5,-2/5],[3/5,6/5]] Réponse du logiciel
−1 5 3 5
−2 5 6 5
On définit donc la matrice en donnant les vecteurs-ligne. Calculons son carré : A^2
On retrouve A; il s’agit donc de la matrice d’un projecteur déterminée par son noyau :
(A) Réponse du logiciel [[2,-1]]
c’est-à-dire Vect (2 ; −1) , et son image :
78
0 1 ! 2 )
2
(A) Réponse du logiciel [[-1,3]]
Déterminons les puissances entières de B =
1
a
0
1
B:[[1,a],[0,1]]
Calculons jusqu’à la puissance cinquième :
(B^2); (B^3); (B^4); (B^5) Réponse du logiciel
1
2a
0
1
,
1
3a
0
1
,
1
4a
0
1
,
1
5a
0
1
7
⎞
⎛ 1
0
⎜ Soit A = ⎜ ⎝1
a
a
0
a
⎟ −1⎟ ⎠. Pour quelles valeurs de a, la matrice A est-elle inversible ? 1
A:[[1,0,a],[1,a,-1],[a,0,1]]
On cherche les valeurs de a qui annulent le déterminant :
(
(A)0,a); Réponse du logiciel [-1,0,1]
Il y en a trois. On peut ensuite déterminer l’inverse de cette matrice :
(A) 79
' Réponse du logiciel
⎡ ⎢ ⎢ ⎢ ⎢ ⎣
a −((a)3 )+a −a−1 −((a)3 )+a −((a)2 ) −((a)3 )+a
⎤
−((a)2 ) −((a)3 )+a a+1 −((a)3 )+a a −((a)3 )+a
0 −((a)2 )+1 −((a)3 )+a
0
⎥ ⎥ ⎥ ⎥ ⎦
) ) ! #
&8
Créons une matrice : M:[[1,0,1],[0,1,1],[1,1,0]] Réponse du logiciel
⎤
⎡ 1
⎢ ⎢ 0 ⎣
0
1
1
⎥ 1 ⎥ ⎦
1
1
0
Complétons-la par la matrice identité de même taille. Profitons-en pour créer une petite procédure avec la commande (M1,M2) qui place la matrice M2 « au bout » de la matrice M1 si elles ont le même nombre de lignes : GJ(A):{ n:(A); / / o n c o m p t e Id: (n); / / o n c r é e l a (A,Id) / / o n l a m e t }:;
le
nombre
matrice au
de
colonnes
identité
de
bout
Ainsi : T:GJ(M) Réponse du logiciel
⎤
⎡ 1
80
⎢ ⎢ 0 ⎣
0
1
1
0
0
1
1
0
1
⎥ 0 ⎥ ⎦
1
1
0
0
0
1
de
a
taille
correspondant
0 1 ! 2 )
2 Pour effectuer une combinaison linéaire des lignes, on peut utiliser 9.
(k,M,i,j) qui renvoie la matrice construite à partir de M en remplaçant la ligne L j par L j + k × Li . N’oubliez pas que XCAS commence à compter à partir de 0 : T:
9.
(-1,T,0,2) Réponse du logiciel
⎤
⎡ 1
⎢ ⎢ 0 ⎣
0
1
1
0
0
1
1
0
1
⎥ 0 ⎥ ⎦
0
1
−1
−1
0
1
On effectue L3 ← L3 − L2 : T:
9.
(-1,T,1,2) Réponse du logiciel
⎤
⎡ 1
⎢ ⎢ 0 ⎣
0
1
1
0
1
1
0
1
0
0
−2
−1
−1
On multiplie L3 par − 12 avec T:
0
⎥ 0 ⎥ ⎦ 1
=2=,(q)ui remplace L j par k × L j :
9(-1/2,T,2) Réponse du logiciel
⎡
⎤ 1
⎢ ⎢ 0 ⎣
0
1
1
0
0
1
1
0
1
⎥ 0 ⎥ ⎦
0
0
1
1 2
1 2
−1 2
On effectue L1 ← L1 − L3 : T:
9.
(-1,T,2,0) 81
' Réponse du logiciel
⎡
⎤
⎢ ⎢ 0 ⎣
0
0
1 2
−1 2
1
1
0
1
⎥ 0 ⎥ ⎦
0
0
1
1 2
1 2
−1 2
1
1 2
et enfin L2 ← L2 − L3 : T:
9.
(-1,T,2,1) Réponse du logiciel
⎡ 1
⎢ ⎢ 0 ⎣
0
0
1
0
0
0
1
−1 2 1 2 1 2
1 2 −1 2 1 2
1 2 1 2 −1 2
⎤ ⎥ ⎥ ⎦
Il ne reste plus qu’à extraire la matrice de droite avec une petite procédure maison : JG(A):{ p:(A); A[0p-1,p2*p-1]
//
on
extrait
les
lignes
0
p −1
}:;
Ici : MM:JG(T) Réponse du logiciel
⎡ ⎢ ⎢ ⎣
1 2 −1 2 1 2
−1 2 1 2 1 2
1 2 1 2 −1 2
⎤ ⎥ ⎥ ⎦
et on a bien le produit des deux matrices : MM*M
82
à p −1
et
les
colonnes
p
à
2
0 1 ! 2 )
2
qui vaut : Réponse du logiciel
⎤
⎡ 1
⎢ ⎢ 0 ⎣
0
0
1
⎥ 0 ⎥ ⎦
0
0
1
Bien sûr, on aurait pu obtenir la matrice directement avec d’une matrice :
(Matrice) qui donne l’inverse
(M) Mais cette session peut être l’occasion de montrer le mécanisme de calcul à des étudiants.
! 0 9
Nous ne rentrerons pas dans les détails probabilistes. Les chaînes de Markov sont issues de la théorie des probabilités et utilisent des outils d’algèbre linéaire qui nous intéressent ici. Elles permettent de simuler des phénomènes aléatoires qui évoluent au cours du temps. Nous allons les découvrir à travers l’étude d’un exemple simple. Zlot, Brzxxz et Morzgniouf sont trois villes situées respectivement en Syldavie, Bordurie et Bouzoukstan. Des trafiquants de photos dédicacées du groupe ABBA prennent leur marchandise le matin dans n’importe laquelle de ces villes pour l’apporter le soir dans n’importe quelle autre. On notera pour simplifier V1 , V2 et V3 ces villes et p i j la probabilité qu’une marchandise prise le matin dans la ville Vi soit rendue le soir dans la ville V j . La matrice (p i j )16i 6316 j 63 est appelée matrice de transition de la chaîne de Markov. Supposons que P soit connue et vaille ⎞ ⎛ 0, 8 0, 3 0, 2 ⎟ ⎜ ⎟ P=⎜ ⎝0, 1 0, 2 0, 6⎠ 0, 1
0, 5
0, 2
Donnons l’information à XCAS : P:[[.8,.3,.2],[.1,.2,.6],[.1,.5,.2]]
Vérifions au passage que la somme des éléments de chaque colonne vaut bien 1. On utilise :
(P) Réponse du logiciel
[1.0,1.0,1.0]
83
' Les trafiquants se promenant de ville en ville, il peut être utile de visualiser leurs déplacements par le diagramme de transition suivant 0,8 V1
0,2
0,1 0,1
0,3
0,5 V3
V2 0,2
0,6
0,2
On notera xi(k) la proportion de trafiquants qui se trouvent au matin du jour k dans la ville Vi . En probabilités, on appelle vecteur d’état tout élément (x1 , · · · , xn ) de R+n tel que x1 +· · ·+xn = 1. Ainsi, x (k) = x1(k) , x2(k) , x3(k) est un vecteur d’état. On montre que les vecteurs d’état de la chaîne sont liés par la relation x (k) = P · x (k−1) et donc x (k) = Pk · x (0) Supposons que le chef de la mafia locale dispose de 1000 trafiquants qui partent tous le matin du jour 0 de la ville de Zlot. X:[[1000],[0],[0]]
Quelle sera la proportion de trafiquants dans chacune des villes au bout d’une semaine ? P^7*X Réponse du logiciel
⎤
⎡ 563.887400
⎥ ⎢ ⎢ 226.069100 ⎥ ⎦ ⎣ 210.043500
Le parrain voudrait que la proportion moyenne de trafiquants soit stable d’un jour sur l’autre. Il recherche donc les vecteurs d’état x vérifiant l’équation P · x = x.
84
0 1 ! 2 )
2
On recherche donc le sous-espace propre associé à la valeur propre 1. Il faudrait d’abord vérifier que 1 est bien une valeur propre :
(P) Réponse du logiciel 1.0,0.5472135955,-0.3472135955
On aurait pu chercher les racines du polynôme caractéristique. Comme renvoie les coefficients du polynôme caractéristique, on utilise ' (liste,variable) qui renvoie le polynôme sous forme symbolique :
(' ((P),x)0,x) On demande maintenant de donner une base du sous-espace propre associé. On utilise qui donne une matrice de passage de vecteurs propres quand la matrice est diagonalisable :
(P) Réponse du logiciel
⎡ 0.340000
⎢ ⎢ 0.140000 ⎣ 0.130000
−0.179443 0.094721 0.084721
−0.000557
⎤
⎥ 0.005279 ⎥ ⎦
−0.004721
L’ordre correspond aux valeurs données par . Pour le vérifier, extrayons le premier vecteur colonne avec (matrice,numéro de colonne) : v:( (P),0) P*v
et on retrouve v. On aurait pu trouver ce vecteur autrement en cherchant le noyau de P − Id à l’aide de la commande : w: (P- (3)) Réponse du logiciel [[-2.615384615,-1.076923077,-1]]
On regarde les doubles crochets : il s’agit donc d’une liste de liste. Il vaut donc mieux définir le vecteur comme étant le premier élément de cette liste : w: (P- (3))[0]
85
' Réponse du logiciel [-2.615384615,-1.076923077,-1]
C’est bien un vecteur cette fois. On peut le rendre unitaire puisqu’il s’agit d’un vecteur d’état avec :
(w) Réponse du logiciel [-0.8717948718,-0.358974359,-0.3333333333]
Avons-nous défini le même espace vectoriel ? Plusieurs méthodes s’offrent à nous. On peut par exemple déterminer le sous-espace engendré par ces deux vecteurs avec et voir quelle est sa dimension :
([v,w]) Réponse du logiciel [[-2.615384615,-1.076923077,-1]]
Un seul vecteur : v et w sont donc bien liés. On aurait pu tout simplement normaliser v :
(v) Réponse du logiciel [0.8717948718,0.358974359,0.3333333333]
et la colinéarité saute aux yeux. Pour une étude sur la réduction de formes quadratiques et la recherche de valeurs propres, voir la section b. page 208.
!: ;
Nous ne sommes pas obligés de travailler avec des matrices à coefficients dans R. Survolons par exemple le chiffrement de Hilla . a D AL ANG , Robert C./C HAABOUNI , Amel Algèbre linéaire . Lausanne: Presses polytechniques et universitaires ro-
mandes, 2001.
86
0 1 ! 2 )
2
On considère les 26 lettres de l’alphabet plus un espace caractérisé par @. On voudrait coder chaque caractère par un nombre, en commençant par 0 pour @, puis 1 pour A, 2 pour B, etc. en finissant par 26 pour Z. La commande nous permet d’obtenir le code ASCII d’un caractèreb . Le problème, c’est que A est associé à 65. Nous allons donc « décaler » les codes ASCII pour notre usage : code(c):(x->(x-64),(c))
On soustrait 64 à chaque élément de la liste c. Pour effectuer l’opération inverse, on utilise qui renvoie le caractère correspondant au code ASCII : decode(L):((x->x+64,L))
//
on
rajoute
64
cette
fois −ci
On va chiffrer un message à l’aide d’un 3-chiffrement de Hill le message suivant : Je ne suis pas un numéro, je suis un homme libre ! Nous allons commencer par mettre toutes les lettres en majuscules et enlever les signes de ponctuations. On peut ensuite associer au message une liste de nombres : L:code("JE>NE>SUIS>PAS>UN>NUMERO>JE>SUIS>UN>HOMME>LIBRE")
On va ensuite regrouper les nombres 3 par 3 en colonnes et travailler dans Z/27Z. On utilise ' (Liste,nb de colonnes) qui transforme une liste en une matrice ayant un certain nombre de colonnes. On transpose ensuite cette matrice : clair: ( '
(L,3))%27
On choisit une clé constituée d’une matrice carrée de taille 3 à coefficients dans Z/27Z et inversible : A:[[1,22,25],[0,25,1],[25,3,1]]%27 Réponse du logiciel
⎡ 1%27
⎢ ⎢ 0%27 ⎣ −2%27
−5%27 −2%27 3%27
−2%27
⎤
⎥ 1%27 ⎥ ⎦
1%27
Calculons son déterminant :
(A) b Cf section e. page 33.
87
' Réponse du logiciel 13 % 27
Cette matrice est bien inversible puisque 13 est premier avec 27. On peut donc calculer son inverse :
(A) Réponse du logiciel
⎡ 10%27
−9%27
⎤
⎢ ⎢ 4%27 ⎣
2%27 6%27
⎥ 2%27 ⎥ ⎦
8%27
13%27
4%27
Codons le message clair en multipliant la matrice par A puis en transformant la transposée de la matrice en liste : cryptemod:
' ( (A*clair))
Le problème, c’est que XCAS utilise les restes symétriques. Nous allons donc ruser en utilisant %0 qui permet d’obtenir le nombre entier associé à la classe modulo 27 puis qui donne le reste de la division euclidienne : crypte:(x-> (x%0,27),cryptemod)
Il ne reste plus qu’à associer ces nombres à des lettres : message:decode(crypte) Réponse du logiciel LQVPQNDUGNPENPAEZ@RYUTFEULHYJXVPLEZ@OJOOQPQKETQF
( On crée une liste avec message : Lb:code(message)
On crée la matrice à 3 lignes associée : brouille: ( '
(Lb,3))%27
On utilise l’inverse de la clé pour décoder : clarifie:A^(-1)*brouille
88
0 1 ! 2 )
2
On transforme en liste : decryptemod:
' ( (clarifie))
On retourne dans N : decrypte:(x-> (x%0,27),decryptemod)
On transforme les nombres en lettres : messageinit:decode(brouille) Réponse du logiciel JE@NE@SUIS@PAS@UN@NUMERO@JE@SUIS@UN@HOMME@LIBRE@
Un espace s’est ajouté au bout pour obtenir un nombre de caractères multiple de 3. Pour une activité plus sophistiquée sur le codage, voir section 7.2 page 247.
89
Géométrie affine Logiciel(s) abordé(s) : Scilab XCAS
Problématique : Manipuler des objets élémentaires de géométrie affine.
8
# $
Utilisons le calcul matriciel dans le logiciel Scilab.
"
On cherche la pente a et l’ordonnée à l’origine b d’une droite passant par deux points A et B. A[1;0];B[-1;2] x[A(1) B(1)] y[A(2) B(2)] [a,b] (x,y)
" )
On cherche une équation du plan passant par les points A, B, C sous la forme z = a1 x +a2 y +b. La matrice U contient les abscisses et ordonnées, la matrice V contient les cotes. A[1;0;2];B[-1;2;3];C[4;5;6] U[A(1:2) B(1:2) C(1:2)] V[A( ) B( ) C( )] [a,b] (U,V)
On vérifie en tapant : a*U+b
qui donne V.
8 # !"#$ Les fonctions de géométrie affines sont... innombrables, et l’aide est exhaustive.
) * + Vous pouvez par exemple tracer une droite de différentes manières. On ouvre une session 2D en tapant :
(2*x+5*y-10) / / à p a r t i r
( (1,2), (-3,1)) les
d ’ une //
équation
passant
par
cartésienne deux
points
dont
on
connaît
coordonnées
(1+,-3+) / / p a s s a n t p a r d e u x p o i n t s d o n t o n c o n n a î t
([5+t,-2+2*t],t) / / p a s s a n t p a r l e p o i n t ( 5 , − 2 ) e t d e directeur
les
affixes
vecteur
(1 ,2)
et dans l’espace affine de dimension 3, on ouvre une session 3D en tapant
:
([1,2,3],[-1,2,0]) / / o n c o n n a î t d e u x p o i n t s
(x+y+z0,x2*y) / / i n t e r s e c t i o n d e d e u x p l a n s
([1+2*t,-1+t,-3+5*t],t) / / r e p r é s e n t a t i o n p a r a m é t r i q u e
"
( Étudions par exemple la symétrie orthogonale d’axe la droite d’équation y = x : d: (yx) / / o n t r a c e l a M: (4,2) / / o n t r a c e u n m: (d,M) / / o n t r a c e
droite point son
quelconque
symétrique
Déplacement d’un point à la souris Notons que l’on peut faire bouger M « à la souris » en se plaçant en mode Pointeur. On place le pointeur de la souris devant le point M : un symbole apparaît. Faites un clic droit en maintenant enfoncé et déplacez à volonté le point M.
P: (1,-3) / / u n a u t r e p o i n t p: (d,P) / / e t s o n i m a g e
(d, (m,M)) / /
la
droite
? XCAS r é p o n d 1 p o u r oui et 0 non
( (m,M), (p,P)) elles parallèles ?
(m,P) / / o n t r a c e l a d r o i t e ( mP )
(M,p) / / e t l a d r o i t e ( Mp )
( mM )
est − e l l e
orthogonale
à
l ’
axe
92
//
les
droites
( mM )
et
( pP )
sont −
3 est_faisceau_droite( (m,P), (M,p),d) elles
?
concourantes
//
( mP ) ,
( Mp )
et
(d)
sont −
(M,P)- (m,p) / / l e s d i s t a n c e s s o n t − e l l e s c o n s e r v é e s ? R: (3,-6);r: (d,R) / / u n 3 e m e p o i n t e t s o n i m a g e (M,P,R) / / u n e m e s u r e e n r a d i a n d e l ’ a n g l e ( MP , MR ) (m,p,r) / / u n e m e s u r e d e s o n i m a g e : l e s a n g l e s s e m b l e n t d e m e s u r e opposées
A: ( (P,R)) / / A a: (d,A) / / s o n i m a g e
(a, (r,p)) / / sont
est
a
un
élément
quelconque
appartient − i l
à
[ pr ]
de
?
[ PR ]
Les
barycentres
conservés .
( (M,P)) / / l ’ é q u a t i o n r é d u i t e
( (m,p)) / / l ’ é q u a t i o n r é d u i t e ( ( ( (M,P)),x)) / / dans
l ’ équation
inversés
par
la
de
( MP )
:
les
rôles
de
de
( MP )
de
( mp )
on x
exprime et
de
y
x
en
ont
fonction
donc
de
y
été
réflexion .
Pour explorer d’autres possibilités, voir la section 5.5 page 215 sur les tangentes à une ellipse et le thème sur le théorème de Pappus page189.
( , On ouvre une fenêtre 3D en tapant
. On peut par exemple étudier un cube :
P: ([2,2,-2]) / / u n p o i n t P cube(P,4) / / u n c u b e d ’ a r ê t e 4 d e s o m m e t P M: ( (F,G)) / / M u n é l é m e n t q u e l c o n q u e d e [ FG ] I: ( (H,F)) J: ( (F,C)) s1: (G,E) s2: (G,B) s3: (H,M) s4: (C,M) N:( (s1,s3))[0] / / N e s t l ’ i n t e r s e c t i o n d e [ GE ] e t [ HM ] R: (s2,s4)[0] ( (N,R), +line_width_2) / / o n t r a c e [ NR ] ( (E,B), +line_width_2)
( (I,J), (N,R)) / / l e s d r o i t e s ( I J ) −elles
parallèles
?
( (E,B,G),+ )
//
on
colorie
le
plan
et
( NR )
sont
( EB G )
et on obtient :
93
) * +
Parallélisme dans un cube Pour faire du calcul formel, on prend une longueur d’arête quelconque. On crée un cube ABCDEFGH d’arête a :
(a>0) / / o n s ’ a s s u r e q u e a e s t p o s i t i f P: ((E+G)/2) / / u n e a u t r e m a n i è r e d e d é f i n i r Q: ((F+C)/2) M: ((P+Q)/2) ( (E,P)) / / o n d e m a n d e l a l o n g u e u r Réponse du logiciel
1 2a 2
On peut demander d’autres longueurs :
( (A,P)) ( (A,G)) Réponse du logiciel
1 sqrt(6)a a 3 2
Pour obtenir la figure, on fixe une valeur pour a :
94
le
EP
milieu
de
[ EG ]
3
Cube obtenu avec a=5 Pour étudier des sections planes de surfaces avec XCAS, voir section 5.7 page 220.
. <
Voici par exemple une petite activité : OAB est un triangle isocèle en O avec OA = 6 cm, OB = 6 cm. On place M sur [OA] et on note x = OM. On place N sur [OB] tel que BN = OM. Quand le point M varie sur [OA], le triangle OMN varie. On souhaite étudier l’aire du triangle OMN en fonction de x. On ouvre une fenêtre graphique en tapant
+
:
O: (0,0) / / o n p l a c e l e p o i n t d e c o o r d o n n é e s ( 0 , 0 ) A: (6,0) B: (0,-6) (A,B) / / t r a c e l e s e g m e n t ( A , B ) a: (0 6) / / c h o i s i t u n é l é m e n t q u e l c o n q u e e n t r e 0 e t 6 M: (a,0) N: (0,-6+a) (M,N) ( (O,M,N), + ) / / o n c o l o r i e l e t r i a n g l e e n v e r t f:x-> ( ( (0), (0,-6+x), (x,0))) / / o n d é f i n i t l a fonction
" aire "
P: (a,f(a)) / / o n p r e n d l e p o i n t d e l a c o u r b e y f ( x ) d
(P) / / o n d e m a n d e l e s c o o r d o n n é e s d e P (f(x),x06, ) / / o n t r a c e l a c o u r b e y f ( x ) f(x) / / o n d e m a n d e l a f o r m u l e d o n n a n t l ’ a i r e e n f o n c t i o n d e
’ abscisse
a
x
Voici la sortie graphique :
95
) * +
Aire maximale d’un triangle Pour une autre activité géométrique de Seconde, voir section b. page 69.
8 # Voici par exemple comment tracer une surface avec des lignes de niveauxa # −−−−−−−−−−−−−−−−−−−−−
définition
# −−−−−−−−−−−−−−−−−−−−−
Lignes
f(x,y)x*x+y*y
de
de
la
niveau
xval2 dx0.1 lignex(x,y) (x> xval-dx && x<xval # −−−−−−−−−−−−−−−−−−−−−
Lignes
de
?
# −−−−−−−−−−−−−−−−−−−
#
les
: dé / comme nt er
lignes
levels #
si 10 ,
de
0
de
?
niveaux
xval
f(x,y):1/0) y
yval
f(x,y):1/0) z
zval
%4.3g’
’z
ATTENTION enlever
lignes
x
niveau
yval3 dy0.1 ligney(x,y) (y> yval-dy && y<yval
zval30
fonction
à
on
de
les
deux
lignes
suivantes
pour
afficher /
niveaux
discrete zval veut
des
lignes
de
niveaux
régulières
:
de
10
en
100
a Merci à Denis L E F UR. Retrouvez sur http://mathsp.tuxfamily.org/spip.php?rubrique39 d’autres conseils
concernant GnuPlot.
96
3& * !
# set
cntrparam
levels
# −−−−−−−−−−−−−−−−−−−−−
xmin-5 xmax5
incr
0 ,10 ,100
Borne
de
x
et
y
[xmin:xmax] ymin-7 ymax7 [ymin:ymax] # −−−−−−−−−−−−−−−−−−−−
zmin0 zmax100 # set
Borne
de
z
z r a n g e [ zmin : zmax ]
# −−−−−−−−−−−−−−−−−−−−−−−− −−−− −−− −−
nx50 ny50
définition
du
maillage
définition
de
la
nx,ny
# −−−−−−−−−−−−−−−−−−−−−−−− −−−− −−− −−
1 1 " coefx,coefy
taille
du
graphique
coefx coefy
# −−−−−−−−−−−−−−−−−−−−−−−− −−−− −−−−
"
# −−−−−−−−−−−−−−−−−−−−−−−− −−−− −−−−
des
axes
Angle
de
vie
39,16
# −−−−−−−−−−−−−−−−−−−−−−−− −−−− −−−− # set
Graduation
1 1 10
title
"
" Exemple
de
Définition
des
labels
surface "
"x" "y" "z"
# −−−−−−−−−−−−−−−−−−−−−−−− −−−− −−−−
Gestion
des
parties
cachées ,
des
couleurs # set
hidden3d
# set
nosurface
# set
p m3d
# set
palette
gray
97
) * + # −−−−−−−−−−−−−−−−−−−−−−−−− −−− −−−
Affichage
de
la
légende
’P( %0.3g’,xval, ’ ; %0.3g’,yval,’ ; %0.3g’,f(xval,yval)," )" at screen 0.85,0.20 ’ligne x %2.3g’,xval tc lt 1 at screen 0.85,0.15 ’ligne y %2.3g’,yval tc lt 4 at screen 0.85,0.10 ’ligne z %2.3g’,zval tc lt 3 at screen 0.85,0.05 "P" at xval,yval,f(xval,yval)+5 font " ,24" front
# −−−−−−−−−−−−−−−−−−−−−−−−− −−−− −
Affichage
du
graphique
f(x,y) lines lt 2 notitle,lignex(x,y) ligney(x,y) lines lt 4 notitle
lines lt 1 notitle,
# splot
f (x , y)
with
lines
lt
2
# splot
f (x , y)
with
lines
lt
2 , lignex (x , y)
with
lines
lt
1
# splot
f (x , y)
with
lines
lt
2 , ligney (x , y)
with
lines
lt
14
ce qui donne :
Pour une étude similaire avec le logiciel Scilab, voir la section 11.4 page 119
98
Statistiques Logiciel(s) abordé(s) : XCAS, Scilab
Notions informatiques : Où on apprend qu’il est plus efficace d’étudier statistiques et probabilités sans tableur. On profite des capacités de Scilab pour obtenir de belles sorties graphiques.
Problématique : On simule des expériences aléatoires. On profite des capacités de
9
0 +
- . / Cosme II de Médicis (Florence 1590-1621), Duc de Toscane, fut le protecteur de l’illustre Gallilée (né à Pise le 15 février 1564 et mort à Florence le 8 janvier 1642), son ancien précepteur. Profitant d’un moment de répit du savant entre l’écriture d’un théorème sur la chute des corps et la création de la lunette astronomique, le Grand Duc lui soumet le problème suivant : il a observé qu’en lançant trois dés cubiques et en faisant la somme des numéros des faces, on obtient plus souvent 10 que 9, alors qu’il y a autant de façons d’obtenir 9 que 10, à savoir six. Après quelques réflexions, Galilée rédigea un petit mémoire sur les jeux de hasard en 1620 expliquant le phénomène.
0 ,1 N’ayant pas la même expérience du jeu que le bon Cosme, nous allons utiliser XCAS pour simuler un grand nombre de parties et étudier statistiquement les résultats obtenus. 1. Nous utiliserons en premier lieu
(n) qui renvoie un entier appartenant à [0 ; n[.
Comment utiliser cette commande pour obtenir le résultat du lancer d’un dé ?
(6)+1
2 0 2. Plutôt que d’appuyer 100000 fois sur la touche , nous allons utiliser une commande plus pratique, (1,nombre d’expériences,’expérience’) qui renvoie une liste de nombre d’expériences résultats de l’expérience. Par exemple (1,10000,’rand(3)’) renverra 10000 nombres entiers égaux à 0, 1 ou 2. 3. On utilisera également la liste liste.
(n,liste) qui compte le nombre d’apparitions de n dans
(liste). 5. Pour visualiser les résultats à l’aide d’une boîte à moustache, on utilise (liste). 4. Pour calculer une moyenne, on forme une liste et on utilise Réponse du logiciel "Sur 10000000 essais, la fréquence de sortie de 9 est de 11.25786%, et celle de 10 est de 12.53457%" Evaluation time: 147.46
Comparaison du nombre de sorties du 9 et du 10
0 3 Voici un exemple de simulation de ce problème : toscane(taille,essais):{ neuf,dix,T,n,d,s,k,mn,md; neuf:()); dix:()); / / o n c r é e 2 l i s t e s v i d e s a u d é p a r t (k:1;k<essais;k++){ / / o n v a f a i r e p l u s i e u r s e s s a i s T: (1,taille,’ (6)+ (6)+ (6)+3’); / / o n l a n c e fois
3
’ taille ’
dés
Pour compter le nombre d’apparitions d’une occurrence dans une liste, on utilise neuf:neuf, (9,T); dix:dix, (10,T); }
//
on
compte
les
9
//
on
compte
les
10
On calcule ensuite les moyennes d’apparition de 9 et 10 avec n: ( d: (
100
([neuf])/taille)*100;
([dix])/taille)*100;
/ / mean
en
: anglais
?
:
4 ( %! !
On totalise le nombre total de lancers : s:taille*essais;
On construit les boîtes à moustache correspondant à chaque face : mn: ( md: (
([neuf]),, + + ); ([dix]), + + );
On affiche enfin les résultats et les graphiques :
("Sur
"+s+" essais, la fréquence de sortie de 9 est de "+n+", et celle de 10 est de "+d+); mn,md; }:;
On lance 10 fois de suite une pièce de monnaie et on s’intéresse au nombre maximal de résultats consécutifs égaux. On crée un programme qui simule autant de séries de lancers que l’on désire, qui calcule la moyenne des résultats obtenus et les résume dans un histogramme et une boîte à moustaches. piece(essais):{ S,k,P,j,H,m,M,s,p,h;
On crée une liste vide pour y mettre les longueurs maximum des trajets : S:());
On entame une boucle ayant comme argument le nombre d’essais souhaités :
(k:1;k<essais;k++){ On crée une liste vide pour y mettre les nombres de résultats consécutifs égaux : s:());
On effectue 10 lancers de 0 ou 1 : P:
' (
(1,10,’ (2)’));
On commence à regarder le premier lancer : p:0;
Tant qu’on n’est pas au bout de la liste :
(p<9){ On regarde le suivant : j:p+1;
Et tant que le suivant est égal, on continue :
(P[j]P[p]
j<9){j:j+1} 101
2 0 On enlève p à j car on a commencé à p+1 et on colle cette valeur dans notre liste s : s:s,j-p;
On va ensuite voir le prochain résultat différent p:j; }
Le test terminé, on classe les éléments de s dans l’ordre décroissant grâce à 3 / : s:SortD([s]);
On prend ensuite le premier de la liste car c’est le plus grand en utilisant : h: (s);
On le stocke dans une liste avant de refaire une série de 10 : S:S,h; }
On crée l’histogramme correspondant à cette liste avec H: ( ([S]),, +
(liste) :
);
On calcule la moyenne de S : m: (
([S]));
On crée la boîte à moustache correspondant en rajoutant un paramètre y donnant sa taille verticale : M: (
([S],y-0.15-0.05), + + 7);
On affiche une phrase donnant les résultats avec :
("Sur
"+essais+" séries de 10 lancers, la de résultats consécutifs égaux est "+m);
On trace les deux graphiques : H,M; }:; Réponse du logiciel "Sur 1000 séries de 10 lancers, la moyenne du nombre maximal de résultats consécutifs égaux est 3.513" Evaluation time: 0.55
102
du nombre maximal
4 ( %! !
Histogramme et boîte à moustache pour 1000 séries de 10 lancers. On peut même se lancer dans une animation avec... variations de u)
(suite
dépendant de u,
( (’piece(10*u)’,u1100))
. + )
Un ivrogne fait aléatoirement un pas en avant ou un pas en arrière. Au bout de combien de pas aura-t-il avancé de n pas ? Une situation où la médiane est plus « parlante » que la moyenne... On va créer une procédure dépendant du nombre algébrique de pas n et du nombre de simulations souhaitées p : Ivrogne(n,p):{ A,B,C,s,k,j,M,Mo,tmp,dir; M:()); //
nous
allons
faire
(k:1;k<p;k++){
p
simulations
On appelle s le nombre de pas et on crée une liste de 1500 nombres entre 0 et 999 999 s:0; A: (1,1500,1000000)[0]; (j:1;j<1500;j++){
On demande d’arrêter la boucle si le n e arbre est dépassé, en faisant attention au signe de n :
(n>0){
(s>n)
;} {
(s<n)
;}
Pour simuler la décision aléatoire de reculer ou avancer, on va se référer à la parité du j e terme de A : si le j e terme est pair, on avance, sinon on recule.
(A[j] 20){s +1} {s+-1} }
103
2 0 On rajoute ensuite le nombre de pas trouvé à notre liste : M:M,j; }
On traduit le signe de n par des instructions plus parlantes et on transforme M en liste pour utiliser les fonctions de statistiques :
(n>0){dir:" M:[M];
à
"} {dir:"
à gauche"}
On construit la boîte à moustache : Mo: (
(M,y-0.150.15), + + 7);
On affiche le message avec et on trace la graphique :
("Il a fallu en "+( ( (M)))+" à l’ivrogne atteindre le "+ n +"-ième arbre "+dir+" et la médiane est "+ (M )); Mo; }:; Réponse du logiciel "Il a fallu en moyenne 131 pas à l’ivrogne pour atteindre le 2-ième arbre à droite et la médiane est 9.0" Evaluation time: 37.51
Boîte à moustache correspondant à n = 2 Réponse du logiciel "Il a fallu en moyenne 113 pas à l’ivrogne pour atteindre le -2-ième arbre à gauche et la médiane est 9.0" Evaluation time: 34.34
Boîte à moustache correspondant à n = −2
104
4 *2 2 ! 2
9
Le logiciel Scilab fournit un générateur aléatoire de matrices. Pour savoir quel est le type de répartition par défaut, taper str (’info’)
La distribution uniforme donne des nombres réels équirépartis entre 0 et 1. L’instruction A (9,3,’normal’)
donne une matrice de nombres répartis suivant la distribution gaussienne de moyenne 0 et de variance 1.
9 :
Étant donnés deux familles de nombres x et y de même taille, on cherche la meilleure relation affine entre les deux, c’est-à-dire le segment de droite qui approxime le mieux le nuage de points dont les coordonnées sont dans x et y. x5* (1,9) y3* (1,9)-2 [a,b] (x,y) (x,y,’ms’);X[0,5]; (X,a*X+b)
Les réels a et b représentent respectivement la pente et l’ordonnée à l’origine. Sur le dessin, les points sont représentés par des carrés magenta. La régression linéaire peut être étendue en dimension supérieure ; le nombre de colonnes de x et y doit être le même : c’est le nombre d’échantillons. Les matrices a et b sont censées approcher au mieux y par la quantité ax +b. Cette instruction est utilisée pour rechercher des équations de sous-espaces affines voir f. page 91.
9 $
Le logiciel Scilab fournit de nombreux outils tels la variance et l’écart-type, les moyennes arithmétique, géométrique et harmonique, la médiane, l’échantillonnage aléatoire : x5* (1,9) (x)
(x)
(x) (x) (x)
(x) ssample(22,x)
On peut extraire les fréquences et l’amplitude :
105
2 0 m (s) n (s) a (x)
La répartition par quartiles se fait avec l’instruction :
(s) La répartition par quantiles se fait en utilisant les centiles ; ordonnons d’abord la matrice s pour mieux visualiser la situation :
(s) q[10 50 90] p (s,q) L’analyse en composantes principales existe dans Scilab, elle consiste à approcher des nuages de points par des ellipsoïdes. z (7,8,’normal’) [lambda,facpr,comprinc]pca(z)
9, #%%
Pour illustrer la loi de répartition uniforme, on prend mille échantillons. L’histogramme présente une répartition effectivement assez uniforme. Y (1,1000); ();bar(Y)
Histogramme des valeurs de la variable Y Un zoom présente le même aspect.
106
4#
Histogramme des valeurs de la variable Y : détail En classant les échantillons dans l’ordre croissant, on peut tracer la fonction de répartition par centile. X (Y,’g’,’i’); q1:99; p (X,q) xp(:,1);yp(:,2); (); (x,y)
1000 900 800 700 600 500 400 300 200 100 0 0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0
Répartition de la variable Y par centiles Une répartition proportionnelle à la mesure de Lebesgue donnerait la droite diagonale sur le graphique. Un résultat équivalent est obtenu en traçant l’histogramme de l’échantillon ordonné.
();bar(X) 107
2 0
Histogramme des valeurs de la variable X Les histogrammes par répartition donnent le même résultat indépendamment de l’ordre des valeurs ; plus le résultat s’approche d’une droite horizontale, plus la répartition est uniforme.
(); (100,Y)
Histogramme des fréquences normalisées de la variable Y
Pour illustrer la loi de répartition normale ou gaussienne, il suffit de modifier la première instruction ci-dessus en : Y (1,1000,’normal’);
108
4#
Les autres instructions illustrent la fonction de répartition de la loi normale. Le tracé pardessus le dernier histogramme de la courbe représentative de la fonction 2 exp − t2 2π par la commande t-3:.1:3;z (-t .^ 2 ./2)/ (2*%pi); (t,z)
illustre la répartition normale.
Histogramme des fréquences normalisées de la variable Y suivant la loi gaussienne, avec le graphe de la fonction de Gauss
Une pièce à deux faces ( !) est tirée au hasard 1000 fois. piece[’pile’,’face’] echantillonsample(1000,piece) t (echantillon) bar(t(2))
La fonction a l’avantage sur la fonction de pouvoir travailler avec des chaînes de caractères. Le dessin des fréquences nous permet de voir si Scilab est pipé ou pas. . .
109
2 0
Premier tirage à pile ou face
Deuxième tirage à pile ou face
8
Le tirage de dé s’effectue comme pour le tirage de pile ou face. Comme les échantillons ne sont pas des nombres, on applique un effet miroir sur la liste des fréquences pour que les numéros correspondent aux noms. de[’I’ ’II’ ’III’ ’IV’ ’V’ ’VI’] echantillonsample(1000,de) t (echantillon) z" (de); Zt(2); k1:6, z(k)Z(7-k);
;
110
4#
bar(z)
Pour le tirage de deux dés, la machine peut nous donner les fréquences de chaque couple. couple[]; kde, couple[couple;de+’ ’+k];
; echantillonsample(1000,couple); t (echantillon); yt(1);zt(2);Yy;Zz; k1:36, Z(k)z(37-k);Y(k)y(37-k);
; Z (Z,[6,6]); (Z)
Histogramme des fréquences pour un tirage de deux dés L’étude des sommes de points se fait aisément, les sommes son calculées ici sans utiliser le retournement Z ci-dessus par souci de généralité. somme[12:-1:7 11:-1:6 10:-1:5 9:-1:4 [0]; k1:11, indvectorfind(somme,k+1,’c’); zzz(ind); [ ; (zz)];
; ();bar( )
8:-1:3 7:-1:2];
111
2 0
Histogramme des fréquences pour les somme des points dans un tirage de deux dés
112
Calcul différentiel Logiciel(s) abordé(s) : Maxima XCAS Gp Yacas Scilab
Problématique : Calcul différentiel du lycée jusqu’à l’agrégation.
Le logiciel Scilab calcule des dérivées approchées par des taux de variation. Pour fabriquer la dérivée de l’application e 2x , il est bon de faire exécuter le programme suivant.
yf(x) y (2*x)
yfprime(x) y
(f,x)
Pour tracer simultanément le graphe de f et de sa dérivée restreintes à l’intervalle [−1; 1] comme sur la figure 11.27, il est nécessaire de rentrer les valeurs successives de f dans un vecteur. t-1:.1:1; y[] xt y[y fprime(x)];
(t,f(t),t,y)
4
15
10
5
0 −1.0
−0.8
−0.6
−0.4
−0.2
0.0
0.2
0.4
0.6
0.8
1.0
Une partie de l’hélice
Scilab et les couleurs
Le logiciel Scilab change de couleur automatiquement, la première est toujours bleue. . . même s’il est difficile de s’en rendre compte sur la figure 11.27.
3
Le logiciel Maxima donne des dérivées formelles avec la commande . L’instruction
( (2*x),x); donne le résultat escompté.
Le logiciel XCAS se comporte comme Maxima. La même commande est disponible :
( (2*x),x) Elle donne le résultat escompté, mais il y en a d’autres...
114
(expression,variable)
Fonction dérivée et nombre dérivé XCAS est très à cheval sur la différence entre expression et fonction. Il distingue
donc, comme le mathématicien, nombre dérivé et fonction dérivée. Pour obtenir l’expression générale de la fonction dérivée, qu’on nomme couramment f (x) pour une certaine fonction f , on peut utiliser , mais aussi
(expression,variable) : derive( (2*x),x)
On ne peut pas l’utiliser tel quel pour calculer f (2). On utilise alors
(fonction) : f:x-> (2*x); fd:
(f); fd(2)
On peut aussi utiliser des fonctions pré-programmées sur XCAS :
( > + ) Réponse du logiciel
(‘ x‘)->cos(‘ x‘)*1/2*1/(sin(‘ x‘))*sqrt(sin(‘ x‘))+1
Le symbole @ correspond à la composée de fonction.
On obtient le calcul approché du nombre dérivé avec / (expression,variable,pas), le pas valant par défaut 0, 001, par la méthode du milieu. Par exemple :
/ (((x)),x,0.00001) Réponse du logiciel (ln(ln(x+0.001))-ln(ln(x-0.001)))*500.0
et on transforme cette expression en fonction : fp:((),x)
pour demander f (2) : fp(2)
115
4
#
Le logiciel Gp se comporte différemment.
( (2*x),x) donne un développement limité (voir section b. page 153).
4
Le logiciel Yacas se comporte sans surprise ; il est toutefois sensible à la hauteur de casse des commandes.
/(x) (2*x) donne le résultat escompté. Le logiciel Yacas connaît quelque chose du calcul différentiel vectoriel. V(x):{x^3*y,x^2*z,x*y} 8(V(x,y,z),{x,y,z})
donne le rotationnel du champ de vecteur tridimensionnel V. La suite de ce chapitre utilise Scilab.
" ;
Pour une fonction différentiable f à valeurs réelles, le gradient est le vecteur associé à la différentielle par le produit scalaire euclidien.
yf(x) y (x)^2
yg(x) y
(f,x)’
x[1;1;1] g(x)
La matrice hessienne est celle de l’application linéaire tangente du gradient dans la base canonique.
Hh(x) [J,H]
(f,x,order2,H_form’blockmat’)
x[1;1;1] h(x)
Le rotationnel est le double de la partie antisymétrique de l’application linéaire tangente d’un champ de vecteurs.
116
& !
yV(x) y (x)^2*x(1)*x
yrot( ,x) J
( ,x) yJ-J’
x[1;1;1] rot(V,x)
Le rotationnel du gradient est nul : on le voit sur l’exemple $= &.
"
Pour tracer une hélice (figure 11.28), il faut définir séparément les fonction coordonnées.
xX(t) x(t)
yY(t) y(t)
zZ(t) zt
t0:.1:3*%pi (X(t),Y(t),Z(t))
10 9 8 7
Z
6 5 4 3 2 1 0 −1.0
−0.6
−0.2 Y
0.2
0.6
1.0
1.0
0.6
0.2
−0.2
−0.6
−1.0
X
Une partie de l’hélice
117
4 On définit le vecteur tangent unitaire :
Mc(t) M[X(t);Y(t);Z(t)]
vvitesse(t) v
(c,t)
vT(t) vvitesse(t) vv/ (v)
On définit le vecteur normal et la courbure :
vTprime(t) v
(T,t)
ykappa(t) y (Tprime(t))/
vN(t) vTprime(t) vv/ (v)
(vitesse(t))
On définit le vecteur binormal grâce au produit vectoriel :
vB(t) AT(t)*N(t)’-N(t)*T(t)’ zA(1,2) xA(2,3) yA(3,1) v[x;y;z]
On peut vérifier que la base est orthonormée en un point : A[T(1) N(1) B(1)] A*A’
La matrice AA doit être proche de l’identité. On définit alors la torsion :
vBprime(t) v
(B,t)
ytau(t) yBprime(t)’*N(t)/
(vitesse(t))
Courbure et torsion devraient être constantes dans le cas de l’hélice ; comme on fait des dérivées approchées jusqu’à l’ordre trois, il y a beaucoup d’erreur dans la torsion (figure 11.29) ;
118
!5
' (t,kappa,style5) ' (t,tau,style13)
La courbure de l’hélice en rouge et sa torsion en vert
$<
On se donne un domaine pavé plan et une fonction f de ce rectangle dans R, de classe C 2 . Le graphe de f est un exemple de nappe dans R3 . Définissons par exemple la selle, dont la courbure de Gauss est négative :
zf(x,y) zx*y
et l’hémisphère unité, dont la courbure de Gauss est constante égale à un :
zff(x,y) z (1-x^2-y^2)
L’espace tangent en un point de coordonnées (x1 , x2 , f (x1 , x2 )) est dirigé par les vecteurs ⎛
1
⎛
⎞
⎜ ⎟ ⎜ ⎟ 0 u(x1 , x2 ) = ⎜ ⎟, ⎝ ∂f ⎠ (x1 , x2 ) ∂x1
0
⎞
⎜ ⎟ ⎜ ⎟ 1 v(x1 , x2 ) = ⎜ ⎟. ⎝ ∂f ⎠ (x1 , x2 ) ∂x2
Une nappe paramétrée est une application F de classe C 2 du 2-pavé dans R3 . La fonction suivante paramètre le graphe
Fnappe(nom) chaine’M[x(1);x(2);’+nom+’(x(1),x(2))]’
(’MF(x)’,chaine)
119
4 L’argument de la fonction nappe ci-dessus est la chaîne de caractères qui nomme la fonction à valeurs réelles.
L’espace tangent en un point de coordonnées M = F(x1 , x2 ) est l’image de l’application linéaire tangente de F.
J (F,x) J
(F,x)
Pour dessiner simplement le graphe d’une fonction de R2 dans R, l’instruction convient. L’exemple ci-dessous provient d’un problème du baccalauréat français de juin 2007 ; on évite l’annulation du dénominateur en décalant les valeurs des coordonnées. Les deux derniers arguments précisent les angles de prise de vue. L’utilisateur peut changer le point de vue grâce au bouton de la fenêtre graphique. Le résultat est sur la figure 11.30. x.1:.3:12; yx; zf(x,y) z3*x*y/(x+y)
(); (x,y,f,alpha60,theta-120)
Extrait d’un problème du bac de 2007 (France) L’instruction
%(x,y,f,alpha60,theta-120) 120
!5
donne des couleurs qui représentent la cote, donc la valeur de la fonction f (figure 11.31). Pour obtenir le même résultat à partir de la commande , il faut appuyer sur le bouton de la fenêtre graphique, et choisir Figure properties, cela ouvre une fenêtre de dialogue. Dans l’arborescence à gauche : descendre jusqu’au dernier élément, puis dans l’onglet Style de la partie droite de la fenêtre de dialogue, choisir le drapeau de couleur (Color flag) numéro 1.
Extrait d’un problème du bac de 2007 (France) : les couleurs représentent la cote L’exemple suivant est tiré du d’un problème du baccalauréat de juin 2007 en Polynésie française. x0:.2:6; y0:.2:8;
zf(x,y) z2*x^2-8*x+y^2-6*y+18
a5 t-130 (); %(x,y,f,alphaa,thetat) Pour dessiner le plan d’équation y = 2, on rajoute un rectangle avec l’instruction qui dessine des surfaces quadrangulées : une seule cellule suffit. On remarque sur le graphique précédent que la cote varie entre 0 et 60. Il faut prendre garde à respecter les angles de prise de vue. X[0 0;6 6];Y[2 2;2 2];Z[0 60;0 (X,Y,Z,alphaa,thetat)
60];
Pour tracer l’intersection du plan et du graphe de f , il suffit de tracer une partie du graphe dont l’amplitude en ordonnée est très réduite autour de la valeur 2.
(x,[1.9:.01:2.1],f,alphaa,thetat) Pour tracer les points A = (3, 2, 3) et B = (5, 2, f (5, 2)), il suffit de tracer des graphes corresondant à une légère variation horizontale (figure 11.32).
121
4 Bun[4.9:.01:5.1];Bdeux[1.8:.001:2.2]; (Bun,Bdeux,f,alphaa,thetat) zg(x,y) z3
(Bun-2,Bdeux,g,alphaa,thetat)
Extrait d’un problème du bac de 2007 (Polynésie française) : intersection d’un graphe et du plan y = 2 Le point B apparaît comme une tache noire. Le point A est caché sous la surface. Il faut appuyer sur le bouton de la fenêtre graphique, et choisir Current axes properties, cela ouvre une fenêtre de dialogue. Dans l’arborescence à gauche : le premier élément est sélectionné, dans l’onglet Viewpoint de la partie droite de la fenêtre de dialogue, remplacer la valeur 5 de l’angle de rotation par la valeur 185. Par-dessous, on voit maintenant sur la figure 11.33 la surface, la courbe d’intersection, et les deux points A et B.
Extrait d’un problème du bac de 2007 (Polynésie française) : intersection d’un graphe et du plan y = 2, avec deux points
122
!5
Si le plan y = 2 était n’importe quelle surface transverse au graphe de f , la procédure serait plus substantielle. Le paramétrage de la courbe intersection se résout sur une famille T d’abscisses t qui subdivise l’intervalle [0; 6], en demandant une résolution approchée de l’équation non linéaire en dimension 3 : ⎧ ⎪ ⎪ ⎨ ⎪ ⎪ ⎩
x−t
=
0
y −2
=
0
z − f (x, y)
=
0
Voici l’ensemble complet des instructions : x0:.2:6; y0:.2:8;
zf(x,y) z2*x^2-8*x+y^2-6*y+18
a5; t-130; (); %(x,y,f,alphaa,thetat) X[0 0;6 6];Y[2 2;2 2];Z[0 60;0 60]; (X,Y,Z,alphaa,thetat) / / f p l o t 3 d ( x , [ 1 . 9 : . 0 1 : 2 . 1 ] , f , a l p h a a , t h e t a t ) Bun[4.9:.01:5.1];Bdeux[1.8:.001:2.2]; (Bun,Bdeux,f,alphaa,thetat) zg(x,y) z3.1
(Bun-2,Bdeux,g,alphaa,thetat) //
t0
La
fonction
qui
définit
//
n ’ est
plus
utilisé
intersection
yinter(x) y[x(1)-t,x(2)-2,x(3)-f(x(1),x(2))]
//
paramétrage
de
l ’ intersection
T0:.1:6; abscisse[];ordonnee[];cote[]; tT, M ([t;0;0],inter) ; abscisse[abscisse M(1)];ordonnee[ordonnee M(2)];cote[cote M(3)];
//
dessin
(abscisse,ordonnee,cote,[alphaa,thetat])
123
4 Les angles de vue ne se rentrent pas de la même manière dans et dans ; de plus l’exécution par le logiciel de la dernière instruction ne respecte pas les angles de prises de vue.
Il faut ouvrir la boîte de dialogue des propriétés de la figure. Dans la partie gauche, cliquer sur le bouton de la ligne Axes, sélectionner Polyline, dans la ligne Line, augmenter l’épaisseur du trait : voir la saisie d’écran 11.34.
Boîte de dialogue de la fenêtre graphique de Scilab Dans la ligne Axes, dans l’onglet viewpoint on ramène les angles à 185 et −130 pour obtenir la figure 11.35. (En sélectionnant les lignes correspondantes, on peut augmenter ou diminuer la graisse des dessins qui représentent A et B.)
124
# 6! 2%! !5
Extrait d’un problème du bac de 2007 (Polynésie française) : nouvelle mouture du dessin En zoomant sur le point A et en ajustant les angles de prise de vue, on obtient la figure 11.36 qui visualise la non-appartenance du point A au graphe de f , comme le montre le calcul de f (3, 2) par Scilab, qui donne 4.
Le point A n’appartient pas au graphe de f
, =
<
Le vecteur normal unitaire à la surface est défini grâce au produit vectoriel des dérivées partielles.
vn(F,x) J (F,x) unJ(:,1) ; deuxJ(:,2) Aun*deux’-deux*un’ zA(1,2) xA(2,3) yA(3,1) 125
4 v[x;y;z] vv/ (v)
La première forme fondamentale de la surface est la restriction de la forme quadratique euclidienne à l’espace tangent. La seconde forme fondamentale de la surface est associée à la matrice des dérivées de la normale unitaire dans l’espace tangent de façon à être indépendante du paramétrage. L’application de Gauss est constituée des dérivées partielles de la normale unitaire.
VGauss(F,x) h1e-4 un[h;0] deux[0;h] V[n(F,x+un)-n(F,x) ,
n(F,x+deux)-n(F,x)]/h
La dérivée de n est à valeurs dans l’espace tangent puisque le produit scalaire de n avec l’une de ses dérivées partielles est la moitié de la dérivée de sa norme, constante égale à un : ∂n 1 ∂ n, n2 = 0 pour i = 1et 2. (x1 , x2 ) = ∂xi 2 ∂xi Par commodité, construisons ensuite la matrice N qui envoie les deux premiers vecteurs de la base canonique sur la dérivée de n et le troisième sur la normale unitaire.
VN(F,x) V[Gauss(F,x),n(F,x)]
La seconde forme fondamentale est la restriction à l’espace tangent de la forme quadratique représentée par le produit de l’application de Gauss par le pseudo-inverse de l’application tangente. Les valeurs propres de la seconde forme fondamentale sont appelées courbures principales et se lisent dans la matrices courbures donnée par la fonction elements :
[directions,courbures]elements(F,x) J (F,x) GGauss(F,x) M(J)*G [directions,courbures] (M)
La courbure de Gauss est le produit des valeurs propres. Deux fonctions donnent des résultats proches.
Kkappa(F,x) J (F,x) K
(N(F,x))/ (
(J’*J))
Kcourbure(F,x) 126
# 6! 2%! !5
[directions,courbures]elements(F,x) K
(courbures)
La courbure moyenne est la somme des courbures principales.
KCM(F,x)
[directions,courbures]elements(F,x) K (courbures)
Il ne reste plus qu’à initialiser les paramétrages, et obtenir quelques valeurs... Fnappe(’f’) FFnappe(’ff’) x[.2;.5] y[-.8;.5] O" (2,1) [directions,courbures]elements(FF,O) [directions,courbures]elements(FF,x) [directions,courbures]elements(FF,y) courbure(FF,O) kappa(FF,O) courbure(FF,x) courbure(FF,y) CM(FF,O) CM(FF,x) CM(FF,y) [directions,courbures]elements(F,O) [directions,courbures]elements(F,x) [directions,courbures]elements(F,y) courbure(F,O) kappa(F,O) courbure(F,x) courbure(F,y) CM(F,O) CM(F,x) CM(F,y)
La pseudosphère est la surface de révolution de la tractrice.
MH(x) ax(1);bx(2) r (1-a^2-b^2) c (r)-r M[a;b;c]
courbure(H,x) courbure(H,y)
127
4 Sa courbure est constante, égale à −1. courbure(H,x) courbure(H,y)
On dessine maintenant sur une grille soigneusement choisie pour les exemples cités ici.
dessin(F) maille30 I1:maille; JI; Z" (maille,maille); couleurZ; tI uJ point[t/maille-.55;u/maille-.55]; zF(point); Z(t,u)z(3); couleur(t,u)courbure(F,point);
;
" (Z) ();XI/maille-.55;YJ/maille-.55;surf(X,Y,Z) ();surf(X,Y,couleur) ();surf(X,Y,Z,couleur)
L’instruction dessin(H)
demande un peu de calcul : la grille contient 900 nœuds. La courbure reste proche de −1.
La pseudosphère : les couleurs représentent la cote
128
# 6! 2%! !5
La courbure de la pseudosphère : les couleurs représentent la cote
La pseudosphère : les couleurs représentent la courbure Les instructions dessin(F) ; dessin(FF)
donnent des figures suggestives.
129
4
La selle : les couleurs représentent la cote
La courbure de la selle : les couleurs représentent la cote
130
# 6! 2%! !5
La selle : les couleurs représentent la courbure
La sphère : les couleurs représentent la cote
131
4
La courbure de la sphère : les couleurs représentent la cote
La sphère : les couleurs représentent la courbure
. )+ <
R2
R
!"#$
3
Énonçons ce théorème que nous ne démontrerons pas ici :
132
, " )! 5 R2 R
Extremum sous contrainte Si f et g sont deux fonctions indépendantes telles que :
➥
f et g ont des dérivées partielles continues dans un voisinage d’un point P(x0 , y 0 ) ;
➥
f présente un extremum au point P sous la contrainte g (x, y) = k, où k est une constante ; −→ ➥ g évalué au point P est différent du vecteur nul, −→ −→ alors f (x0 , y 0 ) = λg (x0 , y 0 ) pour un scalaire λ appelé multiplicateur de Lagrange. Par conséquent, un extremum d’une fonction f soumise à une contrainte g ne peut être observé qu’à un point P où les gradients de f et g sont parallèles. La contrainte est alors tangente à la courbe de niveau de f passant par le point P. Pour trouver cet éventuel extremum, il faut résoudre le système : ⎧ → ⎪ −→ ⎨− f (x, y) = λg (x, y) ⎪ ⎩ g (x, y) = k
On veut par exemple déterminer les extrema de la fonction f : (x, y) → y 2 − x 2 sur le disque unité. f:(x,y)->y^2-x^2
La fonction est continue sur un compact, elle atteint ses extrema en un point intérieur ou limitrophe au disque unité. Les points critiques s’obtiennent en égalant les dérivées partielles à 0 :
([ (f(x,y),x)0, (f(x,y),y)0],[x,y]) Réponse du logiciel [[0,0]]
Cette fonction n’a qu’un seul point critique à l’intérieur du disque unité. Il faut également trouver les extrema sur la frontière du disque, i.e. sous la contrainte g (x, y) = x 2 + y 2 = 1. On utilise le théorème précédent et la commande (f(x,y),[x,y]) : g:(x,y)->x^2+y^2; ([ (f(x,y),[x,y])lambda* (g(x,y),[x,y]),g(x,y)1],[x,y,lambda ])
133
4 Réponse du logiciel
⎡
−1
⎢ ⎢ 1 ⎢ ⎢ ⎢ 0 ⎣ 0
0 0 −1 1
−1
⎤
⎥ −1 ⎥ ⎥ ⎥ 1 ⎥ ⎦ 1
La fonction ne peut donc atteindre un extremum qu’à un des points (0 ; 0), (0 ; 1), (0 ; −1), (−1 ; 0) ou (1 ; 0) : f(0,0);f(1,0);f(-1,0);f(0,1);f(0,-1) Réponse du logiciel
0, −1, −1, 1, 1
Par conséquent la fonction atteint son maximum de 1 aux points (0; 1), (0; −1) et sa valeur minimale −1 aux points (1; 0), (−1; 0). Ces résultats peuvent être confirmés par la représentation graphique de la surface en utilisant :
(f(x,y),[x-11,y-11], 0.05, 0.05,+ )
Surface d’équation z = y 2 − x 2 et la représentation des courbes de niveau de la fonction et de la contrainte. On utilise (f(x,y),[x,y],liste des valeurs des lignes) et (g(x,y)-1,x,y) :
134
, " )! 5 R2 R
(f(x,y),[x,y],[-1,-0.75,-0.5,-0.25,0,0.25,0.5,0.75,1], 0.05, 0.05), (x^2+y^2-1,x,y) qui affiche : y 1
0.5
x
0
-0.5
-1
-2
-1
0
1
2
Courbe de niveau de f avec la contrainte g (x, y) = 1
= )3 ) 3
Rappelons ce résultat classique que nous ne démontrerons pas :
Test de la dérivée seconde Soit f : x → f (x, y) une fonction telle que :
➥ ➥
les dérivées partielles de premier et second ordre sont continues dans un voisinage d’un point (x0 , y 0 ); −→ → − f (x0 , y 0 ) = 0 .
Posons r = f x2 (x0 , y 0 ), s = f xy (x0 , y 0 ) = f yx (x0 , y 0 ) et t = f y2 (x0 , y 0 ). Alors, si ∂ f (x,y )
∂ f (x,y ) (x0 , y 0 ) ∂y 2
< 0, alors f atteint un
∂ f (x,y )
∂ f (x,y ) (x0 , y 0 ) ∂y 2
> 0, alors f atteint un
➥
δ = r t − s 2 > 0 et ∂x 2 (x0 , y 0 ) < 0 ou maximum relatif au point (x0 , y 0 );
➥
δ = r t − s 2 > 0 et ∂x 2 (x0 , y 0 ) > 0 ou minimum relatif au point (x0 , y 0 );
➥
δ = r t − s 2 < 0, alors f présente un point de selle au point (x0 , y 0 );
➥
δ = r t − s 2 = 0, alors le théorème ne permet pas de conclure.
135
4 Cherchons les extrema relatifs de la fonction f : (x, y) → 6x y 2 − 2x 3 − 3y 4 qui est de classe C ∞ sur R2 . f:(x,y)->6*x*y^2-2*x^3-3*y^4
Cherchons ses points critiques :
([ (f(x,y),x)0, (f(x,y),y)0],[x,y]) Réponse du logiciel
⎤
⎡ 0
⎢ ⎢ ⎢ 0 ⎢ ⎢ 1 ⎢ ⎢ ⎢ 0 ⎣ 1
0
⎥ ⎥ 0 ⎥ ⎥ −1 ⎥ ⎥ ⎥ 0 ⎥ ⎦ 1
Il y a donc trois points critiques. Essayons de les classer avec le théorème précédent. On va utiliser la fonction (()f(x,y),[x,y]) ou (f(x*y),[x,y],2) qui donnent la matrice hessienne de f qui est la matrice des dérivées d’ordre 2, c’est-à-dire :
(F(x,y),[x,y]) Réponse du logiciel
⎡ ⎣
∂F(x,y ) ∂x 2 ∂F(x,y ) ∂x y
∂F(x,y) ∂x y ∂F(x,y) ∂y 2
⎤ ⎦
Dérivées partielles et XCAS On obtient et
Ici :
136
∂F(x,y ) ∂x y
∂F(x,y ) ∂x 2
en rentrant diff(F(x,y),x,2)
en rentrant diff(F(x,y),[x,y],[1,1])
, " )! 5 R2 R H: (f(x,y),[x,y]) Réponse du logiciel
− (6 · 2 · x) 12 · y
6·2· y 6 · x · 2 − 12 · 3 · (y)2
Il s’agit de déterminer le déterminant de cette matrice qui, attention, est une expression. On utilisera donc astucieusement la commande (ancien=nouveau) : delta:(a,b)-> f2:(a,b,V)->
( (
(H),xa,yb)
( ( (f(x,y),V,2),xa,yb)
Alors : delta(1,1);delta(1,-1);delta(0,0)
et : f2(1,1,x);f2(1,-1,x);f2(0,0,x)
nous permettent d’affirmer que f atteint un maximum relatif aux points (1 ; 1) et (− ; −1). La représentation graphique va nous permettre de confirmer ce résultat et de constater que (0 ; 0) est un point de selle :
Surface d’équation z = 6x y 2 − 2x 3 − 3y 4 Pour un exposé vivant, intéressant, abordable, bref québécois de ces notions, voira . a A MYOTTE , Luc Introduction au calcul avancé et à ses applications en sciences . Québec: ERPI, 2004.
137
Intégration Logiciel(s) abordé(s) : Yacas Maxima Scilab XCAS MuPAD
Problématique : Des primitives formelles et des intégrales numériques peuvent être obtenues.
4
Pour trouver une primitive avec Yacas, il suffit de taper :
0 (x) 3(x) et pour obtenir son intégrale sur l’intervalle [0, π] : A:0 (x,0,4()) 3(x) ((A,20)
La dernière commande donne le résultat approché avec une précision arbitraire de vingt décimales. Des primitives plus compliquées ne lui font pas peur :
0 (x) )(x) Mais Yacas a ses limites :
0 (x)
(1+(2(x))^2)^(1/2)
ne donne rien.
3
Pour obtenir une primitive de sin(x), avec le logiciel Maxima, il suffit de taper :
((x),x); et pour obtenir son intégrale sur l’intervalle [0, π] :
((x),x,0,%pi); Des primitives plus compliquées ne lui font pas peur :
((x),x); ( (1+( (x))^2),
x);
Pour la dernière, il faut savoir que la notation .30(@ désigne l’argument sinus hyperbolique, noté Argsh en mathématiques. Maxima peut trouver la primitive d’une fraction rationnelle : R(x):=1/(x^3+x^2+x+1);
(R(x),x);
Mais une autre fraction rationnelle peut lui faire baisser les bras : S(x):=1/(x^3+x+1);
(R(x),x);
Dans ce cas, il y a peut-être une solution en utilisant les bonnes vieilles méthodes de l’âge du papier et du crayon.
La décomposition en éléments simples consiste à décomposer en facteurs irréductibles dans R le dénominateur de la fraction (mise sous forme irréductible) ; la fraction se décompose en somme de fractions construites à partir de ces facteurs. Intégrer séparément chaque terme est souvent plus facile que le problème de départ. Commençons par le cas dont on connaît déja le résultat ; R(x):=1/(x^3+x^2+x+1); RR(x):= (R(x),x); RR(x);
La fraction est décomposée en
1 x −1 − 2(x + 1) 2(x 2 + 1)
L’instruction
(RR(x),x); donne le même résultat que la primitive de R, quoique un peu moins bien simplifié. Prenons maintenant le cas difficile. La décomposition en éléments simples ne fonctionne pas non plus. S(x):=1/(x^3+x+1);
(S(x),x);
La différence, c’est que nous pouvons attaquer le problème sous l’angle des polynômes, où la boîte à outils est bien fournie. P(x):=x^3+x+1; A: (P(x)=0); PP(x):=(x-(A[1]))*(x-(A[2]))*(x-(A[3])); Q(x):=1/PP(x);
140
La fraction Q est la même que S, sauf que nous avons indiqué à la machine la factorisation du dénominateur.
Attention : à partir du degré 5, il n’y a plus de formule algébrique universelle pour extraire les racines d’un polynôme. . .
T(x):= (Q(x)); TT(x):= (Q(x),x);
donnent des réponses complexes. Pour obtenir des réponses réelles,
(T(x)); entraîne la question de Maxima : Réponse du logiciel
Is
SQRT(31) 1 1/3 SQRT(31) 1 2/3 3 (--------- - -) x - 3 (--------- - -) 6 SQRT(3) 2 6 SQRT(3) 2
+ 1
positive or negative?
Il faut répondre à l’alternative par exemple :
; De même, l’instruction
(TT(x)); avec la même réponse que précédemment donne une expression formelle pour une primitive de la fonction S. Mais Maxima n’arrive pas à calculer une valeur pour l’intégrale sur un intervalle donné. On peut utiliser alors une fonction de calcul approché pour les intégrales :
(S(x),x,2,3); qui donne une valeur numérique.
Attention : L’instruction romberg(Q(x),x,2,3); ne fonctionnerait pas. . .
141
Le logiciel Scilab calcule des intégrales approchées avec l’instruction mais elle n’accepte pas les fonctions internes du logiciel. La commande intg(0,%pi,sin) est invalide. La bonne procédure est la suivante : function y=f(x) y=(x) endfunction intg(0,%pi,f)
Pour tracer le graphe de la primitive du logarithme népérien qui s’annule en 1, on commence par définir les fonctions nécessaires. function y=f(x) y=(x) endfunction function y=F(x) y=intg(1,x,f) endfunction t=1:1:3;
Mais là, aucune des instructions fplot2d(t,F), /plot(t,F(t)), plot(t,t*log(t)-t) n’est valide. Il faut accumuler les valeurs scalaires dans un vecteur : Y=[] for x=t Y=[Y F(x)]; end plot(t,Y)
ce qui donne la figure 12.49.
1.4
1.2
1.0
0.8
0.6
0.4
0.2
0.0 0.0
0.5
1.0
1.5
2.0
2.5
Graphe de x log(x) − x + 1
142
3.0
Les instructions de base de XCAS ressemblent à celles de Maxima et les résultats sont similaires.
((x),x) ((x),x,0,) Le passage par les décompositions en éléments simples est plus rapide. Les instructions suivantes donnent les mêmes résultats que sous Maxima. R(x):1/(x^3+x^2+x+1) (R(x),x) (R(x),x) S(x):1/(x^3+x+1) (S(x),x) (S(x),x)
Mais le logiciel XCAS ne sait pas trouver les racines du dénominateur de S. L’instruction
(S(x),x,2,3) donne le calcul approché sans problème. Passons à un calcul de primitive plus intéressant. . . XCAS peut passer le Grand Oral de l’X :
( (( (x))^2+1),
x)
donne : Réponse du logiciel
− ln
!! (tan (x))2 + 1 − (tan (x))
MuPAD serait lui recaléa : int(sqrt((tan(x))^2+1), x)
ne répond rien. Mais MuPAD a d’autres arguments : int(x^n* (x),x)
donne : Réponse du logiciel
Γ(n + 1, −x) (−1)n
a C’est ça de ne pas être libre...
143
"' % %
5 On utilise (expression, ancien=nouveau), que vous pouvez comparer à la commande subsop vue au paragraphe e. page 33 pour les listes. Par exemple :
(g(a*x),x,p)- ((1/a)* (g(t),t,p/a),tx*a) qui répond : Réponse du logiciel
"+∞ 0
⎛
⎞ pxa ! − " 1 ∞ g(ax)e−(px) dx − ⎝ 0 g(xa)e a a dx⎠ a
! # $ 1 a pour les transformées de Laplaceb nous permet de voir que L f (ax) = F a p
La fonction (F(x)*g(x),G(x)) renvoie la liste [F(x)*G(x),-f(x)*G(x)] si G(x)= 0 et ([F(x),g(x)]) renvoie F(x)+G(x) avec les notation habituellesc . " Cela nous permet de construire une procédure ipp(F(x),g(x)) qui renverra F(x)g (x) dx calculée par une intégration par parties : ipp(F(x),g(x)):{ ( (F(x)*g(x), (g(x),x)),0) }:;
Par exemple : ipp((x),1)
donne : Réponse du logiciel -x+x*ln(x)
qui est en effet une primitive de 1 × ln(x). Si l’on veut l’évaluer sur un intervalle, on peut utiliser à renvoie F(b)-F(a) : b Voir section 15.2 page 170. c F une primitive de f.
144
(F(x),a,b,variable) qui
2
(ipp((x),1),2,3) renvoie bien : Réponse du logiciel 3*ln(3)-3-2*ln(2)+2
Mais XCAS n’a pas besoin de nous pour avoir cette idée :
((x)); ((x),x,2,3) renvoie directement le résultat. Cette nouvelle procédure peut nous être utile dans un calcul formel. Par exemple : ipp(f(x), (g(x),x))
renvoie bien sûr : Réponse du logiciel
f (x)g(x) dx + g(x)f(x)
qui nous rappelle la formule d’intégration par parties. Mais cette méthode a ses limites, comme nous allons le voir.
6 Ce sont les intégrales du type Wn =
π/2
sinn (x) dx
0
En particulier π/2 0
sinn+2 (x) dx =
π/2 0
sinn (x) dx −
π/2
sinn (x) cos2 (x) dx
0
sachant que sin2 (x) = 1 − cos2 (x). Il faudrait donc calculer On pense à une intégration par parties. Mais si on tape :
"π/2 0
sinn (x) cos2 (x) dx.
ipp(((x))^n*((x))^2,(1/(n+1))*((x))^(n+1))
cela ne donne rien. Nous allons donc revenir à ibpdv. r: (((x))^n*((x))^2,(1/(n+1))*((x))^(n+1))
145
Le logiciel répond cette fois quelque chose, mais cela reste compliqué. La ruse est de changer sinn+1 (x) en n+1 1 sinn (x)sin(x). Alors r: (((x))^n*((x))^2,(1/(n+1))*((x))^(n)*(x))
répond : Réponse du logiciel
1 (sin (x))2 (sin (x))n (sin (x))n sin (x) cos (x) , n +1 n +1
Nous avons besoin de faire une petite pause pour expliquer ce phénomène...
Comment XCAS traite-t-il x n ? Si vous interrogez XCAS sur (f(x),x), il vous répondra Réponse du logiciel
n
xn x
sans jamais vouloir simplifier ce résultat en nx n−1 . C’est que XCAS fait du calcul formel et considère x n non pas comme un polynôme mais comme une variable indépendante. C’est plus simple et plus efficace pour l’ordinateur, même si ça apparaît plus compliqué pour les faibles humains que nous sommes. Dans le cas qui nous occupe, en n’introduisant pas sinn+1 (x) qui serait une nouvelle variable, on laisse XCAS traiter le problème avec deux variables : sinn (x) et sin(x). Alors XCAS arrive à intégrer par parties et à simplifier le résultat alors que par exemple MuPAD n’y arrive pas alors qu’il traite (ou plutôt parce qu’il traite) le problème plus mathématiquement qu’informatiquement.
On peut encore simplifier le résultat avec la commande qui justement simplifie autant que possible une expression trigonométrique en utilisant en priorité des sinus car XCAS considère les sinus comme des variables. Dans le cas qui nous occupe, après avoir rentré :
146
2
(r[1]) on obtient : Réponse du logiciel
(sin (x))2+n n+1
Pour revenir aux intégrales de Wallis, il nous reste à évaluer r[0] entre 0 et
π 2
:
(r[0],0,Pi/2) nous renvoie bien 0. Finalement, nous obtenons la relation de récurrence : Wn+2 = Wn −
1 Wn+2 n +1
qui nous permet de calculer les termes pairs et impairs, ou plus directement : W(n): (((x))^n,x,0,Pi/2) (W(k),k014)
donne : Réponse du logiciel π
π 2 3π 8 5π 16 35π 128 63π 256 231π 1024 429π 2048 6435π 32768 12155π 2 , 1, 4 , 3 , 16 , 15 , 32 , 35 , 256 , 315 , 512 , 693 , 2048 , 3003 , 4096 , 6435 , 65536 , 109395 , 131072
Pour l’intégration par parties, on utilise -- (hold(int)(f(x),x= ),v(x)). "1 Ainsi, on peut intégrer par parties 0 x n ex dx :
(n, 2 --NonNegInt): (n>0,and_); simplify(intlib--byparts( (int)(x^n* (x),x01), (x))) qui répond : Réponse du logiciel
e−n
1
xn−1 ex dx
0
147
" %% '
!
Pour avoir une approximation de l’aire sous la courbe, on peut l’approcher par des rectangles élémentaires. Voici une petite procédure de construction : Rect(f,N,a,b):{ RV,RR,R,k,av,ap,C; RV:()); RR:()); (k:0;k<N;k++){ av:a+k*(b-a)/N; / / a v a n t . ap:a+(k+1)*(b-a)/N; / / a p r è s . R: ( (av,0), (av,f(av)), (ap,f(av)), (ap,0)); / / le
rectangle
RR:RR, (R,+ ); / / o n r e m p l i t l e s r e c t a n g l e s RV:RV, (R, + ); / / l e c o n t o u r e n p l u s é p a i s } C: (f(x),xab, + ); / / l a c o u r b e (RV,RR,C); / / l e s 3 g r a p h e s s u p e r p o s é s }:;
Pour avoir une vision dynamique, on ouvre une fenêtre graphique et on utilise
:
n: (1 100) Rect(x->(x),n,0,2*Pi)
Méthode des rectangles « personnelle » Pour être honnête, il existe déjà (expr,x=a..b,n,méthode) sur XCAS qui permet d’obtenir ce résultat, où méthode peut-être , , " , .
( ((x),x02*Pi,20,rectangle_droit), ), ( ((x),x02*Pi,20,rectangle_gauche), ) 148
& ! 2 ) 2
Méthode des rectangles « à la XCAS » Ce qui nous intéresse est bien sûr d’avoir une approximation numérique : aireRect(f,N,a,b):{ ((b-a)/N*f(a+k*(b-a)/N),k1N)); }:;
(
//
subdivision
régulière
aireRect(x->(x),100,1,10) Réponse du logiciel 14.02524361
alors qu’avec par la fonction de calcul approché 0 : nInt((x),x110)) Réponse du logiciel 14.02585093
Nous avons donc 3 bonnes décimales avec 100 rectanglesd .
) 3 π
Il n’est pas trop difficile de trouver un rapport entre la fonction f : x →
1 − x 2 et π :
4*aireRect(x-> (1-x^2),1000000,0,1)
Avec 1000000 de rectangles et 76 secondes, on obtient difficilement 5 décimales de π. . . d Pour avoir des précisions sur le calcul approché d’intégrales avec XCAS, voir la section b. page 52.
149
Match Scilab/XCAS sur l’approximation d’intégrales Interrogeons XCAS pour obtenir une approximation de
1 % 0
1 − x 2 dx :
4*nInt( (1-x^2),x,0,1) Réponse du logiciel [3.141580789,3.14158081,3.141580816,3.141580817, 3.141580817,3.141580818,3.141580818]
soit au mieux 4 bonnes décimales. En effet, la singularité de la dérivée en 1 brouille les algorithmes basés sur la formule d’Euler-Mac Laurin. Quant à Scilab :
yf(x) y (1-x**2)
(20) 4* (0,1,f) Réponse du logiciel ans
=
3.1415926535897926719088
alors qu’une valeur approchée de π est : %pi Réponse du logiciel %pi
=
3.1415926535897931159980
c’est-à-dire que Scilab donne 16 bonnes décimales : Scilab a gagné ? Eh non... Parfois le calcul formel a du bon ! Si vous demandez à XCAS : 4*
( ( (1-x^2),x,0,1))
il vous donne 1000 bonnes décimales de π, la limite de / .
150
& ! 2 ) 2
Approximation de π avec la formule de Machin & & & 2n+3 n (−1)k x 2k+1 & ' & x & . Vous savez bien que &Arctan(x) − &< & 2k + 1 & 2n + 3 k=0 On peut donc construire une procédure dépendant d’un nombre ! compris entre 0 u 2n+3 10−p : et 1 et donnant la plus petite valeur de l’entier n telle que 2n + 3 mini(u,p):{ k; k:0; ( ((u^(2*k+3))/(2*k+3))>10^(-p)){ k:k+1} }:;
Vous connaissez également la formule du mathématicien anglais M ACHIN : 4 arctan
1 1 π − arctan = 5 239 4
obtenue en montrant que, a et b étant deux réels tels que ab = 1, on a arctan a + a+b arctanb = arctan 1−ab + επ avec ε = 0 si ab < 1, ε = 1 si ab > 1 et a > 0 et ε = −1 si ab > 1 et a < 0. n (−1)k X 2k+1 ' On appelle polynôme de G REGORY le polynôme Gn (X) = . 2k + 1 k=0 On construit donc une procédure qui donne une valeur approchée de Gn (a) à 10−p près : greg(n,a,p):{ S,k; S:0; (k:0;k<n+1;k++){ S:S+ (((-1)^k*a^(2*k+1))/(2*k+1),p+1); };
(S); }:;
La formule de M ACHIN faisant intervenir un Arctan(1/5), on va interroger mini : mini(1/5,100)
qui nous dit qu’il nous faut aller au rang 69 pour avoir 100 bonnes décimales de π : 4*(4*greg(69,1/5,100)-greg(69,1/239,100))
nous donne instantanément le résultat voulu.
151
Développements limités Logiciel(s) abordé(s) : Maxima Gp Yacas XCAS
Problématique : Obtenir des développements limités : approximations de fonctions par des polynômes.
# 4
Le logiciel Yacas permet de calculer quelques développements limités. f(x): (8(x)) 4 6 (2(x,0,9)
f(x))
donne le développement limité à l’ordre 9 en 0 de la fonction exp(cos(x)). Il ne faut pas aller trop loin dans l’ordre, car le temps de calcul devient prohibitif.
# % Le logiciel Gp considère les fonctions comme des séries entières ; il est donc bien adapté aux développements limités. Les deux lignes suivantes donnent le développement à l’ordre 16 en 0 de la fonction exp(cos(x)). f(x) ((x)) f(x)
Pour développer à l’ordre 20 il suffit de rajouter : \ps 20 f(x)
Pour obtenir le développement en π2 , il suffit de décaler : f(x+4/2)
Le résultat n’a pas besoin d’être converti en polynôme puisque ce n’est qu’une représentation à l’affichage de la fonction.
(5
# /+ Le logiciel Maxima donne un résultat moyennement plus lisible que Gp. f(x):= ((x)); (f(x),x,0,20);
Un petit exercice nous permet de comparer une fonction puissance et son développement limité en 1 aux ordres 2 et 5. f(x):=(1+x)^10; f(1/100); (%); g: (f(x),x,0,5); ( (1/100,x,g)); h: (f(x),x,0,2); ( (1/100,x,h)); ff(y):= ( (y,x,h)); ' ([f(x),ff(x)],[x,0,01]);
Comparaison de deux polynômes au voisinage de 0
# !"#$
#
Reprenant le même développement que pour Gp, on obtient un résultat plus lisible.
( ((x)),x0,6) Le développement peut etre transformé en polynôme avec l’instruction En voici tout de suite une application.
154
(DL,polynom).
&
> ) 3 ) *? *
Pour comprendre l’aspect local de l’approximation d’une fonction par le polynôme de Taylor associé, rien de tel qu’une petite procédure qui permet de comparer les graphes de la fonction et du polynôme selon son degré. Cela permet également de visualiser les fonctions qui admettent un développement en série entière de rayon infini ou fini. On construit une procédure dl(f,x,n) qui dépend de la donnée d’une fonction f, d’un ordre n et du « point d’observation » x : dl(f,x,n):{ ( ( (f(x),x0,n),polynom)); }:;
On obtient ainsi un polynôme. Par exemple : dl( ,x,10) Réponse du logiciel (62*x^9)/2835+(17*x^7)/315+(2*x^5)/15+(x^3)/3+x
Ensuite, il ne reste plus qu’à visualiser. Attention, notre n variable n’est pas forcément entier. On utilise (nombre) qui renvoie la partie entière d’un nombre. n: (1 50) ([dl(,x,(n)),(x)], / / o n t r a c e c ô t e à x-4*Pi4*Pi, [ , + ]) / / o n l e s d i s t i n g u e l ’ épaisseur
du
côte
par
les
les
courbes
couleurs
et
trait
et on obtient pour la fonction cosinus en 0 avec n = 25 :
Approximation polynomiale de la fonction cosinus
155
(5 On visualise bien que l’intervalle de « validité » de l’approximation croît avec n et semble pouvoir « recouvrir » R, alors que pour la fonction x → ln(x+1), l’approximation ne semble valable que pour 0 x < 1 :
([dl(x->(1+x),x,(n)),(1+x)],x02,[ , + ]) comme on le voit ici :
Approximation polynomiale de x → ln(x+1) Nous verrons d’autres approximations polynomiales lors de l’étude des Polynômes interpolateurs de L AGRANGE.
156
Équations différentielles Logiciel(s) abordé(s) : Scilab Octave Maxima MuPAD XCAS
Problématique : Résoudre des équations différentielles ordinaires. Utiliser ces équations.
# $ 5 ) "
L’équation différentielle y (t ) = 2y(t ) + 10cos(10t ) est résolue sur l’intervalle [−1, 1] avec la condition initiale 1.
yprimef(t,y) yprime2*y+10*(10*t)
y01;t0-1;t-1:.1:1 Le graphe de la solution est dessiné.
() z
(y0,t0,t,f); (t,z) La linéarité de l’équation différentielle n’est pas cruciale.
5 ) "
On se donne une matrice antisymétrique d’ordre trois (quelconque) ; AA (3,3,’unif’) AAA’-AA
le sous-groupe de Lie qu’elle engendre dans le groupe spécial orthogonal est construit avec une équation différentielle ordinaire.
yprimef(t,y) yprimeA*y
! 4 La machine se fait une joie de tracer une partie de l’orbite du premier vecteur de la base canonique. y0[1;0;0];t0-1;t-1:.1:1 () z
(y0,t0,t,f); (z(1,:),z(2,:),z(3,:))
1.0 0.6
Z
0.2 −0.2
−1.0 −0.8
−0.6
−0.6 −0.4
−1.0
−0.2 0.0
−0.6 −0.4
0.2 −0.2
0.4 0.0
Y
0.6 0.2
X
0.8 0.4
1.0
Rotation d’un vecteur Maintenant on trace l’orbite de la base canonique ; y0[1;0;0];t0-1;t-1:.1:1; () z
(y0,t0,t,f); y1[0;1;0]; zz
(y1,t0,t,f); y2[0;0;1]; zzz
(y2,t0,t,f); Xz(1,:)’;XXzz(1,:)’;XXXzzz(1,:)’; Yz(2,:)’;YYzz(2,:)’;YYYzzz(2,:)’; Zz(3,:)’;ZZzz(3,:)’;ZZZzzz(3,:)’; %([X,XX,XXX],[Y,YY,YYY], ([Z,ZZ,ZZZ],[2,3,6]))
158
Rotation de la base
Il faut veiller à mettre les vecteurs collectant les coordonnées en colonnes : le nombre de couleurs (deuxième argument de la fonction $&) est celui des colonnes. On peut comparer avec la solution algébrique.
XXXX[];YYYY[];ZZZZ[]; ut-t0 G (u*A); XXXX[XXXX;G(1,:)]; YYYY[YYYY;G(2,:)];ZZZZ[ZZZZ;G(3,:)];
() %(XXXX,YYYY, (ZZZZ,[2,3,4])) ([X,XX,XXX]-XXXX)
159
! 4
Rotation algébrique de la base
L’exponentielle matricielle réclame l’instruction quée à chaque coefficient....
; sinon c’est une exponentielle appli-
5 ) " 3+
L’équation différentielle du second degré y = −100y se résout grâce à la matrice compagnon comme dans la théorie. A[0 1;-100 0] yprimef(t,y) yprimeA*y
y0[0;1];t0-1;t-1:.01:1; () zz
(y0,t0,t,f); zzz(2,:); (t,z)
160
La sinusoïde de pulsation 10 qui résoud l’équation y = −100y avec la condition initiale voulue On peut vérifier la valeur de l’approximation quand on connaît la solution théorique : erreur (z-(10*(t+1)))
5 ) " ) ""
Le lecteur résoudra aisément cet exercice en s’inspirant des sections précédentes.
# Le logiciel Octave possède une instruction de résolution approchée
pour les équations de la forme x = f (x, t ) et une instruction de résolution approchée pour les équations de la forme f (x , x, t ) = 0.
# !"#$
5 3
La machine peut donner une résolution formelle ; on n’est pas obligé de fixer les conditions initiales.
([y’’+100*y,y(0)a,y’(0)b],y) renvoie Réponse du logiciel [a*cos(10*x)+(b*sin(10*x))/10]
161
! 4 Mais on atteint vite les limites du calcul symbolique : l’instruction suivante échoue.
([y’’+y^2,y(0)a,y’(0)b],y)
5 !
Pour le tracé des équations unidimensionnelles du premier ordre, les instructions
et
sont très pratiques.
! ) /
Illustrons cette méthode bien connue : on note l’équation différentielle du premier ordre sous la forme u (t ) = f u(t ), t et on l’étudie sur un intervalle [a ; b] avec la condition initiale y(t ) = u0 et on utilise l’approximation u (t )
u(t + h) − u(t ) h
quand h est « suffisamment petit ». On choisit ici h = fixé de subdivisions. Cela se traduit par
b−a N ,
avec N un nombre arbitrairement
Eu(f,N,a,b,uo):{ S,X,Y,k,Cnum,Cexact,sexact,u,P,t; S:()); / / s u i t e d e s p o i n t s , v i d e a u d é p a r t X:a; / / o n p a r t d e x a Y:uo; / / o n p a r t d e y u o (k:0;k<N;k++){ / / o n v a c o n s t r u i r e N p o i n t s Y:Y+f(Y,X)*(b-a)/N; / / l e p a s e s t d e ( b − a ) / n X:a+k*(b-a)/N; / / o n a v a n c e d ’ u n p a s P: (X,Y); S:S,P; / / o n r a j o u t e l e n o u v e a u p o i n t } sexact: ([y’f(y,x),y(0)uo],y)[0]:; avoir
la
solution
notre
polygone
//
on
utilise
Cnum: (polygone_ouvert(S), +line_width_2):; Cexact: ( (sexact,xab), + graphe
de
Cnum,Cexact; }:;
la //
solution on
dsolve
pour
exacte
trace
):;
//
//
on
on
construit
construit
le
attendue les
deux
graphes .
Ensuite, on va faire varier N pour visualiser la convergence, par exemple dans le cas de l’équation y (t ) = −4y(t ) + t sur [0 ; 3] avec y(0) = 1 : n: (10 500); Eu((u,t)->-4*u+t,n,0,3,1)
162
&
donne :
! ) 3 /
Voici un exemple de découverte de la fonction exponentielle avec la méthode d’Euler sous forme d’un TP pour des élèves de Terminale S débutants en informatique.
1 + On s’intéresse aux fonctions f dérivables sur R satisfaisant la condition f (x) = k · f (x)
(1)
pour tout x ∈ R, avec k un réel arbitrairement fixé. On va tenter, dans cette section, d’obtenir une approximation de l’allure de la courbe représentative d’une solution de (1). On va pour cela considérer que pour h « suffisamment petit » et pour tout réel a, f (a)
f (a + h) − f (a) h
Montrez alors que f (a + h) (1 + kh) f (a).
0 5 Pour obtenir ce tracé, nous allons choisir un réel k, un segment [a; b], nous allons fixer l’image de a par f pour avoir une solution unique de (1) dans un premier temps. Nous allons subdiviser le segment [a ; b] en N segments de même longueur : quelle sera la longueur de chaque petit segment ?
, Ouvrons une fenêtre de géométrie en tapant simultanément sur et . On définit un point dont on connaît les coordonnées avec la commande :
163
! 4 A: (1,2); B: (3,-1); C: (4,5);
On relie ces points par des segments de droite grâce à la commande de points) :
(liste
polygone_ouvert(A,B,C)
Oublions pour un temps notre problème et voyons comment nous pourrions tracer « point par point » sur [−3 ; 3] la courbe représentative d’une fonction g vérifiant : g (b) − g (a) =2 b−a pour tous réels distincts a et b de [−3 ; 3] et f (−3) = −1. On peut par exemple subdiviser le segment [−3; 3] en segments de longueurs 0,25 et réfléchir au moyen d’obtenir les images par f de chacune des extrémités des segments de la subdivision. g (x+0,25)−g (x) Il suffit de penser que x+0,25−x = 2, c’est-à-dire g (x + 0, 25) = ...... + g (x). On peut donc calculer g (x + 0, 25) si l’on connaît g (x). On va donc partir du point de coordonnées (−3 ; −1) et obtenir de proche en proche les coordonnées de plusieurs points de la courbes en faisant des petits sauts de 0,25 et en s’arrêtant à 3: S:()); / / o n c r é e X:-3; / / a u d é p a r t Y:-1; / / a u d é p a r t X<3 S:S, (X,Y);
une
suite
de
X
vaut
−3
Y
vaut
−1
//
tant
//
on
que
points
vide
s ’ écrit
rajoute
le
au
tantque
point
de
départ
en
XCAS
coordonnées
(X,Y)
à
notre
liste
X:X+0.25; / / o n a v a n c e d e 0 , 2 5 à c h a q u e t o u r Y:0.5+Y; / / o n s a i t q u e g ( X + 0 , 2 5 ) 0 , 5 + g ( X ) :; / / f c omme f i n d e l a b o u c l e polygone_ouvert(S); / / o n r e l i e l e s p o i n t s d e l a
de
boucle
liste
S
à
la
règle
et on découvre sans surprise qu’il s’agit d’un segment de droite.
Cela fonctionne pour ce cas particulier mais ça devrait aussi « marcher » si l’on change les valeurs du pas, du coefficient directeur, des bornes de l’intervalle de définition, de l’image de la borne inférieure de cet intervalle. On a donc envie de créer un fonction informatique, une procédure, qui reprend cette méthode mais dans le cas général, avec des coefficients quelconques qu’on donnera à l’ordinateur. On crée ainsi une sorte de fonction de plusieurs variables.
164
&
Notons donc h le pas, m le coefficient directeur, [a ; b] l’intervalle de définition et yo l’image de a. Donnons également un nom à notre procédure, par exemple TraceAffine. On va ouvrir une fenêtre de programmation en tapant : TraceAffine(h,m,a,b,yo):{ notre
//
on
précise
quels
sont
les
variables
de
procédure
S:()); / / o n c r é e t o u j o u r s u n e s u i t e d e p o i n t s X:a; / / a u d é p a r t X v a u t a c e t t e f o i s Y:yo; / / a u d é p a r t Y v a u t y o X<b / / o n s ’ a r r ê t e à X b S:S, (X,Y); / / o n r a j o u t e l e p o i n t de
vide
au
départ
coordonnées
(X,Y)
à
notre
liste
X:X+h; / / o n a v a n c e d e h à c h a q u e t o u r d e Y:h*m+Y; / / o n s a i t q u e g ( X + h ) h * m+ g ( X ) :; / / f c omme f i n d e l a b o u c l e polygone_ouvert(S); / / o n r e l i e l e s p o i n t s d e }:; / / o n t e r m i n e l a p r o c é d u r e e n f e r m a n t l ’
boucle
la
liste
S
à
la
règle
accolade
Pour valider, on clique sur . Pour exécuter cette procédure, on place le curseur sur une ligne de commande. Par exemple, pour retrouver le cas précédent, on rentre : TraceAffine(0.25,2,-3,3,-1)
7 5 8 Vous êtes maintenant armés pour adapter ce que nous venons de voir à la méthode d’Euler sachant que cette fois f (X + h) = (1+ kh) f (X) comme nous l’avons vu au premier paragraphe. Construisez donc une procédure Euler(h,k,a,b,yo)...
9 , Il est vu en cours de Terminale S que la solution de l’équation différentielle y = y avec y(0) = 1 s’appelle la fonction exponentielle qui se note exp pour XCAS. Nous avons utilisé une approximation pour obtenir son tracé par la méthode d’Euler. Il est bien sûr primordial d’avoir un ordre de grandeur de l’erreur commise. Nous avons écrit que exp(a + h) (1 + h) × exp(a). Créons alors une fonction Exp(h,x) qui donne une approximation de ex pour un h donné. Il suffit d’utiliser la procédure précédente en ôtant la partie concernant le tracé et en prenant a = 0, k = 1, b = x : Exp(h,x):{ X:0; Y:1; X<x X:X+h; Y:(1+h)*Y;
165
! 4 :; }:;
Par exemple, on peut comparer Exp(h,1) et exp(1) pour des valeurs successives de h entre 0,1 et 0,0001, puis en prenant d’autres valeurs de x. Exp(0.01,x)−exp(x) pour différentes valeurs de x. Étudiez le rapport exp(x) Que pensez-vous de l’approximation ? On peut visualiser l’erreur commise en créant une fonction erreur : erreur(x):(1-Exp(0.01,x)/ ( (x)))*100
Puis en créant la suite des points de coordonnées (x,erreur(x)) pour x variant de 0 à 100 avec un pas de 1. La commande comme séquencea permet de créer cette suite de valeurs :
( (x,erreur(x)),x0100) Des commentaires ?
:
+ /+ Dans les équations différentielles ordinaires le logiciel Maxima trahit plus de bouteille que le logiciel XCAS... Le même problème classique
'(’ (y,x,2)=-100*y,y,x); ne donne pas de surprise. Réponse du logiciel y=%k1sin(10x)+%k2cos(10x)
Mais le problème non linéaire
'(’ (y,x,2)=y^2,y,x); apporte une réponse plus substantielle que le logiciel XCAS Réponse du logiciel sqrt(3)*integrate(1/sqrt(y^3+3*%k1),y))/sqrt(2)=x+%k2, (sqrt(3)*integrate(1/sqrt(y^3+3*%k1),y))/sqrt(2)
Le chapitre d’aide sur les équations différentielles décrit d’autres instructions puissantes, notamment pour résoudre des conditions initiales et des conditions aux limites. a C’est-à-dire « suite ».
166
# '!(
, # / #0 On obtient la même chose sur MuPAD D’une part ode(y’’(t)-100*y(t),y(t));
(%)
Réponse du logiciel {C1*exp(-100*t) - 1/100*C2}
et ode(y’’(t)(y(t))^2,y(t));
(%) renvoie
Réponse du logiciel {0} union solve(int(1/(y^3 - 3*C20)^(1/2), y) = 1/3*2^(1/2)*3^(1/2)*(C25 + t), y) union solve(int(1/(y^3 - 3*C20)^(1/2), y) = -1/3*2^(1/2)*3^(1/2)*(C28 + t), y)
167
Transformée de Laplace Logiciel(s) abordé(s) : Maxima XCAS
Problématique : Premiers contacts avec la transformée de Laplace.
,
# /+
Le logiciel Maxima donne la transformée de Laplace F(p) de la fonction f (x) conformément à la formule F(p) =
+∞
f (x)e −px d x
0
avec l’instruction $$ &= =&. La transformée de e ax est calculée en saisissant : g(x):= (a*x); G(p):= (g(x),x,p); G(p);
On retrouve la fonction de départ avec la transformée inverse :
(G(p),p,x); La machine connaît la relation élémentaire entre la transformée et celle de sa dérivée : F(p):= ( (f(x),x),x,p);
Résolvons l’équation différentielle ordinaire du premier ordre à coefficient constant : y = a y + ch(ax) avec y(0) = 1. F(p):= ( (y(x),x)-a*y(x),x,p); F(p);
nous donne la relation entre la transformée de la fonction inconnue y et celle du second membre ch(ax). g(p):= ((a*x),x,p); y(x):= ((g(p)+1)/(p-a),p,x); y(x);
: La résolution d’une"équation linéaire à coefficients constants de n’importe quel ordre est si+∞ milaire. Calculons 0 sin(x)/x d x. On sait que la transformée de −x f (x) est la dérivée de la transformée de f (x). Si F(p) est la transformée de sin(x)/x, sa dérivée F (p) est donnée par : Fprime(p):= (-(x),x,p);
L’intégrale recherchée est la valeur F(0). Comme F tend vers 0 en +∞, c’est aussi −
+∞
F (p) d p.
0
La fonction Arctan est une primitive de −F , on obtient donc π/2 : I: (Fprime(p),p,,0);
, # !"#$ Le logiciel XCAS a un comportement similaire à Maxima. La transformée inverse s’appelle au lieu de . g(x): (a*x) G(p): (g(x),x,p) G(p) (G(p),p,x) F(p): ( (f(x),x),x,p) F(p)
Il ne connaît pas les relations entre transformée et dérivée, mais il peut résoudre aussi l’équation différentielle : g(p): ((a*x),x,p) y(x): ((g(p)+1)/(p-a),p,x) y(x)
L’intégrale est calculée de la même façon ; attention à la dernière ligne : la définition d’une constante et la notation de l’infini diffèrent de Maxima. Fprime(p): (-(x),x,p) I: (Fprime(p),p,+ ,0);
170
Troisième partie
THÈMES
XCAS au lycée ? Logiciel(s) abordé(s) : XCAS
Problématique : Comment et pourquoi utiliser XCAS au lycée.
!"#$ & &
XCAS existe depuis quelques années mais est très mal connu au lycée car sa puissance fait peur. XCAS permet en effet de traiter des problèmes très sophistiqués, mais également (ce qu’on passe souvent sous silence !) des problèmes très simples qui permettent par exemple d’initier des élèves de l’école primaire à la programmation ! Nous commencerons par évoquer la géométrie dynamique au lycée car c’est un domaine où une comparaison avec les logiciels massivement utilisés par les professeurs du secondaire est possible, ce qui n’est pas le cas du calcul formel, de la programmation et surtout la possibilité d’associer les trois plus le tableur qui constitue une des grandes forces de XCAS. Un argument souvent soulevé par ses détracteurs est que XCAS fonctionne principalement en ligne de commande. Notre expérience avec les élèves nous incitent à dire qu’il ne s’agit pas d’un inconvénient mais plutôt d’un avantage pour eux : les élèves de nos classes sont en effet habitués à dialoguer via leur ordinateur sur les sites de messagerie instantanée. Le petit bémol qu’on pourrait apporter est qu’avec XCAS, il ne faut pas faire de fautes d’orthographe ! Les commandes sont de plus en français et adaptées aux besoins des élèves français car créées par des professeurs de l’Institut Joseph F OURIER de l’Universite Joseph F OURIER de Grenoble et testé grâce à l’IREM. Que dites-vous de : parallele, droite, segment, aire, longueur, angle, resoudre, graphe, cercle, circonscrit, simplifier, factoriser, fonction_derivee,symetrie,... ?
Le mode de construction d’une figure et de résolution du problème correspond de même à la démarche suivie par l’élève sur sa feuille de papier. Pour vous en convaincre, reportez-vous à la section b. page 69.
!"#$
Il existe deux types principaux de sujets proposés pour l’épreuve expérimentale du Bac S : les problèmes que peuvent traiter les logiciels de géométrie dynamique que nous venons d’étudier et l’étude de suites à l’aide du deuxième pilier de l’Éducation Nationale, le tableur.
;0 # < Nous allons donc nous intéresser à ce deuxième type de sujet. Voici par exemple le sujet 5 de la banque d’exercices de 2007 : Étude de la suite un+1 = a · un + b pour a et b donnés : convergence et valeur de la limite. On supposera par la suite que a = 1. En effet, dans le cas contraire, un+1 = un + b : la suite est donc arithmétique et ne mérite pas une étude poussée... On construit une procédure donnant un en fonction de a, b et le premier terme u0 . On traite le cas n = 0 pour initialiser. Ensuite il suffit de rentrer l’expression de un en fonction du terme précédent : u(n,a,b,uo):{ n0 uo; a*u(n-1,a,b,uo)+b;
//
C ’ e s t −à − d i r e
u(n)
a * u ( n − 1 ) + b
}:;
Par exemple, pour a = 0, 7, b = 1 et u0 = 1, on obtient : u(100,.7,1,1);u(500,.7,1,1)
//
le
1 0 0 − ème
et
le
5 0 0 − ème
terme
Réponse du logiciel 3.333333333,3.333333333
On peut préférer fixer a,b et u0 hors de la procédure et définir u de manière plus standard ainsi : u(n):{ n0 a*u(n-1)+b
uo;
}:;
et alors : a:0.7 b:1 uo:1 u(100);
On a l’impression d’avoir de sérieux candidats pour la valeur de la limite. Pour confirmer cette intuition, représentons graphiquement les premiers termes de la suite. On crée une séquence S de coordonnées, vide au départ, à laquelle on ajoute les points coordonnées (k, uk ) pour k variant de 0 à n :
174
! AffSuite(n,a,b,uo):{ S,k; S:()); / / S e s t v i d e a u d é p a r t : i l n ’ y a p a s e n c o r e (point_carre+ ); / / p o u r l ’ e s t h é t i q u e . k de 0 , n 1 S:S, (k,u(k,a,b,uo)); / / o n r a j o u t e l e p o i n t d e
k) )
à
notre
de
points
coordonnées
(k ,u(
liste
}
On affiche les valeurs de la suite ainsi que la limite présumée issue de notre calcul : AffSuite(20,-.5,1,1), (0.66666667,x020, )
et on obtient pour a = 0, 7, b = 1 et u0 = 1 :
et pour a = −1/2, b = 1 et u0 = 1 :
Notre intuition est confortée.
175
;0 # <
Complexité d’un algorithme Cette manière de procéder peut sembler naturelle et proche d’une démarche « papier-crayon », mais n’est pas optimale informatiquement. On peut, pour la culture des élèves, évoquer le problème crucial de la complexité d’un algorithme. En effet, dans AffSuite, on recalcule u(k,a,b,uo) à chaque tour de boucle : pour aller jusqu’au rang n, on effectue donc 1 + 2 + 3 + · · · + n = n(n+1) calculs. 2 On dit que la complexité de l’algorithme est de l’ordre de n 2 . Voici une manière plus « informatique » et efficace de procéder : AffSuiteBis(n,a,b,u0):{ S,k,uk; (point_carre+ ); S: (0,u0); / / p r e m i e r t e r m e k:u0; k de 1 , n 1 uk:a*uk+b; S:S, (k,uk); / / o n r a j o u t e
à
notre
le
point
de
coordonnées
( k , u_k )
liste
}
On effectue n calculs pour avoir AffSuiteBis(n,a,b,uo) : la complexité est maintenant de l’ordre de n. Le problème de la complexité est ici accessoire car dans les deux cas l’ordinateur effectue ces calculs simples très rapidement. Cependant, quand les algorithmes sont plus sophistiqués, cela peut permettre de sauver beaucoup de temps. On peut même évoquer le système RSA qui assure la sécurité des transactions sur internet ou bancaires et dont la sécurité est basée sur la complexité informatique du cassage du code théoriquement possible mais hors du temps humain pour l’instant.
Nous pouvons aussi remarquer que un+1 = f (un ), avec f (x) = ax + b. Nous pouvons représenter la suite directement avec la fonction XCAS
((f(x),u(0),n) :
(0.7*x+1,1,10)
qui affiche un graphe que les élèves de terminales savent interpréter :
176
!
Le candidat pour la limite semble être l’intersection des droites d’équations y = ax+b et y = x. On obtient la solution avec (équation,inconnue) :
((7/10)*x+1x,x) Réponse du logiciel
10 3
Il ne reste plus qu’à le démontrer... Soit p la solution de ax + b = x. Elle existe bien car on a supposé a = 1. Alors, en effectuant la différence membre à membre de un+1 = aun + b et p = ap + b, on obtient : un+1 − p = a(un − p) Donc la suite (un − p) est géométrique de raison a et de premier terme u0 − p. On obtient donc un = (u0 − p)a n + p Vérifions : expu(n,a,b,uo):{ p,c; p: (a*x+bx)[0]; / / l a s o l u t i o n d e l ’ é q u a t i o n c: (uo-p); / / o n s i m p l i f i e l ’ é c r i t u r e d e u 0 − p (c*a^n+p) / / o n r e n v o i e ( uo − p ) * a ^ n + p }:;
Par exemple, toujours avec a = 0, 7, b = 1 et u0 = 1 : expu(n,7/10,1,1)
177
;0 # < Réponse du logiciel
! 7 n −7 · 10 10 + 3 3
Comparons maintenant les graphes : AffSuite(20,7/10,1,1), (expu(x,7/10,1,1),x020, )
Et voilà... Nous pouvons même nous payer le luxe de vérifier que expu vérifie la formule de récurrence initiale dans le cas général, c’est-à-dire pour a, b, u0 quelconques ! Ce confort n’est bien sûr possible qu’avec un logiciel de calcul formel... expu(n+1,a,b,uo)-(a*expu(n,a,b,uo)+b) Réponse du logiciel
(a · uo + b − uo) ·
1 a−1
· (a)n+1 −
b a−1
! − a · ((a · uo + b − uo) ·
1 a−1
Oups...
(())
//
simplifie
le
résultat
précédent
Réponse du logiciel 0
178
· (a )n −
b a−1
!! ) −b
& %! !1 ! 22 ! 5
C’est mieux ! Nous pouvons aller jusqu’à calculer la limite de la suite dans le cas général :
(expu(n,a,b,uo),n,+ ) Mais XCAS ne sait que répondre... Il faut bien sûr distinguer les cas :
(a>0) (a<1); / / 0
−b a−1
et dans le cas a > 1 :
(a>1); (expu(n,a,b,uo),n,+ ) Réponse du logiciel infinity
Ainsi, XCAS nous permet non seulement d’observer le résultat mais surtout de le démontrer grâce à ses facultés de calcul formel. Nous allons illustrer plus précisément ce point dans le paragraphe suivant.
" 7 % <
) ! +
Les coniques ne sont plus au programme de terminale mais sont encore sources d’activités. Nous allons ici nous occuper d’un théorème concernant le tracé de la tangente à une conique et le prouver à l’aide de XCAS ce qui n’est possible qu’avec un logiciel de calcul formela . Le théorème initial est le suivant : a Cette activité est traitée plus longuement à la section 5.2 page 211.
179
;0 # <
Construction de la tangente à une conique Soit Γ une conique de foyer F et de directrice associée D. La tangente à Γ en tout point M qui n’appartient pas à l’axe focal coupe D en un point T tel que l’on ait −−→ −→ FM · FT = 0
Nous allons adapter l’énoncé au cas d’une demi-ellipse définie à l’aide d’une fonction : Soient a et b deux réels strictement positifs tels que a > b et f la fonction définie sur [−a ; a] par ( f (x) = b
1−
x2 a2
− → Notons Γ la courbe représentative de f dans un repère orthonormé O; → u ,− v . 2 Soit F le point de coordonnées ( a 2 − b 2 ; 0) et D la droite d’équation x = a2 2 . a −b Montrez que la tangente à Γ en tout point M d’ordonnée non nulle coupe D en un point T tel −−→ −→ que l’on ait FM · FT = 0 Nous pouvons bien sûr commencer par illustrer des cas particuliers en prenant un point mobile sur Γ et en observant que la propriété reste vérifiée. Nous allons sauter cette étape, notre propos étant de montrer comment un logiciel de calcul formel permet non seulement d’illustrer mais aussi de prouver un théorème général. Nous commençons par définir la fonction f : f:x->b* (1-(x^2/a^2)):;
Nous allons ensuite considérer un point quelconque de Γ d’abscisse t , avec t ∈] − a ; a[ :
(a>0):; (t>-a) (t
qui renvoient l’abscisse et l’ordonnée d’un point bien sûr, et la commande qui permet de définir une droite de multiples façons (par une équation, deux points, comme intersection de deux plans, une représentation paramétrique...). Nous la définirons ici par l’équation classique y = f (x) × (x − xM ) + f (xM ) : fp:
(f):; d: (yfp( (M))*(x- (M))+
(M)):;
180
& %! !1 ! 22 ! 5
Mode « muet » Vous noterez que chaque ligne de commande se termine par :; ce qui indique à XCAS qu’il doit évaluer cette ligne mais sans renvoyer de résultat. En effet, aucun tracé ne peut être effectué pour l’instant car aucune valeur numérique n’est affectée aux paramètres a, b et t .
Il reste à définir le point F et la droite D : F: ( (a^2-b^2),0):; D: (xa^2/ (a^2-b^2)):;
Le point T est l’intersection des droites d et D. On utilise la commande (ensemble1,ensemble2) : T:
(d,D):;
−−→ −→ Il ne reste plus qu’à calculer le produit scalaire FM · FT à l’aide de
.
( (M,F), (T,F))
Calcul vectoriel Un vecteur pour XCAS est une liste de coordonnées entre deux crochets tout comme l’est un point. L’opération M − F est donc licite pour XCAS. Pour ne pas semer le trouble dans les esprits des élèves du lycée, on peut remplacer M − F par coordonnees(M)-coordonnees(F), ou bien, pour éviter de calculer avec des systèmes de coordonnées, on peut préférer travailler sur les affixes en rentrant
( (M)- (F), (T)- (F)) On peut également demander à Bernard PARISSE de créer une commande vecteur(M1,M2) synonyme de M2-M1 pour l’ordinateur mais moins choquante pour les élèves. C’est ce que j’ai fait... et obtenu une heure plus tard ! Encore un point fort de XCAS...
Ainsi :
( (F,M), (F,T)) 181
;0 # < Réponse du logiciel
t−
a2 − b2 (
(−a4 + a2 t2 ) a2 − b2 −a 4 + a 2 t 2 + ( a 2 − t 2 ) b 2
−
%
a 2 − (b 2 ) +
t2 b 1 − 2 a a2 − t2 · b3 − a3 a2 − t2 · b + at a2 − t2 · b · a2 − b2 a −a 4 + a 2 t 2 + a 2 − t 2 · b 2
Ouh la la... Voici un calcul qui a de quoi déprimer n’importe quel élève de lycée. Heureusement, nous pouvons faire effectuer « le sale boulot » à XCAS grâce à la commande et se concentrer sur le problème géométrique sans être gêné par les difficultés de calcul algébrique. Cette fois-ci :
( ( (M,F), (T,F))
renvoie bien 0, ce qui prouve notre théorème car les calculs ont été effectués dans le cas général.
7 !"
Pour observer ce phénomène en géométrie dynamique, il suffit d’ouvrir une fenêtre de géométrie en tapant - puis en définissant a, b et t comme étant des paramètres que nous ferons varier à la souris : a: b: t:
(05)
(0a)
(-aa)
le reste des instructions restant inchangé. On obtient :
182
' 2
$
Nous voici donc en mesure de tracer n’importe quelle tangente à une ellipse à l’aide d’une équerre puisqu’il suffit de tracer la perpendiculaire à (MF) en M puis l’intersection T de cette droite avec une directrice : la tangente est la droite (TM). Il s’agit d’un problème géométrique. L’ordinateur nous permet de prouver ce théorème en se dispensant de passer trop de temps dans des calculs algébriques compliqués : nous restons dynamiques mathématiquement sans être perturbés par l’aquisition d’une virtuosité algébrique ou informatique. Les instructions données correspondent à la démarche mathématique. Nous avons fait des mathématiques et très peu d’informatique en somme. Nous nous sommes concentrés sur le raisonnement et l’ordinateur nous a permis de ne pas nous perdre dans les calculs. Le travail avec un calculateur formel est donc la continuation logique du travail avec une calculatrice usuelle, mais en offrant beaucoup plus de possibilités bien sûr.
/ On reproche souvent à l’utilisation de l’informatique au lycée d’exister pour elle-même et de semer la confusion dans les esprits des élèves en les incitant à confondre observation et preuve. On peut également remarquer que sur les 97 propositions de sujets pour l’épreuve expérimentale du Bac S 2008, les domaines traités couvrent une très petite partie du programme du Bac : essentiellement les suites, la géométrie, voire un peu de probabilités. Ces reproches sont souvent justifiés compte tenu des limitations des logiciels promus officiellement : le tableur et les logiciels de géométrie dynamique, par essence, ne permettent
183
;0 # < que d’observer des données numériques ou géométriques et ne peuvent élaborer une preuve générale, ce que peut faire un logiciel de calcul formel. Ils ne peuvent non plus aborder le calcul différentiel, intégrale, algébrique que de manière numérique ou expérimentale et donc passent à côté de la plus grande partie du programme de terminale S. D’un autre côté, on reproche aux logiciels de calcul formel d’être trop compliqués à utiliser au lycée. Nous venons de voir que c’est injustifié et qu’au contraire travailler en ligne de commande et ainsi dialoguer naturellement avec l’ordinateur peut en fait être beaucoup plus simple que de naviguer dans des menus, sous-menus et autres sous-sous-menus d’icônes à cliquer. Enfin, de manière plus précise, le logiciel XCAS semble être particulièrement adapté au lycée car il permet à la fois de faire du calcul formel, de la géométrie dynamique, du tableur et est largement francisé. Il resterait à parler de l’initiation à la programmation qui devrait faire partie du bagage minimum fourni aux élèves des sections scientifiques (ce qui est le cas dans de nombreux pays européens) et qui peut être également abordée grâce à XCAS dès la seconde comme nous en avons fait l’expérience depuis plusieurs années dans nos classes... et même dès l’école primaire grâce à la Tortue de XCAS... Pour un autre exemple d’activité au lycée avec XCAS, voir la section d. page 163.
184
Logique élémentaire Logiciel(s) abordé(s) : Yacas
Problématique : Apprendre les rudiments de logique en s’amusant.
Notions informatiques : Le logiciel Yacas permet un tout petit peu de calcul logique avec la commande 84 . Ce calcul est aussi appelé algèbre de Boole. Il n’est pas question de développer ni de simplifier les expressions logiques sous Yacas. C’est à l’utilisateur de faire le calcul par lui-même pour ensuite demander à la machine de le valider.
Si l’argument de la commande 84 (le prédicat) est une tautologie, la machine répond True; et si c’est toujours faux (le contraire d’une tautologie), la machine répond False;. Si la machine ne peut décider, elle recopie le prédicat. Les opérateurs logiques habituels s’écrivent dans un style assez naturel (en anglais) avec une majuscule initiale. Il faut bien sûr veiller à respecter les parenthèses qui regroupent les objets. Vérifions d’abord l’axiome du tiers exclu. On suppose que le prédicat A n’a pas été utilisé plus avant dans la session Yacas.
84 (A (
A)
C’est toujours vrai ! La machine connaît aussi l’axiome de non-contradiction :
84 (A . (
A)
est toujours faux.
#> 1
Vérifions une des propriétés élémentaires du calcul logique, la loi de Morgan. Introduisons d’abord les instructions qui nous permettront de tester nos constructions par la suite, en les faisant réexécuter grâce aux flèches du clavier. Nous allons essayer de prouver l’équivalence de deux prédicats P et Q.
84 (P > 84 (Q >
Q) P)
La machine ne doit pas pouvoir décider maintenant. Elle répond d’ailleurs par la traduction de l’implication =: dans les opérateurs logiques élémentaires qui sont . , , ( . Plus tard, si la machine répond True; aux deux instructions ci-dessus, c’est que les prédicats P et Q seront devenus équivalents. Voici leur définition : P:( (A . B) Q:( A ( B
En réexécutant les tests logiques,
84 (P > 84 (Q >
Q) P)
les deux réponses True; nous affirment la tautologie recherchée : non
(A et B)
≡
non A ou non B.
Vérifions maintenant que la double négation est bien l’identité, c’est-à-dire que la négation est une involution. On efface d’abord Q qui sert à redéfinir P : Q
8 (Q) Q P:(
(
Q
On vérifie avec le test enjolivé :
84
( (P > Q)
.
(Q > P) )
Ce doit être toujours vrai. . . Nous pouvons donc démontrer que l’un des deux axiomes tiers exclu et non-contradiction se déduit de l’autre grâce aux deux propriétés ci-dessus.
8 (A);8 (B) P:( (B . ( A) Q:A ( B 84 ( (P > Q) .
(Q > P) )
Le test démontre que « A ou non B » est la négation de « B et non A ». En remplaçant B par A, on constate qu’obtenir la première réponse (vrai) de ce chapitre équivaut à obtenir la deuxième réponse (faux).
% Le raisonnement par l’absurde consiste à démontrer une implication en démontrant que sa contraposée (c’est-à-dire son contraire) est fausse. Redéfinissons les prédicats P et Q pour réutiliser la procédure de test.
186
& ) ! P: ( (x > y) Q: x . ( y 84 ( (P > Q)
.
(Q > P) )
On obtient la technique courante : si l’on réussit à démontrer que la proposition « x et pas y » est fausse, c’est que x implique y.
On ne peut pas renverser le sens de l’implication, le symbole A signifie inférieur ou égal : ≤ pour Yacas.
187
Théorème de Pappus Logiciel(s) abordé(s) : XCAS
Notions informatiques : Nous allons exploiter les capacités calculatoires de l’ordinateur pour résoudre analytiquement des problèmes géométriques. >
Problématique : Le traitement algébrique de l’alignement des points grâce aux coordonnées barycentriques va nous permettre de donner une preuve rapide du théorème de Ménélaüs. Le délicat problème des cercles de Pappus peut être efficacement traité analytiquement en demandant à XCAS de résoudre des systèmes non linéaires.
"
&
. )
Il est facile de montrer le résultat suivant :
Soient A, B et C trois points non alignés du plan. Alors, pour tout point M du plan, il existe trois réels α, β et γ tels que α + β + γ = 0 et tels que M soit le barycentre des points A,B et C affectés des coefficients α, β et γ.
−→ −→ −−→ −−→ Il suffit d’exprimer le vecteur AM dans la base AB, AC . Soient a et b les coordonnées de AM dans cette base, on obtient −−→ −−→ −−→ → − (1 − a − b)AM + a BM + b CM = 0 On appelle (α, β, γ) un système de coordonnées barycentriques de M dans le repère affine (A,B,C). Si α + β + γ = 1, le système est dit normalisé.
=> On obtient facilement une condition d’alignement de trois points :
Soit (A,B,C) un repère affine et trois points M1 , M2 et M3 de coordonnées barycentriques normalisées respectives (x1 , y 1 , z1 ), (x2 , y 2 , z2 ), et(x3 , y 3 , z3 ). Alors M1 , M2 et M3 sont alignés si, et seulement si & & &x1 & &x & 2 & &x 3
& & z1 & & z2 && = 0 & z3 &
y1 y2 y3
Il suffit de remarquer que & & &x 1 & & &x 2 & & &x 3
y1 y2 y3
& & & & z1 && &&x1 + y 1 + z1 & & z2 && = &&x2 + y 2 + z2 & & z 3 & &x 3 + y 3 + z 3
y1 y2 y3
& & & & z1 && &&0 & & z2 && = &&0 & & z 3 & &1
y1 − y3 y2 − y3 y3
& & z1 − z3 && & z2 − z3 && = (y 1 − y 3 )(z2 − z3 ) − (y 2 − y 3 )(z1 − z3 ) & z3 &
−−−−→ −−−−→ Ce déterminant est nul si, et seulement si, les vecteurs M1 M3 et M2 M3 sont liés, i.e. les points sont alignés. Cela nous permet d’avoir un outil calculatoire pour tester l’alignement de points : xb:M->1- (M)-
(M); barycentrique
//
donne
la
1 ère
coordonnée
normalisée
yb:M-> (M); zb:M->
(M); cb:M->[xb(M),yb(M),zb(M)]; / / d o n n e l e s y s t è m e n o r m a l i s é align(A,B,C):{
([cb(A),cb(B),cb(C)])0 ("les points sont alignés "); ("les points ne sont alignés");;}:;
Alors : align( (1+), (2+2*), (3+3*))
renvoie : Réponse du logiciel les points sont alignés
. ! + @
Rappelons ce théorème
190
& 2 %!
Soit ABC un triangle. Soit trois points I, J et K appartenant respectivement aux droites (BC), (CA), (AB) et distincts des trois sommets A, B et C. Alors I, J et K sont alignés si, et seulement si IB IC
×
JC JA
×
KA KB
=1
Nous allons bien sûr utiliser la condition d’alignement vue précédemmenta . Nous allons travailler dans le repère affine (A,B,C) et mettre en évidence l’appartenance des points aux droites A:[1,0,0]:; B:[0,1,0]:; C:[0,0,1]:; K:A+k*B:; J:j*A+C:; I:x*B+C:;
Par exemple I admet donc pour coordonnées barycentriques Réponse du logiciel [0,x,1]
C ONDITION NÉCESSAIRE. On suppose que les points sont alignés. On peut alors traduire cette propriété par le fait que & & & xI & &x & J & &x K
yI yJ yK
& & zI & & zJ && = 0 & zK &
(1)
Exprimons alors x en fonction des autres coefficients x: (
([I,J,K])0,x)[0]
Effectuons alors le produit proposé
((-I[1]/I[2])*(-J[2]/J[0])*(-K[0]/K[1])) Nous trouvons bien le résultat attendu : XCAS a prouvé la condition nécessaire. C ONDITION SUFFISANTE. On prend soin de « purger » la variable x de la valeur trouvée précédemment a Pour d’autres démonstrations plus classiques, voir S ORTAIS , Yvonne/S ORTAIS , René La géométrie du triangle . Paris:
Hermann, 1987
191
=> (x) On utilise cette fois-ci l’égalité (1) x: ((-I[1]/I[2])*(-J[2]/J[0])*(-K[0]/K[1])1,x)[0]
Les points sont-ils alignés ?
([I,J,K]) Oui, répond XCAS : la preuve est faite !
> / Le 5 août 2007, nous sommes tombés sur la figure suivante parue dans le journal Le Monde yC M_6
7 M_3 6
5
c
4
T 3
O M_4
2
1 M_5 A
M_2
M_1
B x
0
-1
-6
-4
-2
0
2
4
Problème du Monde du 5 août 2007
6
La question étant : est-ce que CM6 + AM2 + BM4 = CM3 + BM1 + AM5 ? Il faut préciser que le triangle est équilatéral. Demandons à XCAS R: (05); x: (-33); y: (-15); O: (x,y); / / u n p o i n t O v a r i a b l e c: (O,R); / / l e c e r c l e c a u s s i a: (0 5,); A: (-a,0);B: (a,0); T: ( (A,B,C), +line_width_2) triangle
192
bleu
à
côté
variable
//
un
beau
&& ! M_1: (c,T)[0];M_2: (c,T)[1]; M_3: (c,T)[2];M_4: (c,T)[3]; M_5: (c,T)[4];M_6: (c,T)[5];
//
on
construit
les
points
Il ne reste plus qu’à tester l1: (C,M_6)+ (A,M_2)+ (B,M_4); l2: (C,M_3)+ (A,M_5)+ (B,M_1);
Cela semble concluant... Il ne reste plus qu’à le démontrer. Il suffit de penser à la puissance des sommets par rapport au cercle... On obtient successivement :
➥
CM6 CM5 = CM3 CM4
➥
AM2 AM1 = AM5 AM6
➥
BM4 BM3 = BM1 BM2
Puis, en additionnant membre à membre ces égalité et en notant a le côté du triangle CM6 (a − AM5 ) + AM2 (a − BM1 ) + BM4 (a − CM3 ) = AM5 AM6 + BM1 BM2 + CM3 CM4 et le résultat s’en déduit :
a(CM6 +AM2 +BM4 ) = AM5 (AM6 +CM6 )+BM1 (BM2 +AM2 )+CM3 (CM4 +BM4 ) = a(AM5 +BM1 +CM3 )
" %%
! ! "
D’abord un dessin :
Cercles de Pappus Comment tracer cette figure ?
193
=> Au IIIe siècle avant J.C., le mathématicien grec Pappus proposa le théorème suivant qui va nous aider dans notre construction. Il s’agit du théorème XV du livre IV de ses Collections mathématiques traduites du grec pour la première fois en 1932 seulement par Paul V ER E ECKEb .
Théorème de Pappus On considère trois demi-disques (C), (Γ) et (C0 ) centrés sur une droite (d). On suppose que (C) et (C0 ) sont contenus dans (Γ), tous deux tangents à Gamma et tangents entre eux. Soit (C1 ), (C2 ), . . . , (Cn ) une suite de cercles tangents à (C) et à (Γ) et tel que chaque cercle (Ck ) est tangent au cercle suivant (Ck+1). On note r k le rayon du cercle (Ck ) et hk la distance de son centre à la droite (d). Alors hk = 2r k pour tout k ∈ 1 ; n.
Pour des démonstrations des résultats utilisés, voirc et notammentd qui arrive rapidement au résultat en considérant des inversions. On montre de la même manière que le lieu des points de contact entre les cercles (Ck ) est le cercle bissecteur de (C) et (Γ). Une fois ces résultats en poche, la partie n’est pas gagnée car il reste encore des systèmes délicats à résoudre. C’est ici que XCAS peut nous aider avec ses capacités de calcul. On crée un point d’abscisse mobile et des cercles de rayons variables. Par commodité, on placera les centres des cercles sur l’axe des abscisses : xO: (-5 5); O: (xO,0); R: (0 5); C: ( (O,R), + r: (0 5); o: (xO-R-r,0); c: (o,r);
);
La position choisie pour o assure que les deux cercles soient tangents. Il s’agit maintenant de créer le cercle Γ. Pour obtenir son centre, on utilise la fonction ([pt,poids],...) oo:barycentre([o,r],[O,R]); cc: ( (oo,r+R), +
);
La figure de base étant faite, intéressons-nous au problème de Pappus : comment déterminer la position du centre O1 du cercle (C1 ) ? b Paul ver Eecke - « La Collection Mathématique de Pappus d’Alexandrie », introduction (1932, rééd. 1982) - Libr. A.
Blanchard, Paris c T HÉBAULT , Victor Sur le tranchet d’Archimède . Bulletin de la S.M.F. Tome 72 1944. d A BDELJAOUAD , Mahdi Éléments de Géométrie du Plan . Tunis: Association Tunisienne des Sciences Mathématiques,
2000.
194
&& !
Y /2
Y/ 2
r
Y
R
o
O
X
Détermination du cercle (C1 ) Le théorème de Pappus nous dit que le rayon de (C1 ) vaut Y/2. Le point O1 est donc l’intersection à ordonnée maximum du cercle de centre o et de rayon r+Y/2 et de celui de centre O et de rayon R + Y/2. s: ([(Y)^2(r+Y/2)^2-X^2,(Y)^2(R+Y/2)^2-(R+r-X)^2],[X,Y]); o1: ( (o)+s[0][0],s[0][1]); / / s [ 0 ] [ 0 ] e s t l ’ a b s c i s s e er
du
1
point .
c1: (o1,s[0][1]/2)
//
le
rayon
est
Y /2
Et d’un... Pour les autres cercles, nous allons utiliser le deuxième résultat, à savoir que les points de contacts sont sur le cercle médiateur de (C) et Γ. Ce cercle passe par k 1 , intersection entre (C1 ) et (C0 ) : k1: (c,c1)[0]
et I, le point de contact entre (C) et Γ : I: (C,cc)[0]
Mais connaître ces deux points ne suffit pas pour tracer le cercle. Appelons a l’abscisse du centre de ce cercle (son ordonnée est nulle) et b le rayon. Une équation du cercle est donc (x − a)2 + y 2 = b 2 . Exprimons que k 1 et I appartiennent à ce cercle que nous nommerons K : S: ([( (k1)-a)^2+(
(k1))^2b^2,( (I)-a)^2+(
(I))^2b^2],[a,b]); K: ( ( (S[1][0],0),S[1][1]), );
Ça y est ! Nous avons tous les éléments pour créer une procédure pappus(n) qui tracera les n premiers cercles tangents, et même leurs symétriques par rapport à l’axe (Ox) pappus(n):{ ks:());ks:ks,k1;
//
une
liste
//
liste
de
points
de
contact
qui
contient
déjà
k1
cs:());cs:cs,c1;
des
cercles
195
=> os:());os:os,o1; / / l i s t e d e s c e n t r e s css:());css:css, ( (y0),c1);
//
liste
des
cercles
symétriques
(j:1;j<n;j++){ ks:ks,( ( (cs[j-1],K)[1])> ( (cs[j-1],K)[0]) ) (cs[j-1],K)[1]; (cs[j-1],K)[0]; / / p o u r p r e n d r e l e b o n p o i n t d e c o n t a c t oj: (xx,yy); / / u n p o i n t i n c o n n u (x); / / o n v i d e l a v a r i a b l e x u t i l i s é e d a n s s o l v e eqj:( ( (os[j-1],ks[j]))[2],xxx); / / c e c i p e r m e t d ’ obtenir droite
(x);
l ’ ordonnée ( O _ j −1
//
on
de
oj
sachant
que
ce
point
appartient
à
la
K_j )
re − v i d e
car
on
va
utiliser
à
nouveau
solve
Ici, une pause s’impose : nous allons exprimer que O j est tel que O j −1 O j = O j −1 K j + r j , avec hj
r j = 2(j +1) comme nous l’affirme le théorème de Pappus. C’est un système peu évident à résoudre. Nous allons donner une indication à XCAS : la solution est proche de k j . Nous lui demanderons ensuite d’utiliser la méthode de Newton : fs: ([ (os[j-1],oj) (os[j-1],ks[j])+0.5*yy/(j+1) ,yyeqj],[xx,yy],[ (ks[j]),
(ks[j])],dnewton_solver );
Il ne reste plus qu’à rajouter nos cercles :
(xx,yy); os:os, (fs[0],fs[1]); / / l e n o u v e a u c e n t r e cs:cs, (os[j], (os[j],ks[j])); / / l e n o u v e a u c e r c l e css:css, ( (y0), (os[j], (os[j],ks[j]))); //
son
symétrique
};
(cs,css)
//
on
trace
les
deux
séries
de
cercles
}:;
5 " )
La méthode précédente est intéressante informatiquement et mathématiquement : elle est cependant gourmande en temps de calcul. On peut cependant voir les cercles de Pappus comme des billes molles dans un tube mou dont on aurait recollé les extrémités, ce qui nous fait bien sûr penser à... une inversion qui transforme certaines droites en des cerclese . XCAS possède une commande (pôle,rapport,point) qui calcule les coordonnées de l’image d’un point par une inversion. Le problème, c’est que nous aimerions obtenir e Merci à I VALDI , Philippe ressources Asymptote . 〈URL: http://piprim.tuxfamily.org/asymptote/travaux/
index.html〉.
196
&& !
les images d’ensembles de points et non pas de points isolés. L’idée est d’utiliser des représentations paramétriques de ces ensembles. Nous profiterons de l’existence sur XCAS des commandes (courbe) qui renvoie l’écriture paramétrique complexe d’une courbe et (affixe,paramètre). Par exemple :
( ( ( (x+iy),r)))
//
evalc
renvoie
la
forme
algébrique
Réponse du logiciel
(−r) · cos (t) + x + i · ((−r) · sin (t) + y)
Nous allons donc créer une procédure inv_courbe(C,k,g) avec C le pôle de l’inversion, k son rapport et g l’ensemble de point après avoir ouvert une fenêtre de programmation en tapant sur et : inv_courbe(C,k,g):{ paramg,paramG; paramg: (g); / / g s o u s f o r m e p a r a m é t r i q u e paramG: (C,k,paramg); / / s o n i m a g e p a r
Le
résultat
est
un
point
dont
il
faut
. l ’ inversion
«extraire»
:
attention
l ’ affixe .
(courbe_parametrique( (paramG),t-500500,tstep0.5),g); on
affiche
g
et
son
image
par
//
l ’ inversion .
}:;
On ouvre une fenêtre de géométrie avec On définit le pôle :
et
.
C: (-5)
On définit les images des bords du « tube » : inv_courbe(C,10, (x-1)); inv_courbe(C,10, (x1));
On construit les images d’une vingtaine de « billes » tangentes entre elles et aux parois du « tube ». On prend donc ici des cercles de rayon 1 et de centres situés sur l’axe des ordonnées : L:()); (j:-n; j < n; j++) { g:inv_courbe(C,10, ( (0,2*j),1)); L:L,g; }:; L
197
=> Cela donne :
Cercles de pappus obtenus en utilisant une inversion.
198
Suites et chaos
Logiciel(s) abordé(s) : XCAS
Notions informatiques : Cette brève étude sera l’occasion de découvrir les possibilités offertes par XCAS pour étudier des suites du type un+1 = f (un ). Nous construirons également une procédure qui nécessitera beaucoup d’astuce informatique afin que l’ordinateur donne un résultat en un temps raisonnable.
Problématique : Vers 1950, le météorologiste américain Edward L O RENZ étudie la circulation atmosphérique. Il se base pour cela sur les travaux des mathématiciens français H ADAMARD et P OINCARÉ sur l’imprédictibilité des systèmes simples. Même en modélisant l’atmosphère en un système ayant une dizaine de degrés de liberté, il montre la sensibilité exponentielle par rapport aux conditions initiales. Il illustre son propos en montrant que le battement d’aile d’un papillon en un point de la Terre est suffisant pour déclencher deux semaines plus tard une tornade à l’autre bout de la planète. Au même moment, le russe Vladimir A RNOLD , disciple de KOLMOGOROV , modélise le mouvement d’un fluide parfait comme celui d’un point sur une « hypersurface » de dimension infinie. Il part lui aussi de travaux d’H ADAMARD sur les trajectoires d’une bille sur certaines surfaces : par exemple, si on lâche une bille sur un paraboloïde hyperbolique (une selle de cheval), sa trajectoire va dépendre énormément de sa position de départ, à tel point qu’il s’avère impossible de prévoir sa trajectoire au-delà d’un temps très court. Bref, l’effet papillon envahit les esprits et nombre de disciplines pour imposer une vision chaotique d’un monde complexe et imprédictible. C’est ce phénomène que nous allons observer et commenter aujourd’hui, non pas en étudiant le domaine des turbulences atmosphériques « physiquement » hors de notre portée, mais en explorant, de manière très simplifiée, la dynamique des populations. Nous évoquerons en conclusion les apports récents de la mécanique statistique qui replace dans leur contexte les travaux de L ORENZ et A RNOLD .
0
/
Comme vous le savez tous, le Zräjdz commun à ailette mouchetée est l’animal emblématique de la Syldavie. Aussi paisible que les habitants de ce bucolique pays, le Zräjdz se nourrit exclusivement des baies du bleurtschzrn, arbre qui pousse en abondance dans les verts sous-bois syldaves. Si l’on ne considérait que cette idéale situation, la population u de Zräjdzs suivrait la loi suivante un+1 = Run Cette relation traduit le fait que la population de l’année n + 1 est proportionnelle à l’année n : on applique à un le taux de natalité et le taux de mortalité. Le coefficient R résume ces proportions. Il est assez aisé d’objecter au modèle précédent que l’évolution ne peut pas rester proportionnelle à la population de l’année précédente : au bout d’un moment la nourriture et l’espace vital, par exemple, viennent à manquer. On peut alors modéliser l’évolution de la population selon la loi p n+1 = R p n (1 − p n ) avec p n représentant la proportion par rapport à un maximum estimé.
'; p(R,po,n):{ pn,k; pn:po; (k:1;k<n;k++){ pn:R*pn*(1-pn); } }:;
On peut ensuite regarder des séries de valeurs de la suite en faisant varier R :
(u(1.5,0.2,10* k),k110) Réponse du logiciel 0.3329912894,0.3333329986,0.333333333,0.3333333333,0.3333333333
(u(2.5,0.2,10* k),k15) Réponse du logiciel 0.6,0.6,0.6,0.6,0.6
(u(3.5,0.2,10* k),k15) 200
& %!
Réponse du logiciel 0.8683116395,0.8284245987,0.8749972464,0.8269407066,0.8749972636
(u(3.71,0.2,10* k),k15) Réponse du logiciel 0.6260986177,0.5214383835,0.6950564063,0.2789286664,0.772755663
%' Observer des séries de résultats chiffrés, un peu comme cela se fait sur les tableurs, n’est pas très parlant ni efficace. Nous allons donc utiliser la commande (f(x),uo,n) qui donne la représentation classique des suites définies par une relation un+1 = f (un )a :
(1.6*x*(1-x),x0.9,5)
Étude graphique de un+1 = 1, 6un (1 − un ) Ouvrons une fenêtre de géométrie en tapant + . R: (04) / / o n f a i t v a r i e r R f:x->R*x*(1-x) / / o n d é f i n i t f x1: (f(x)x,x)[1] / / o n d é f i n i t l e fp:
(f) / / l a d é r i v é e
point de
fixe
non
nul
de
f
f
a Pour une étude originale de ces suites, on pourra se référer à R OUQUÈS , Jean-Philippe/D OMINGUEZ , Sophie Leçons
particulières - Cours de Maths . Paris: Ellipses, 2002
201
0 fp(x1)
//
on
vérifie
si
le
point
(f(x),x1+0.0000001,2500)
fixe //
on
est
attractif
choisit
uo
ou
plus
x1
Il ne reste plus qu’à observer des phénomènes très étonnants. Au départ, pas de surprise :
➥
pour 0 < R < 1, 0 est attractif
➥
pour 1 < R < 3, 0 est répulsif et x1 attractif
➥
après 3, les choses se compliquent...
Par exemple, pour R = 3, 74471033, on a :
On observe 4 valeurs d’adhérence Et pour R = 3, 74471034, assez proche de la valeur précédente, on a :
202
répulsif ou
moins
proche
de
( 5!
On n’observe plus de valeurs d’adhérence On peut également, pour une même valeur de R, observer ce que donne différentes valeurs de po, en particulier de très petites variations autour du point fixe x1. C’est l’illustration du fameux « effet papillon » : un battement d’aile de papillon à Rezé est susceptible de déclencher beaucoup plus tard une tornade en Syldavie. La très faible perturbation créée par le vol d’un papillon pourrait en principe faire varier les conditions initiales du système atmosphérique et engendrer plus tard un changement climatique en un endroit quelconque de notre planète.
0
<
Ce phénomène est mis plus clairement en évidence par un diagramme de bifurcation. Cette fois, on étudie les valeurs prises par la suite en fonction de R. Pour ne pas être perturbé par les premiers termes, on s’occupe des 20 termes qui suivent p 100 : Feig(R,N):{ / / 1 / N e s t k,r,tmp,ligne; tmp:(R*N); / / c omme o n
avance
res:[0 tmp];
// i l
y
aura
20
à
pas
points
le
1/N ,
par
ligne:[0 20]; (r:0;r
calcul
de
calcul
des
pas
il
ligne
entre
y
deux
aura
car
on
valeurs
R *N fait
points
varier
de
R
tracés
k
de
100
à
120
u100
(k:0;k<100;k++){ tmp:r*tmp*(1-tmp);
} //
suivants
et
stockage
(k:0;k<20;k++){ ligne[k] : (r,tmp); tmp:r*tmp*(1-tmp); res[r*N] < ligne;
}
}
res;
}:;
Si l’on s’y prend mal, il peut être très long d’obtenir le graphique car de nombreux calculs répétitifs sont nécessaires. Par exemple, pour N = 5000 et R variant entre 0 et 4 on obtient en 80 secondes sur notre ordinateur (400 000 points vont être tracés... ) :
203
0
Le papillon bat-il de l’aile Les résultats de L ORENZ et A RNOLD ne semblent pourtant pas avoir sonné le glas des prévisions météo ! C’est qu’en fait, leurs travaux sont basés sur une échelle microscopique : il est en effet impossible de « suivre » un « petit » élément à long terme mais il est tout à fait envisageable de faire des prédictions à long termes à l’échelle macroscopique grâce aux résultats de la physique statistique en considérant des masses d’air dans leur ensemble. Ce phénomène est similaire à l’observation d’un gaz dans un récipient : il est impossible de modéliser la trajectoire d’une molécule, mais on peut l’étudier plutôt des valeurs moyennes et obtenir des quantités statistiques comme la température, la pression du gaz dans le récipient et c’est ce qui nous intéresse en général. La météo reste cependant imprévisible à longue échéance, même si elle est naturellement plus prévisible que l’évolution des molécules. Par contre le climat, lui, est plus prévisible, malheureusement pour nous et surtout nos enfants... Le papillon reprend malgré tout son envol pour des conditions initiales critiques qui font hésiter le système étudié entre deux états finaux distincts.
204
Coniques Logiciel(s) abordé(s) : XCAS
Notions informatiques : Ce chapitre sera l’occasion de découvrir de nombreuses commandes de calcul formel et de géométrie dynamique.
Problématique : Voici un cours assisté par ordinateur : nous explorerons un maximum de notions sur les coniques, tant algébriques que analytiques et géométriques, dans le plan comme dans l’espace. Nous effectuerons des expérimentations bien sûr, mais également des preuves de théorèmes.
,
=
! " $ AB
Pour nous simplifier la vie, nous étudierons en fait les courbes d’équation : ax 2 + by 2 + 2cx + 2d y + e = 0 − → Nous travaillerons dans un repère orthonormé O; → ı , −j . Nous supposerons que a et b ne sont pas tous deux nuls. − → Nous appellerons Γ la courbe d’équation ax 2 +by 2 +2cx+2d y +e = 0 dans le repère O; → ı , −j . Il va falloir distinguer de nombreux cas, comme par exemple...
? ab = 0 Nous supposerons par exemple que c’est b qui est nul. Alors Si d = 0.
On obtient :
(A*x^2+2*C*x+2*D*y+E0)
Réponse du logiciel
)
(−A)·(x)2 −(2·x·C)−E 2·D
*
a e En posant α = − 2d , β = − dc et γ = − 2d , Γ est donc la courbe d’équation y = αx 2 + βx + γ dans → − → − O; ı , j avec α = 0 :
(a*x^2+b*x+c) Réponse du logiciel
a · x + 2b·a
2
+
4·a·c−((b)2 ) 4·a
β On obtient donc qu’il s’agit de la parabole de sommet S − 2α ; Si d = 0.
4αγ−β2 4α
.
Alors Γ admet pour équation :
(x^2+2*C/A*x+E/A) Réponse du logiciel
x+
! 2·C 2 + 2·A
4·E − A
! 2·C 2 A
4
x+
c 2 c 2 − ea = a a2
Deux cas doivent encore être distingués :
➥
c 2 − ea 2 < 0, alors Γ = ;
➥
c 2 − ea 0, alors Γ est la réunion de deux droites « verticales ».
? ab = 0 On obtient comme équation équivalente puisque a et b sont non nuls :
206
(A*x^2+2*C*x)+
( (B*y^2+2*D*y,yx))+E
# 6! 2%! %! Réponse du logiciel
A · x + 22··CA
2
2 2 2 − (24··CA) + B · x + 22··DB − (24·D·B) + E
− → ı , −j . Soit Ω le point de coordonnées − ac ; − db dans O; → 2
2
Posons k = − ca − db + e.
− → Alors Γ est la courbe d’équation ax 2 + by 2 + k = 0 dans le repère Ω; → ı , −j . Distinguons à nouveau deux cas : Si a et b sont de même signe.
➥
k est du signe de a et b, alors Γ = ;
➥
k est nul, alors Γ = Ω ;
➥
k est du signe contraire de a et b, alors en posant α = la courbe Γ a pour équation
− ka et β =
− kb on obtient que
x2 y 2 + =1 α2 β2 − → dans Ω; → ı , −j ;
➥ ➥
Si k = 0, alors on peut poser m 2 = − ab et Γ a pour équation (y − mx)(y + mx) = 0 dans → −j . Ainsi Γ est la réunion de deux droites ; Ω; −ı , → +& & +& & &k & & & Si k = 0, en posant α = & a & et β = & kb & on obtient que la courbe Γ a pour équation x2 y 2 − = ±1 α2 β2 − → dans Ω; → ı , −j .
Finalement :
@
Γ ! %! )2%! ax 2 +by 2 +2cx +2d y +e = 0 a b ! !" ! ➥ ab = 01 Γ ) 1 2! !" 1 ! ➥ ab > 01 Γ ) 1 ! 1 ! ➥ ab < 01 Γ 2! !" 2 1 !
207
! " $ A<
Pour celles et ceux ayant étudié les formes quadratiques, nous allons pouvoir étudier les Γ courbes d’équation ax 2 + 2bx y + c y 2 + d x + e y + k = 0 → −j du plan. On supposera que (a, b, c) = (0, 0, 0). dans un repère O; −ı , →
On notera f (x, y) = ax 2 +2bx y +c y 2 +d x +e y +k = q(x)+ (x)+k, avec q(x) = ax 2 +2bx y +c y 2 la partie quadratique et (x) = d x + e y la partie linéaire.
! , Posons V =
x y
,A=
a
b
b
c
et L =
d c
. Alors l’équation de Γ s’écrit
t
Avec XCAS,
VAV + t LV + k = 0
'(q(x,y),[x,y]) renvoie la matrice associée à la forme quadratique q :
'(a*x^2+2*b*x*y+c*y^2,[x,y]) Réponse du logiciel
a
b
b
c
On sait qu’il existe une matrice de rotation P ∈ SO2 (R) telle que : t
PAP =
λ
0
0
μ
=D
− → → − − u ,− v à u ,→ v la base orthonormale de R2 telle queP soit la matrice de pasage de → Soit − − → −ı , → −j . Soit V tel que V = PV , alors dans le repère O; → u ,→ v , Γ a pour équation : t
(PV )A(PV ) + t L(PV ) + k = 0
c’est-à-dire : t
(V )D(V ) + t L(PV ) + k = 0
ou encore : λX 2 + μY2 + DX + EY + k = 0 et on retrouve le cas étudié à la section a. page 205 modulo un changement de base par rotation. On remarque au passage que det(A) = λμ, donc que :
208
# 6! 2%! %! ➥
si det(A) = 0, Γ est du « type » parabole ;
➥
si det(A) > 0, Γ est du « type » ellipse ;
➥
si det(A) < 0, Γ est du « type » hyperbole.
91 Quelle est la nature de la conique Γ : x 2 + 6x y + y 2 + 4x = 0 ? A:'(x^2+6*x*y+y^2,[x,y])
nous donne la matrice de la partie quadratique.
(A) nous dit que la matrice est de rang 2, donc Γ n’est pas du type parabole. Plus précisément :
(A) nous dit que det(A) = −8 et donc que Γ est de type hyperbole. On obtient une matrice de passage dans une base de vecteurs propres : Q: (A)
On normalise cette matrice en utilisant extrait la colonne n de la matrice M avec
" (vecteur) qui norme un vecteur et on (M,n) :
u: " ((Q,0)); v: " ((Q,1)); P: ( (u), (v))
On obtient la matrice diagonale : D: (A)
On introduit le vecteur coordonnées dans la nouvelle base et la partie linéaire : V:[[X],[Y]]; L:[[4],[0]]
et on obtient la nouvelle équation :
( (V)*D*V+ (L)*R*V c’est-à-dire : Réponse du logiciel
[4 · (X)2 + 2 · X · 2 − 2 · (Y)2 + (− (2 · Y)) · 2]
Il ne reste plus qu’à réduire cette équation comme nous l’avons vu à la section a. page 205.
209
"
On pourrait construire une procédure qui distingue les 9 cas de la section a. page 205 puis réduire la forme quadratique comme à la section b. page précédente, mais XCAS a déjà fait le travail pour nous...
( (x^2+6*x*y+y^2+4x)) donne successivement :
➥
les coordonnées du centre : Réponse du logiciel
#1
$ −3 4, 4
➥
la nouvelle base : Réponse du logiciel
⎡ ⎣
➥
2 2 2 2
−
⎤ 2 2 2 2
⎦
le fait que la conique soit dégénérée ou non : Réponse du logiciel
1
➥
une équation dans le nouveau repère : Réponse du logiciel
4 · (x)2 − 2 · (y)2 + 12 = 0
➥
et même une représentation paramétrique que nous ne commenterons pas ici.
Pour obtenir le tracé, on tape :
( (x^2+6*x*y+y^2+4*x),gray) 210
# 6! %! %!
ce qui donne
Hyperbole tracée avec conique
, = &
)"
x2 a2
y2
+ b2 = 1
Nous supposerons dans la suite que a et b sont positifs ce qui n’enlève aucune généralité à l’étude. → Il est aisé de vérifier que l’ellipse (E) est globalement invariante par reflexion d’axe − → − O; ı , O; j et par symétrie par rapport à O. Nous pouvons donc nous restreindre à étudier l’ensemble (E ) des points de (E) d’abscisse et d’ordonnée positives. (E ) est la courbe représentative de la fonction f:
R+
→
x
→
(a>0); / / p o u r e x p l i q u e r f:x->b* (1-x^2/a^2)
à
R 2 b 1 − ax 2 XCAS
que
a
est
positif .
Cette fonction est définie et continue sur [0 ; a] et dérivable sur [0 ; a[.
( (f(x),x)) Réponse du logiciel
(−
(a)2 −((x)2 ) )·b·x
(a)3 −(a·(x)2 )
−bx On obtient f (x) = pour tout x ∈ [ ; a[. a a2 − x2
211
fp:
(f); (fp(x),x,a,-1) / / − 1 i n d i q u e
la
direction
de
la
limite
On a lim f (x) = −∞, donc (E ) admet une demi-tangente verticale au point d’abscisse a. x→a x
y:fp(xo)*(x-xo)+f(xo);
Ouh la la, l’équation de la tangente a l’air très compliquée...Mais rusons un peu !
(y*f(xo)/b^2) Réponse du logiciel (a^2-x*xo)/(a^2)
Ainsi, la tangente à (E ) en un point d’abscisse xo = a admet pour équation : xxo y f (xo) + =1 a2 b2 Il est maintenant aisé d’obtenir une représentation de Γ : a:2:; b:1:; G: (f(x),x02):; G1: ( (0),G):; G2: ( (x0),G):; G3: ( (y0),G):; (G, + B), (G1, + (G2,+ ), (G3, )
ce qui donne :
Étude analytique de l’ellipse
212
B),
# 6! %! %!
On peut visionner l’influence des coefficient a et b en les faisant varier grâce à la commande
(intervalle) : a: (0 10); b: (0 10); f:x->b* (1-x^2/a^2):; G: (f(x),x0a):; G1: ( (0),G):; G2: ( (x0),G):; G3: ( (y0),G):; (G, + B), (G1, + B), (G2,+ ), (G3, )
;* )"
On effectue la même étude avec g :
x2 a2
y2
− b2 = 1
R+
→
x
→
R : 2 b ax 1 − 1
(a>0):; F:x->b* (x^2/a^2-1) a:2:; b:1:; H: (F(x),x25):; H1: ( (0),H):; H2: ( (x0),H):; H3: ( (y0),H):; (H, + B), (H1, + B), (H2,+ ), (H3, ) ce qui donne :
Étude analytique de l’hyperbole
213
, ) % / % Ouvrons une fenêtre de géométrie de coordonnées (x ; y).
+
MF = eMH
. On crée un point fixe F et un point quelconque
F: (0,0); M: (x,y):;
On crée deux éléments variables d, qui caractérise la directrice, et E, l’excentricité. d: E:
((-5)
(0 2)
5)
On crée le projeté de M sur la directrice : H:, ( (xd),M)
On trace le lieu du point M vérifiant MF = eMH avec (f(x,y),x,y) qui trace la courbe d’équation implicite f (x, y) = 0 et '(A,B) qui calcule le carré de la distance AB.
( ( '(M,F)-E*( '(M,H)),x,y), ) et la directrice :
( (xd), ) On visualise alors parfaitement les 3 cas : e < 1, e = 1 et e > 1.
, - &
)
− → −ı un vecteur unitaire Soit Ω le centre de l’ellipse. Dans le repère orthonormé Ω; → ı , −j , avec → 2
y2
de la droite vectorielle associée au grand axe, l’ellipse admet pour équation ax 2 + b 2 = 1. Les résultats suivants s’obtiennent classiquement avec les notations usuelles dans le cas a > b:
@
➥ c = a2 − b2
c a
F (−c ; 0)
➥ F(c ; 0) ➥ D: x =
e=
a2 c
2
D : x = − ac
On peut demander à XCAS de faire le travail : foyer_ellipse(a,b):{ c,E; (a
214
a et b")}
## ! 7 ! %!
{ c: (a^2-b^2); E:c/a; (
"l’excentricité vaut "+E+" Les foyers ont coordonnées ("+c+",0) et (-"+c+",0) et les directrices ont équations x"+a^2/c+" et x-"+a^2/c) }}:;
Alors : foyer_ellipse(5,3)
donne : Réponse du logiciel l’excentricité vaut e =4/5 Les foyers ont pour coordonnées (4,0) et (-4,0) et les directrices ont pour équations x=25/4 et x=-25/4
)!*
Il est aisé d’adapter au cas de l’hyperbole.
,, " ? Nous avons déterminé précédemment page 212 l’équation d’une ellipse. Voyons maintenant une construction de la tangente.
! +
@
Γ ! %! 5 $ 2 ( 7 Γ ! ' −−→ −→ Γ %! ) 7 ) " 5 ! ( ! %! ) FM · FT = 0
)
Observons ce résultat en ouvrant une fenêtre de géométrie après avoir tapé On définit la conique et on la trace :
+
.
a: (15) b: (1.5) E: (x^2/a^2+y^2/b^21):; (E, )
215
On définit maintenant un point quelconque de E avec la fonction un réel t entre 0 et 2π :
en faisant varier
t: M:
(0 2*)
(E,t) (M, +point_width_5) On définit un foyer et une directrice et le segment [M, F] : F: ( (a^2-b^2),0) D: ( (xa^2/ (a^2-b^2)), ) ( (M,F), )
On définit la perpendiculaire à (MF) en M avec
(point,droite) :
d: ( (F, (M,F)), )
et l’intersection de D et d avec
(courbe1,courbe2) :
T: (d,D) (T, +point_width_5) ( (T,M), + )
On demande l’équation de la droite (TM) avec
(droite) :
( (T,M)) Puis on se souvient du résultat vu page 212 qui dit que la tangente en M(x0 ; y 0 ) à l’ellipse a yy 0 pour équation xx + b 20 = 1. On obtient donc que : a2 xx0 b 2 y = 1− 2 a y0 Nous avons précisé que M n’appartenait pas à l’axe focal et donc y 0 = 0. Nous utilisons
(point) et
(point) :
((1-(x* (M)/a^2))*b^2/
(M)) On obtient le même résultat. XCAS nous le confirme avec test booléen :
(test) qui répond 0 ou 1 à un
( ( ( (T,M))) ( (1-(x* (M)/a^2))*b^2/
(M))) À l’écran, on fait varier t , a et b.
216
## ! 7 ! %!
Construction de la tangente à une ellipse
Effectuons la preuve dans le cas général grâce aux capacités formelles de XCAS : C: (x^2/a^2+y^2/b^21):; M: (a*(t),b*(t)):; / / d é f i n i t u n p o i n t d e C F: ( (a^2-b^2),0):; D: (xa^2/ (a^2-b^2)):; d: (y(b/
(M))*(1-x* (M)/a)):; / /
1 T: (d,D):;
en
effet
xxo / a+
yyo / b
Tout est rentré. On teste le résultat grâce à
(vecteur1,vecteur2) :
( (M-F,T-F)) qui répond bien 0. Nous venons donc de démontrer le théorème puisque les calculs ont été effectués dans le cas général. Un développement accessible aux élèves de lycée du même problème est présenté à la section 1.3 page 179.
217
,. # %
Voici une activité qui peut être proposée à des élèves de 2nde car elle ne demande que des connaissances de base sur les paraboles.
) ' +
Les lycéens l’ignorent, mais nous savons qu’une parabole d’équation x 2 = y = 2 × 12 x 2 admet pour foyer F(0 ; 14 ) et une directrice d’équation y = − 14 . 1. Tracer la droite D d’équation y = −1/4 en vert : D: ( (y-1/4), )
2. Placer le point F de coordonnées (0 ; 1/4) : F: ( (0,1/4), )
3. Créer un nombre s aléatoirement choisi entre −2 et 2 : s:
(-22)
4. Créer un point m quelconque appartenant à la droite D : m: (
(D,s), )
5. Tracer p, la perpendiculaire à D passant par m : p: ( (m,D),, )
6. Tracer la médiatrice med du segment [mF] en jaune : med: (
(m,F),, )
7. Soit M l’intersection de p et de med. Déterminez les coordonnées de M : M: (
(p,med), )
8. Tracez le lieu de M quand s varie :
( (M,s), + B) 9. Le lieu ressemble à une parabole... Vérifiez que M appartient à la parabole d’équation y = x2 :
(
(M)( (M))^2) Ceci permet de tracer point par point une parabole dont on connaît le foyer F et la directrice D :
218
#, 2 22%! !
Construction à la règle et au compas d’une parabole
" " & " C
Complétons la figure précédente. 1. Tracer maintenant en magenta la perpendiculaire perp à med en M : perp: ( (M, (M,F)),
)
2. Tracer en vert la parallèle à med passant par F : para: ( (F,med), )
3. Tracer le point mm, intersection de para avec p : mm: (
(p,para), )
, : que constatez-vous ? 4. Tracer en jaune pointillé (jaune+dash_line) la bissectrice FMmm bis: ( (M,F,mm),, +
)
On constate que perp est confondue avec bis. 5. Repassez en bleu avec une épaisseur de trait de 3 (bleu+line_width_3) la demi-droite [M, mm) et le segment [MF] :
(
(M,mm), + ); ( (M,F), + ) 219
Connaissez-vous la loi de Descartes pour la reflexion ? Rayon incident
Normale au point d’incidence
θ1
Rayon réfléchi
θ2
Loi de Descartes On a θ1 = −θ2 et donc la normale au point d’incidence représente la bissectrice de l’angle géométrique formé par les rayons incident et réfléchi. Si on considère des rayons venant d’un satellite , on peut supposer qu’ils sont tous parallèles étant donné qu’il est très éloigné de l’antenne. Notre petite illustration montre alors que tous les rayons incidents sont envoyés vers le foyer. Inversement, si l’on émet de la lumière depuis le foyer, comme c’est la cas par exemple dans le phare d’une voiture, les rayons réfléchis par les parois du phare partiront tous dans la même direction, ce qui permettra de diriger le faisceau lumineux et de ne pas éblouir les voitures venant en face.
Pourquoi les antennes sont paraboliques ?
,5 " @
Nous ne vous apprendrons pas l’origine du mot coniques. Nous allons nous contenter de l’illustrer.
220
#/ %! 8
) ? )" x = t
On construit un cône de centre l’origine, d’axe (Oz) et de demi-angle au sommet
π 4
:
K: ( ([0,0,0],[0,0,1], /6, 0.02), )
On construit le plan d’équation x = t avec t variant entre −10 et 10 : t: ((-10) 10) Q: ((xt),+
)
On demande de tracer l’intersection du cône et du plan :
( (Q,K), + B)
Intersection d’un cône avec un plan d’équation x =t
Étudions l’intersection de K et du plan x = t . On utilise qui renvoie le réel « flottant » t sous la forme d’un rationnel car inter travaille en calcul formel.
([ (K),x (t)],[x,y,z]) nous renvoie (dans le cas t = 1) :
221
Réponse du logiciel
⎡ ⎣
1
y
1
y
−
⎤ % (y)2 + 1 ⎦ % 2 (y) + 1
% C’est à dire que z = ± y 2 + 1 ce qui est équivalent à z 2 = y 2 + 1. Nous reconnaissons bien sûr une hyperbole. XCAS nous le confirme. % Sortons de la fenêtre de géométrie 3D. Comme y 2 + 1 est le troisième élément du second élément de solve([equation(K),x=1],[x,y,z]), on l’obtient en tapant :
([ (K),x1],[x,y,z])[0][2] Il ne nous reste plus qu’à utiliser
:
(z^2( ([ (K),x1],[x,y,z])[0][2])^2,y,z) Le logiciel renvoie le tracé et le message :
Réponse du logiciel Hyperbola of center (0,0)
) ? )" x = t + k · z
Nous allons rajouter un nouveau paramètre, k, qui va nous permettre de visualiser l’évolution des sections suivant la « pente » du plan de coupe : K: ([0,0,0],[0,0,1], /6, t: ((-10) 10) k: ((-2) 2) P:(xt+k*z,+ ) ( (K,P), +
, 0.01)
B)
En faisant varier k, on visualise le passage de l’hyperbole à l’ellipse puis à la parabole :
222
#/ %! 8
Section d’un cône par un plan d’équation x = t + k · z : cas de la parabole
223
Séries de Fourier Logiciel(s) abordé(s) : XCAS
Notions informatiques : Les logiciels ont du mal à intégrer les fonctions non continues. On s’intéresse ici aux fonctions continues par morceaux. Problématique : On explore les développement en série de Fourier tant par le calcul que graphiquement.
.
)+%
Si l’on considère des fonctions intégrables au sens de Lebesgue sur un intervalle [a ; a + T], alors on peut toujours calculer ses coefficients de Fourier :
cn =
1 T
a+T
−2iπnt/T
f (t )e
dt
a
Sur XCAS une fonction est pré-programmée :
(f(x),variable,période,n,borne
inférieure de l’intégrale)
Par exemple, considérons la fonction f , 2π-périodique, paire et telle que f (x) = x 2 pour tout x ∈ [0 ; π]. Traçons sa représentation graphique sur une période :
(x^2,x-PiPi)
" 0 &
XCAS : Fonction x → x 2 Alors :
(x^2,x,2*Pi,n,-Pi) Réponse du logiciel
−in2 π2 einπ + in2 π2 e−in(−π+2π) + 2nπeinπ + 2nπe−in(−π+2π) + 2ieinπ − 2ie−in(−π+2π) 2n3 π
Ce n’est pas très lisible. Il suffit d’expliquer que n est un entier et les exp((-i)*n*(-pi)) vont s’en trouver soulagées...
(n, ) (x^2,x,2*Pi,n,-Pi) renvoie cette fois : Réponse du logiciel
2 · (−1)n (n )2
Ça a l’air mieux... Nous pouvons préférer les coefficients réels :
(x^2,x,2*Pi,n,-Pi); (x^2,x,2*Pi,n,-Pi) 226
, " Réponse du logiciel
4 · (−1)n ,0 (n )2
On vérifie bien que les b n sont nuls car la fonction est paire. Il semble y avoir un problème pour a0 ... mais XCAS s’en sort encore une fois !
(x^2,x,2*Pi,0,-Pi) qui renvoie bien π2/3, la valeur moyenne de f sur une période. Au fait, vérifions le lemme de Riemann-Lebesgue pour rigoler :
Lemme de Riemann-Lebesgue Soit f ∈ L 1 [a ; a + T]. Alors a+T lim
n→+∞ a
−2iπnt/T
f (t )e
dt = 0
cn: (x^2,x,2*Pi,n,-Pi); ((cn),n+ )
Pour la démonstration, c’est un autre problème... Vérifions maintenant graphiquement la convergence de la série de Fourier : f4:t-> (x^2,x,2*Pi,0,-Pi)+ ( n*t),n14)
crée la fonction t → a0 +
4 '
(x^2,x,2*Pi,n,-Pi)*(
an cos(nt ).
n=1
Est-ce que XCAS sait bien évaluer f4(t) ? f4(t) Réponse du logiciel
− (4 · cos (t)) + cos (2 · t) +
−4 · cos (3 · t)
9
+
cos (4 · t)
4
+
1 · (π)2 3
Nous voici rassurés... Voyons le résultat graphiquement. Pour cela, il nous suffit de rentrer :
227
" 0 & ([t^2,f4(t)],t-PiPi,[red, ]) Mais pour l’impression de ce livre, nous avons augmenté l’épaisseur des traits avec la fonction :
( (t^2,t-PiPi),line_width_2+red); ( (f4(t),t-PiPi),line_width_2+ );
XCAS : Visualisation de la convergence de la série de Fourier
. % %'& Adoptons à présent une vision physicienne du problèmea . Ainsi f est un signal de période T et notons classiquement ω = 2π/T . Supposons que f est telle que la suite des sommes partielles f n (t ) = a0 +
n '
(ak cos(kωt ) + b k sin(kωt ))
k=0
converge vers f , ou éventuellement sa régulariséeb et dont l’énergie est E (f ) =
1 T
a+T
f 2 (t ) dt
a
On utilise alors la formule de Bessel-Parseval et on obtient classiquement E ( f ) = a02 +
+∞ '
an2 + bn2
n=1
2
Une des questions physiques est alors de savoir à partir de quelle valeur de n on obtient un pourcentage donné de l’énergie du signal en approximant f par f n . Reprenons notre exemple : a Les problèmes de convergence et le travail dans un espace de Hilbert ne seront pas traités ici. b Voir le théorème de Dirichlet.
228
,& 2 9 * E:(1/(2*))*( (t^4,t-)); (E)
nous dit que E ( f ) = π4/5 n 16 a 2 + bk2 π4 ' = + Notons E n ( f ) = a02 + nk=1 k 2 9 k=1 k 4 Nous voudrions savoir à partir de quelle valeur de n nous obtenons E n ( f ) = p% de E ( f ) : efficace(p):{ ao: ( (x^2,x,2*Pi,0,-Pi)); En:ao^2; k:0; seuil: (p*E/100); (En
Par exemple : efficace(99.9) Réponse du logiciel Il suffit de prendre n=5 pour obtenir 99.9% du signal
Vérifions : Energie:n->^4/9+ (8/k^4,k1n); 100* (Energie(4))/ (E); 100* (Energie(5))/ (E)
ce qui confirme notre résultat.
. ' >
Occupons-nous à présent d’un signal moins régulier mais important en électronique $ # : la fonction créneau, impaire, de période 1, et telle que f (t ) = 1 pour tout t ∈ 0 ; 1/ 2 et f (0) = f 1/2 = 0. On peut « rentrer » f de manière explicite : f:t->piecewise(t-.5,0,(-.5
(t<.5),1,t
mais cette fonction n’est pas encore bien intégrée, mise à part l’évaluation et la dérivée. Nous n’utiliserons donc pas fourier_bn, mais nous fabriquerons nos propres procédures.
229
" 0 & Représentons d’abord graphiquement des fonctions définies par morceaux en rentrant comme arguments la liste des intervalles, la liste des valeurs correspondantes, le nombre d’intervalles et la couleur. plot_mor(LI,LV,m, ):{ P; P:[]; (k:0;k
de
//
on
crée
courbes
} }
Par exemple : plot_mor([-1/20,01/2],[-1,1],2, )
donne :
XCAS : Tracé d’une fonction définie par morceaux Pour le calcul de a0 : four_ao(LI,LV,m,T):{ integ,k; integ:0; (k:0;k
Dans le cas qui nous occupe : four_ao([-1/20,01/2],[-1,1],2,1)
On calcule de même les an :
230
une
liste
de
,& 2 9 * four_an(LI,LV,m,T,p):{ integ,k; integ:0; (k:1;k
et les b n : four_bn(LI,LV,m,T,p):{ integ,k; integ:0; (k:0;k
Ça « marche » pour des valeurs numériques : four_bn([-1/20,01/2],[-1,1],2,1,3) Réponse du logiciel
4 π·3
mais si l’on demande une formule générale : four_bn([-1/20,01/2],[-1,1],2,1,N)
ce n’est pas très lisible... Il faut dans ce cas modifier notre procédure : four_bn_general(LI,LV,m,T):{ integ,k,p; (p, ); integ:0; (k:0;k
(integ) }
Alors : four_bn_general([-1/20,01/2],[-1,1],2,1)
231
" 0 & nous donne cette fois un résultat satisfaisant : Réponse du logiciel
− (2 · (−1)p ) + 2 π·p
Ensuite on demande de créer la fonction t → a0 +
N '
(an cos(2πnt /T) + b n sin(2πnt /T)) :
n=1
s_fourier(LI,LV,m,T,N):{ k; (four_ao(LI,LV,m,T)+ (four_an(LI,LV,m,T,k)*(k*2*Pi*x/T)+ four_bn(LI,LV,m,T,k)*(k*2*Pi*x/T),k1N)) }
Par exemple : s_fourier([-1/20,01/2],[-1,1],2,1,5)
Réponse du logiciel
192 · (sin (2 · π · x))5 − 320 · (sin (2 · π · x))3 + 180 · sin (2 · π · x) 15 · π
On peut demander le tracé de la somme partielle et de la fonction elle-même : plot_fourier(LI,LV,m,T,xmin,xmax,N):{ A,B; A: (s_fourier(LI,LV,m,T,N),xxminxmax, ):; B:plot_mor(LI,LV,m,red):; A,B }
et on obtient pour N = 8 :
232
,& 2 9 *
XCAS : phénomène de Gibbs avec N=8 qui met en évidence de petites crêtes plus grandes près des points de discontinuité. Vérifions un peu plus loin : plot_fourier([-.50,00.5],[-1,1],2,1,-.5,.5,16)
et on obtient :
XCAS : phénomène de Gibbs avec N=16 Vous pourrez montrer les trois résultats étonnants suivantsc : – la crête est de plus en plus étroite ; – elle se rapproche du point de discontinuité ; – sa hauteur est constante.
c Pour la démonstration voir A PPEL , Walter Mathématiques pour la physique et les physiciens. Paris: H&K, 2005 p. 274
233
Musique Logiciel(s) abordé(s) : Scilab
Problématique : Construire une gamme en utilisant le calcul matriciel. Produire des sons pour un séquenceur.
5
"
$
L’ensemble de toutes les notes possibles (partant des gammes classiques de tempérament égal) contient 12 degrés espacés d’un demi-ton ; le nombre 0 représente do = C, le nombre 1 représente do = C, etc. On cherche à construire toutes les gamme possibles dans les contraintes suivantes : le nombre de degrés est fixé, seuls certains intervalles sont autorisés, chaque note apparaît au plus une fois, on retombe sur la note initiale à la fin. Par convention, la note initiale est toujours 0. Dans notre construction, la première note est omise et est toujours 0 (do = C) ; on construit une matrice dont chaque ligne représente une gamme. La matrice obtenue à la fin représente donc toutes les gammes possibles avec les contraintes données.
#
Il est bon de faire l’aller-et-retour entre une gamme et la succession de ses intervalles. La fonction intervalle donne les intervalles successifs associés aux gammes stockées dans une matrice.
yintervalle(x) yx j2:" (x,2) y(:,j) (y(:,j)-x(:,j-1),12)
La fonction gamme donne les gammes associées aux suites d’intervalles.
ygamme(x) yx s" (x,2) j2:s
% = y(:,j) (
(x(:,[1:j]),’c’),12)
Des candidates pour les gammes sont construites par itération ; une bonne partie de l’élimination se fait pendant la génération pour économiser les ressources de l’ordinateur !
ziteration(y,k,taille,w) W" (w,1) s" (y,1) ; z" (s*W,k) ; is:-1:1 , jW:-1:1, yyy(i,k) ; Z (yy+w(j),12) ; lW*(i-1)+j z(l,[1:k])y(i,[1:k]) ; z(l,k+1)Z
;
// //
Élimination
de
//
chaque
qu ’ u n e
//
et
//
il
note ne
doit
mauvaises
pas
seule y
avoir
lignes
:
on
ne
doit
rencontrer
fois deux
intervalles
successifs
k 1 Y0 ; Yy(i,k-1) ; ; ZZZ-2*yy+Y ; or([ (ZZ,12)0,Z0, or(y(i,[1:k])Z)])
identiques .
z(l,:)[] ;
;
;
;
Pour une matrice représentant les intervalles, il faut éliminer les lignes qui sont redondantes à permutation circulaire près : cela reviendrait à transposer la gamme, ce qui n’apporterait rien de nouveau. La fonction pcc opère un cycle élémentaire sur les lignes d’une matrice.
ypcc(x) yx s" (x,2) j1:s-1 kj+1 y(:,j)x(:,k)
y(:,s)x(:,1)
On marque les lignes redondantes et on les élimine à la fin.
236
/ ! )!
ynettoie(x) [l,c]" (x) marque[] i1:l-1 ji+1:l zx(i,:) k1:c-1 zpcc(z) zx(j,:)
yx y(marque,:)[]
marque[marque,j] ;
;
D / )
Il faut taper z=cherche(t,w), où t est la taille de la gamme, c’est-à-dire le nombre de degrés, et w est la liste des intervalles autorisés. La gamme obtenue sur la première ligne ci-dessous se lit comme indiqué dans la deuxième ligne. Réponse du logiciel ! do
3. mib
7. sol
10. sib
2. ré
8. sol#
4. ! mi
L’instruction intervalle(z) décrit les intervalles entre chaque degré. Prenons par exemple la règle : on peut monter ou descendre d’un triton, d’une tierce mineure ou majeure. w[3;4;6;8;9]
Le vecteur w représente tous les intervalles possibles en suivant cette règle. Voici le programme principal :
zcherche(taille,w) taille (taille,11) / / p o u r s e p r o t é g e r d e s p l a i s a n t i n s zw ; i1:taille-1 , ziteration(z,i,taille,w) ; ; / / I l f a u t r e t o m b e r s u r d o0 s" (z,1) ; is:-1:1 , or(wz(i, )) ; z(i,:)[] ; ;
; //
Pour
éviter
deux
intervalles
identiques
s" (z,1) ; is:-1:1 , (z(i,1)+z(i,taille),12)0
aux
bouts
de
z(i,:)[] ;
la
gamme
;
237
% =
;
//
on
élimine
//
affichage
les
permutations
circulaires
zgamme(nettoie(intervalle(z))) du
s" (z,1)
// //
si
[6;3]
w
résultat
et
taille
2
ou
3
.
//
s>1 pluriel’s’ ; pluriel’’ ; ; chaine’Il y a ’+ (s)+’ gamme’+pluriel+’ solution’+pluriel (%io(2),chaine)
5 -
Le logiciel Scilab permet de fabriquer des sons sous forme de fichiers d’extension « .wav ». Le son de l’orgue éléctronique modélisé grossièrement ici est produit par des oscillateurs à circuits bobine-condensateur. Dans le circuit magnétique de chaque bobine tourne une roue d’une certaine forme, ce qui change l’auto-inductance de la bobine et donc la fréquence de la note. Les électroniciens appellent cela une modulation de fréquence et les musiciens un vibrato. (Quand la variation de fréquence est plus ample, ils parlent respectivement de wobulation et de glissando.) //
attention
//
pour
t
ne
doit
pas
être
un
tableau
uorgue(t,frequence,rotationRoues,profondeur,nuance) omega(1+profondeur *(t*rotationRoues *2*%pi))*2*%pi*frequence une
énergie
indépendante
de
amplitudenuance/(1+frequence/441) uamplitude *(t*omega) ;
la
fréquence
La fabrication de la matrice de réels qui représente l’échantillonnage sonore à 44100Hz utilise la fonction précédente. La fonction v ci-dessous sera construite à partir de la fonction orgue ci-dessus.
Zconcret(v,duree,frequence,rotationRoues,profondeur,nuance) intervallesoundsec(duree,44100) ; Z[] kintervalle, Z[Z v(k,duree,frequence,rotationRoues,profondeur,nuance)];
L’écriture des échantillons numériques dans un fichier sonore se fait automatiquement. L’instruction y=[u’,v’] ; wavwrite(y,44100,16,nom) donnerait des résultats bizarres.
ysortie(u,v,nom) 238
/ $ y[u;v] ; ynom
(nom,y,44100)
Il reste à écraser les extrémités pour diminuer les dégâts du jeu en boucle.
yenveloppe(t,duree,frequence,rotationRoues,profondeur,nuance) or([t0 tduree]) y 0 ; yyorgue(t-duree/2,frequence,rotationRoues,profondeur,nuance) ; yyy* (100*t)* (100*(duree-t));
Puis à utiliser les fonctions précédentes en initialisant les variables. rotationRoues7 / / l e s r o u e s t o u r n e n t à . h e r t z profondeur.003 frequence441 / / l a d u d i a p a s o n nuance.999 / / f f f f o n n e p e u t p a s a l l e r p l u s l o i n . zconcret(enveloppe,2,frequence,rotationRoues,profondeur,nuance); nom’orgueA3.wav’ nom’orgueBIS.wav’ sortie(z,z,nom)
La fabrication automatique du sons peut produire des échantillons pour un séquenceur informatique. La grandeur d’une octave pour l’oreille humaine, c’est-à-dire le coefficient multiplicateur que l’on applique aux notes quand on les élève d’une octave, est légèrement supérieure à deux, et varie en fonction des personnes et des circonstances. Dans le tempérament égal, les douze notes sont équiréparties en moyenne géométrique le long de l’octave. Profitons-en pour construire des fonctions logarithme et exponentielle musicales.
ylm(x,octave) y(x)*12/(octave)
yem(x,octave) y (x*(octave)/12)
Les fichiers-sons se répartissent au long de la tessiture du séquenceur, qui contient typiquement 128 notes (dix octaves et demie). On peut aller jusqu’à un échantillon par note ; on se contente ici d’un échantillon par octave : évidemment l’effet vibrato sera hétérogène. . . Pour créer un nouveau répertoire où placer les encombrants fichiers-sons, il suffit d’exécuter dans Scilab une commande shell :
(’mkdir
Sons’)
L’automate est prêt à être écrit ; le lecteur pourra aisément modifier la liste et le nombre des échantillons (le séquenceur risque de rouspéter s’il en charge plus de 128), puisque tout passe par la gestion des chaînes de caractères. Il faut juste repérer la position dans la liste de la note de référence pour le diapason (441Hz).
239
% = ysequence(duree,rotationRoues,profondeur,nuance,octave) n-2:8;N (n) gamme[’A’] suite[] kN, suite[suite gamme+k];
ksuite, nom’orgue’+ (k)+’.wav’ ; ivectorfind(suite,k,’c’)-5 / / 5 e s t l a p l a c e d u l a 3 . frequence441*em(i*12,octave) / / 4 4 1 Hz p o u r l e l a d u d i a p a s o n zconcret(enveloppe,duree,frequence,rotationRoues,profondeur,nuance)
;
sortie(z,z,’Sons/’+nom) ;
ysuite
Les données nécessaires sont rentrées ; il faut plusieurs secondes sur une machine ordinaire pour produire une note d’une seconde. Augmenter le nombre d’échantillons et la durée sera gourmand en temps de calcul. octave2.01 rotationRoues7 / / profondeur.003 nuance.999 / / f f f f duree1
les
le
roues
maximum
tournent
à
.
hertz
.
Il ne reste plus qu’à se jeter à l’eau. sequence(duree,rotationRoues,profondeur,nuance,octave)
240
Carrés magiques Logiciel(s) abordé(s) : Scilab
Problématique : Résoudre des problèmes amusants en apprenant la manipulation des matrices sans s’en apercevoir.
Les carrés magiques portent aussi un nom japonais imprononçable en français (sudoku). Les problèmes sont des tableaux de 9 lignes et 9 colonnes ; certaines cases sont déja remplies. Le joueur doit remplir les cases restantes en respectant des contraintes géométriques : la suite des nombres de 1 à 9 doit apparaître exactement dans chaque ligne, dans chaque colonne, et dans chacun des neuf sous-carrés de trois cases par trois découpés dans le tableau. Prenons un problème donné en remplaçant les cases vides par des zéros. m" (9,9); m(1,[1 4 5 8])[5 4 m(2,[4 6 7 9])[5 2 m(3,[1 3 5 9])[7 4 m(4,[1 5 7 8])[1 9 m(5,[3 4 5 6 7])[9 m(6,[2 3 5 9])[4 7 m(7,[1 5 7 9])[9 2 m(8,[1 3 4 6])[2 1 m(9,[2 5 6 9])[8 7 m
8 4 1 2 1 3 3 6 3
6]; 1]; 2]; 3]; 4 8 6]; 9]; 6]; 4]; 5];
La dernière instruction affiche la matrice du problème. la matrice m est une matrice 9 par 9 dans la quelle on stocke les données et où l’on stockera les réponses progressivement. Les premiers outils pour manipuler les neuf nombres sont initialisés. I (9,9) ; uI; d2*I; t3*I; q4*I; c5*I; s6*I; e7*I; h8*I; n9*I;
Un transfert pour faciliter les itérations est nécessaire.
[M,U,D,T,Q,C,S,E,H,N]egale(m,u,d,t,q,c,s,e,h,n) Mm;Uu;Dd;Tt;Qq;Cc;Ss;Ee;Hh;Nn;
Un infâme bricolage pour numéroter les matrices extraites ne devrait faire peur à personne.
' znumero(k) kk (k,3) ; K(k-kk)/3
; zz
(kk,K)+2*K/3
; z
((zz),2)
Quand une case de la matrice M est remplie, on procède aux éliminations dans la matrice Y, qui sera l’une de celles où sont stockés les nombres encore inutilisés.
Zannulation(Y,M) ZY k1:9 l1:9 M(k,l)~0 Z(k,l)M(k,l) Z(k,:)0;Z(:,l)0;Z(k,l)M(k,l); Knumero(k);Lnumero(l);Z(3*K+[1:3],3* L+[1:3])0;Z(k,l)M(k,l);
Z(k,l)0 ;
La première action pour remplir la matrice est de vérifier les nombres qui ne sont utilisés qu’une fois dans chaque ligne ou colonne.
Mattribution(m,u,d,t,q,c,s,e,h,n) //
s ’ il
//
on
n’y
a
remplit
qu ’ u n e la
réponse
case
par
ligne
ou
de M c o r r e s p o n d a n t e
par
Mm liste[’u’,’d’,’t’,’q’,’c’,’s’,’e’,’h’,’n’] compteur1
// boucle1
yliste Y (y) colonne
(Y,’r’) ; ligne (Y,’c’)
// boucle2
j1:9
//
si
une
seule
réponse
// boucle3
colonne(j)compteur
// boucle4
k1:9
// boucle5
M(k,j)0 M(k,j)Y(k,j)
// f i n
de
242
sur
boucle5
la
colonne
colonne
/ $
// fin
de
boucle4
// fin
de
boucle3
// fin
de
boucle2
// boucle2bis
j1:9
//
si
une
seule
réponse
sur
// boucle3bis
ligne(j)compteur
la
ligne
// boucle4bis
k1:9
// boucle5bis
M(j,k)0 M(j,k)Y(j,k)
// fin
de
boucle5bis
// fin
de
boucle4bis
// fin
de
boucle3bis
// fin
de
boucle2bis
de
boucle1
compteurcompteur+1
// fin
Si tous les nombres sauf un ont été éliminés pour un emplacement donné, l’emplacement peut être attribué.
MATTRIBUTION(m,u,d,t,q,c,s,e,h,n) //
si
//
compte
un
//
on
seul tenu
remplit
chiffre de la
est
toutes case
apparaît les
possibilités
de M c o r r e s p o n d a n t e
Mm liste[’u’,’d’,’t’,’q’,’c’,’s’,’e’,’h’,’n’]
// boucleA
k1:9
// boucleB
l1:9
verticale" (9,1) compteur1
// boucleC
yliste Y (y)
verticale(compteur)Y(k,l)
243
' compteurcompteur+1
// f i n
de
boucleC
//
seul
test (verticale) un
chiffre
est
?
possible
// boucleCbis
test (verticale) M(k,l)test
// f i n
de
// f in
boucleCbis
de
// f i n
boucleB
de
boucleA
Le travail fait par la fonction attribution suivant les lignes et colonnes est fait dans les tableaux extraits par la fonction attripb.
Mattrib(m,u,d,t,q,c,s,e,h,n) //
s ’ il
//
on
n’y
a
remplit
qu ’ u n e la
case
réponse
par
matrice
3
par
3
extraite
de M c o r r e s p o n d a n t e
Mm liste[’u’,’d’,’t’,’q’,’c’,’s’,’e’,’h’,’n’] compteur1
// boucle1
yliste Y (y)
// boucle2
K0:2
// boucle3
L0:2 ZY(3*K+[1:3],3* L+[1:3]) test (Z)
//
si
une
seule
// boucle4
réponse
testcompteur
// boucle5
sur
kk1:3
// boucle6
ll1;3 k3*K+kk ; l3*L+ll
// boucle7
M(k,l)0 M(k,l)Y(k,l)
// f i n
244
de
boucle7
la
matrice
3
par
3
extraite
/ $
// fin
de
boucle6
// fin
de
boucle5
// fin
de
boucle4
// fin
de
boucle3
// fin
de
boucle2
de
boucle1
compteurcompteur+1
// fin
Maintenant vient le travail recherché : toutes les éliminations et les attributions sont rassemblées.
//
la
[M,U,D,T,Q,C,S,E,H,N]op(m,u,d,t,q,c,s,e,h,n)
fonction
principale
[M,U,D,T,Q,C,S,E,H,N]egale(m,u,d,t,q,c,s,e,h,n) liste[’U’,’D’,’T’,’Q’,’C’,’S’,’E’,’H’,’N’] yliste Y (y) Zannulation(Y,M)
(y+’Z’)
MMattribution(M,U,D,T,Q,C,S,E,H,N) yliste Y (y) Zannulation(Y,MM)
(y+’Z’)
MMMATTRIBUTION(MM,U,D,T,Q,C,S,E,H,N) yliste Y (y) Zannulation(Y,MMM)
(y+’Z’)
Mattrib(MMM,U,D,T,Q,C,S,E,H,N)
Le nombre d’itérations et le drapeau d’arrêt sont initialisés. stop0 longueur0
La boucle d’itération utilise les fonctions précédentes.
245
'
stop0
//
une
étape
de
//
mesure
de
//
est −ce
fini
travail
[M,U,D,T,Q,C,S,E,H,N]op(m,u,d,t,q,c,s,e,h,n) ; l ’ effort
longueurlongueur+1 ;
?
[M,U,D,T,Q,C,S,E,H,N][m,u,d,t,q,c,s,e,h,n] stop1 ;
[m,u,d,t,q,c,s,e,h,n]egale(M,U,D,T,Q,C,S,E,H,N) ;
Quand la machine s’arrête, le point d’arrivée est affiché avec l’effort fourni.
(m);
(longueur); Si ça bloque avant de trouver une solution, c’est qu’on ne peut pas continuer par élimination : il faut fixer une valeur arbitraire dans M (de préférence où la collision est faible). Les instructions suivantes donnent des indications. collisionu+d/2+t/3+q/4+c/5+s/6+e/7+h/8+n/9-1 ;
(u); (d); (t); (q); (c); (s); (e); (h); (n)
La valeur candidate est rentrée dans m avec une instruction du type m([i,j])valeur
Ensuite il faut réitérer l’ensemble d’instructions : [m,u,d,t,q,c,s,e,h,n]op(m,u,d,t,q,c,s,e,h,n) ; collisionu+d/2+t/3+q/4+c/5+s/6+e/7+h/8+n/9-1 ; m
Si un nombre de collision devient strictement négatif, il n’y a pas de solution : la valeur arbitraire était mauvaise, il faut tout recommencer avec une autre valeur arbitraire. Ou alors il fallait archiver sous d’autres noms les dix matrices m, u. . . n avant de rentrer le candidat. . .
246
Codes correcteurs d’erreurs
Logiciel(s) abordé(s) : XCAS
Notions informatiques : Les codes correcteurs nous ferons travailler dans des corps finis (F2 en l’occurence) ce qui nous permettra d’approfondir le calcul modulaire. Le travail principal se fera cependant sur la manipulation des matrices. Nous évoquerons également le travail dans les corps de Galois. Nous ne ferons que survoler la partie mathématique (pour un développement très pédagogique, voir a et pour une étude plus complète, voir b ) pour nous concentrer sur l’exploitation informatique. Nous utiliserons XCAS. Problématique : Une information est codée sous la forme de bits (binary digits), donc d’éléments d’un F2 -espace vectoriel. Elle est ensuite transmise puis décodée. Un message sera donc représenté par un vecteur de Fn2 . La transmission altère parfois l’information : ainsi on récupère un vecteur transmis qui n’est pas forcément celui d’origine. Le but de l’activité est d’utiliser un code qui permetttra de détecter les erreurs et même de les corriger : on créera d’abord une procédure « naïve » qui dépendra de la matrice de codage et du vecteurmessage à tester et qui dira si ce vecteur a été mal tansmis et par quel « bon » vecteur le remplacer. Nous évoquerons ensuite une procédure plus efficace mais qui ne concernera que les codes de Hamming. Enfin, nous travaillerons dans des corps de Galois pour créer des polynômes générateurs.
a B RUGÈRE , Thierry/M OLL ARD , Alain Mathématiques à l’usage des informaticiens. Paris: Ellipses, 2003 b B ADRIKIAN , Josèphe Mathématiques pour téléinformatique : codes correcteurs. Paris: Ellipses, 2002
) ,
8
/ ' A Fk2
Nous voudrions écrire les 2k vecteurs de Fk2 sous forme de listes de longueur k. Plusieurs options s’offrent à nous. Une des plus simples sur F2 est de compter jusqu’à 2k − 1 en base 2. Par exemple, pour écrire n en base 2, on pourrait utiliser la fonction (n,base,b) qui convertit un nombre n, L:[]; L: ( (n, ,2),L);
mais ça nous le donne en sens inverse... On peut aussi faire des divisions euclidiennes successives. Le problème, c’est que ces vecteurs ont un nombre de composantes variable. Une petite astuce fixe le nombre de composantes à k : Fdeux(n,k):{ L; L:[]; (n>2){ L: ([ n:(n,2);
(n,2)],L);
} L: ([n],L); (" (L)
;
Nous voudrions avoir une méthode nous permettant de décider quel est le message correct le plus « proche » du message erroné reçu. Une nouvelles ruse due aux particularités de F2 va nous y aider. Tout d’abord, n’oubliez pas que dans F2 , x + y = x − y ! Ainsi, le nombre de « bits » qui différent entre deux vecteurs de F2 est aussi égal à la somme des coordonnées du vecteur somme résultant. Si on appelle poids la fonction ω :
Fn2
→
N
m
→
ω(m) =
-n
i=1 m i
alors vous vérifierez que l’application δ :
248
Fn2 × Fn2
(m, m )
→
N
→
ω(m + m ) = ω(m − m )
3 '2 :
est une distance, appelée distance de Hamming, qui nous permettra de mesurer l’écart entre deux messages, c’est-à-dire le nombre de bits les différenciant. Il suffit d’utiliser pour effectuer la somme des composantes d’un vecteur :
([1,2,3,4])
Rappelons que nous rentrons une matrice de codage M et un message v et que nous voulons savoir si v correspond à un message de M. Dans le cas contraire, nous voudrions le remplacer par le message le plus proche. Un message est en fait l’image de Fk2 par uM , l’endomorphisme canoniquement associé à M. Ima:()); (j:0;j<2^k;j++){ Ima:Ima,M*Fdeux(j,k)%2; }; Ima:[Ima];
construit la liste des images des vecteurs de Fk2 par uM . Techniquement, on rajoute à la séquence Ima au départ vide les vecteurs M*Fdeux(j,p). On n’oublie pas le %2 qui symbolise le calcul modulaire dans F2 . L’instruction Ima:=[Ima]; sert alors à transformer la séquence en liste de liste, c’est-à-dire en matrice. Cependant, les composantes des vecteurs sont mis à la queue-leu-leu, sans qu’on puisse distinguer les vecteurs. Il faut donc avoir les idées claires sur les dimensions de nos espaces p:(M); n:(M);
Nous avons donc avec Ima une matrice où chaque ligne représente les 2k vecteurs de l’image de uM . Dressons à présent la liste des 2n −2k vecteurs de Fn2 qui n’appartiennent pas à I m(uM ). Nous utiliserons la fonction C8.3(member)vecteur,matrice qui renvoie 0 si le vecteur n’appartient pas à la matrice ou bien le numéro de la ligne qui lui correspond sinon.
XCAS commence à compter à 0 ! Par souci de compatibilité, le numéro renvoyé par
est donc le numéro de ligne + 1
(k:0;k<2^n;k++){ ( (Fdeux(k,n)%2,Ima)0) L:L,Fdeux(k,n); }; L:[L];
249
) , Nous obtenons ainsi une matrice de 2n − 2k vecteurs qui ne sont pas des messages : appelons la famille formée par ces vecteurs (ui ). La ruse est de se dire : « je reçois un message v. C’est un des 2n vecteurs de Fn2 : si c’est un des 2k vecteurs de I m(uM ), tout va bien. Sinon, je peux l’écrire sous la forme v = m + e avec m un vecteur de l’image (un vrai vecteur) et e l’erreur commise. Plus e sera de poids petit, plus m sera près du message transmis et donc je pourrais penser que probablement le véritable message transmis était m. » Nous allons donc ordonner les ui par ordre de poids croissant. Ensuite nous formerons les vecteurs ui + m j : si ce vecteur a déjà été formé auparavant, on l’élimine, sinon, on le garde. On parcourt la liste des lignes, et on ajoute à chaque ligne son poids :
(j:0;j<" (L);j++){ L[j]<[ (L[j]),(L[j])]; }
On a remplacé - par A pour plus de rapidite (=< fait la modification en place dans L, alors que := crée une copie de la liste a chaque fois). Il ne nous reste plus qu’à trier ces vecteurs selon l’ordre croissant des poids. La fonction qui joue ce rôle. Il faut juste lui expliquer comment classer : ici, c’est l’odre croissant selon la première ligne.
(L,(x,y)->x[0]
(U,00)
On rajoute une ligne nulle qu’on remplacera par les vecteurs de I m(uM ) U:
([[0
n]],U)%2
On forme ensuite la première ligne de notre matrice finale en ajoutant la première ligne de U à celle de Ima N:[(U[0]+Im[g]) (g02^k-1)]:;
Ensuite, on rajoute les ui qui n’ont pas déjà été rajouté avant. On utilise pour cela la commande (a,b,liste de a*b matrices) qui forme une matrice de a blocs de longeur b. h:1; (h<(2^n-2^k)){ ( (U[h],N)0) N: (2,1,[N,[(U[h]+Im[g])
h:h+1;
(g02^k-1) ]]):;
}
Il ne nous reste donc plus qu’à conclure par
( (v%2,N[02^k]) 0) (v+"est
{q:((( (v,N))-1) 2^k)%0; 250
bien un mot de code");
3 '2 : On retrouve un vecteur ui toutes les 2k lignes. Le problème, c’est que le résultat donné par mode est l’entier le plus proche de 2k , donc peut être négatif. Le « passage » de l’entier modulo 2k à l’entier tout cours via le %0 comporte donc des risques. On y remédie grâce à
(q>0) (v+" doit être corrigé
{q:q+2^k; (v+" doit être
en "+Ima[q]%0); corrigé en "+Ima[q]%0);} };
&
Il reste à vérifier que le choix du message corrigé est justifié. Il s’agit en fait de regarder I m(uM ) et plus particulièrement les distances séparant ses différents éléments. S’il existe au plus un élément m de I m(uM ), tel que pour tout message erroné m , on ait ω(m − m ) t , on pourra corriger jusqu’à t erreurs. Cela veut dire que la distance minimum entre deux éléments de I m(uM ) doit être au moins égale à 2t + 1. Nous en déduisons que t est la partie entière de (PoiMin(M) − 1)/2, avec PoiMin la procédure qui donne le poids minimum d’une liste de vecteurs : PoiMin(M):{ L,k; k:(M); L:[]; (j:1;j<2^k;j++){ L: (L, (M*Fdeux(j,k))); }
( (L)); }
Un code t -correcteur est dit parfait si la réunion des boules fermées de centre chaque élément de I m(uM ) et de rayon t donne Fn2 . Il s’agit en fait pour nous de vérifier que la matrices formées des vecteurs ui a un poids minimum inférieur à t . Pour changer, au lieu de construire une séquence puis une matrice en y rajoutant des crochets, on est parti d’une liste tout de suite (avec W:=[]), on concatène une autre liste avec et on coupe cette liste en tronçons de longueur n pour en faire une matrice grâce à ' (Liste,n) : c’est plus lourd, mais ça permet de voir un peu de syntaxe... Nous pouvons donc rajouter à notre procédure les lignes suivantes : X:N%0; W:[]; (r:0;r<(X);r:r+2^k){ W: (W,X[r]); }; W: ' (W,n); ("Le code est "+((PoiMin(M)-1)/2)+"-correcteur"); (PoiMin(W)<((PoiMin(M)-1)/2)) ("Le code est parfait");
{ ("Le code n’est parfait")};
251
) , La procédure sous sa forme finale est donc decod1(M,v):{ Ima,L,P,U,N,W,X,l,j,k,K,g,h,x,y,q,r,p,n,m,current,nbsolutions,pos; k:(M); n:(M); ((v) n) ("Le message n’est de la bonne taille.");
{ Ima:());L:());P:[];U:[]; (j:0;j<2^k;j++){ Ima:Ima,M*Fdeux(j,k)%2; }; Ima:[Ima]; (K:0;K<2^n;K++){ ( (Fdeux(K,n)%2,Ima)0) L:L,Fdeux(K,n); }; L:[L];
(j:0;j<" (L);j++){ L[j]<[ (L[j]),(L[j])]; }
(L,(x,y)->x[0]
(L,00); U: ([[0 n]],U)%2; N:[(U[0]+Ima[g]) (g02^k-1)]:; h:1; (h<(2^n-2^k)){ ( (U[h],N)0) N: (2,1,[N,[(U[h]+Ima[g])
h:h+1;
(g02^k-1) ]]):;
}:; X:N%0; W:[]; (r:0;r<(X);r:r+2^k){ W: (W,X[r]); }; W: ' (W,n); ("Le code est "+((PoiMin(M)-1)/2)+"-correcteur"); (PoiMin(W)<((PoiMin(M)-1)/2)) ("Le code est parfait");
{ ("Le code n’est parfait")};
( (v%2,N[02^k]) 0) (v+"est
{q:((( (v,N))-1) 2^k)%0; 252
bien un mot de code");
3 %! 8 2 2 !
(q>0) (v+" doit être corrigé
{q:q+2^k; (v+" doit être
en "+Ima[q]%0); corrigé en "+Ima[q]%0);} };
}
Maintenant, si l’on demande decod1(A,[1,1,1,0,0,0,0])
on obtient Réponse du logiciel "Le code est 1-correcteur" "Le code est parfait" "[1,1,1,0,0,0,0] doit être corrigé en [1,1,1,0,0,1,0]" Evaluation time: 0.27
Le problème, c’est que cette procédure induit un nombre assez important de calculs qui la rendent inefficace pour des codes de longueur assez grande : par exemple, si on choisit n = 32 et p = 6, il faut 16 GB pour mémoriser les 232 vecteurs de 32 bits chacun... Il va donc falloir appeler les mathématiques au secours !
8 " & % &@ Un code est dit cyclique si, et seulement si, pour tout mot de code m, tout mot obtenu par permutation circulaire des coordonnées est encore un mot de code. Il s’avérera très pratique de ne plus représenter un mot par un vecteur de Fn2 mais plutôt par un polynôme de F2 [X] : après tout, pour l’ordinateur, c’est dans chaque cas une liste de n opérandes. Des considérations d’algèbre générale c permettent de dire qu’une permutation circulaire du message revient à effectuer une multiplication par X modulo X n +1 du « polynôme message ». On montre alors que I m(uM )[X] est un idéal de l’anneau principal F2 [X]/(X n + 1) de la forme g (X) · F2 [X]/(X n + 1). On montre que g (X) divise X n + 1. On appelle g (X) le polynôme générateur du code. Notons h(X) le quotient de la division euclidienne de X n + 1 par g (X). On montre également que tout mot m du code est une combinaison linéaire des X j g (X), et -n -n j j n (X + 1) qui est nul dans F2 [X]/ donc que m(X) · h(X) = j =0 m j X g (X)h(x) = j =0 m j X n (X + 1). On appelle alors h(X) le polynôme de contrôle du code : il porte bien son nom car son produit avec un « polynôme-message » ne s’annule que si le message est un mot du code. Nous allons étudier un code cyclique particulier : le code de Hamming qui est 1-correcteur et parfait. Pour ces codes, n est de la forme 2r − 1, les mots de code ont pour longueur n − r . Nous allons construire une procédure Hamming(n,g,m) où g est un polynôme générateur du code, m un message qui sera éventuellement corrigé si ce n’est pas un mot de code. On construit le polynôme h(X), quotient de Xn + 1 par g . h(x):((x^n+1,g(x))%2); c Voir B RUGÈRE , Thierry/M OLL ARD , Alain, ibid. page 321
253
) , On transforme ensuite h(X) en la liste des coefficients grâce à la fonction ajoute autant de zéros que nécessaires pour former une liste de longueur n : L:
' et on
'(h(x)*x^(n-1-
(h(x))));
On crée ensuite la matrice de contrôle formée du vecteur L et de ses « permutations ciculaires » successives. On utilise la fonction (L,k) qui permet d’effectuer une permutation des k derniers éléments avec le début de la liste si k est négatif. On aurait pu tout aussi bien former les produits de h(X) par les X j et utiliser ', c’est l’occasion de voir une commande utile... H:()); (j:0;j
(h(x));j++){ H:H, (L,-j)}; H:[H];
Il ne reste plus qu’à former le produit de la matrice de contrôle avec le message et à tester si c’est un mot de code : mess:H*m%2; (mess[0 (m+"est
(n-
(h(x)))]%2) { bien un mot de code");
}
sinon, le vecteur non nul obtenu est le k e vecteur colonne de la matrice de contrôle ce qui indique que l’erreur est faite sur la k e composanted . Puisqu’on travaille dans Fn2 , il suffit de rajouter au message reçu le k e vecteur de la base canonique de Fn2 :
{ B:[1,0 (n-1)]; r: (mess, (H)); corr:m%2+ (B,-r+1)%2;corr:corr%0; (m+" doit être corrigé en "+corr); Le programme complet est donc : Hamming(n,g,m):{ h,g,x,L,H,j,mess,B,r,corr; ((m) n) ("Le message n’est
{ h(x):((x^n+1,g(x))%2); L: '(h(x)*x^(n-1-
(h(x)))); H:()); (j:0;j
(h(x));j++){ H:H, (L,-j)}; H:[H]; mess:H*m%2; (mess[0 (n-
(h(x)))]%2) { (m+"est bien un mot de code"); d Le code de Hamming est 1-correcteur
254
de la bonne taille.");
3& * - 2 8 2 2 !
}
{ B:[1,0 (n-1)]; r: (mess, (H)); corr:m%2+ (B,-r+1)%2;corr:corr%0; (m+" doit être corrigé en "+corr); } } }
et : Hamming(31,1+x^3+x^5, [1,0,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,1]);
renvoie : Réponse du logiciel "[1,0,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,1] doit être corrigé en [1,0,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0]"
quasi instantanément, ce qui est donc bien plus efficace que notre premier algorithme.
8 " % 3 " % &@ 3
Pour plus de détails sur les développements mathématiques, vous pourrez par exemple étudiere . Nous ne ferons ici qu’évoquer certains résultats. Notre objectif est de créer une procédure donnant un polynôme générateur d’un code cyclique en fixant sa longueur n et sa capacité de correction t . Nous n’étudierons que des codes dont la longueur s’exprime sous la forme n = 2m − 1. Le résultat fondamental est que le corps de Galois de caractéristique 2 et de cardinal 2m (qu’on notera GF(2,m)) est isomorphe à F2/P(X) avec P(X) un polynôme irréductible sur GF(2,m), de degré m). Une étude poussée sur les corps finis permet de conclure qu’un polynôme générateur sera de la forme PPCM(μ1 (X), μ3 (X), · · · , μ2t −1 (X)) avec μk (X) le polynôme minimal de αk , α étant un élément primitif de GF(2,m). On va donc commencer par construire les classes cyclotomiques modulo 2m − 1 des αk . cyclo(k,m):{ l,L,n; n:2^m-1; L:k%n; l:2*k%n; (l k%n){ e B ADRIKIAN , Josèphe, ibid.
255
) , L:L,l;l:2*l%n }; L:[L] }
Par exemple, cyclo(3,5)
renvoie : Réponse du logiciel [3 % 31,6 % 31,12 % 31,-7 % 31,-14 % 31]
On construit ensuite le polynôme minimal de αk qui est le polynôme normalisé de racines les éléments de la classe cyclotomique de αk : poly_min(cycle,alpha):{ r,k; r:1; (k:0;k<(cycle);k++){ r:r*(x-alpha^(cycle[k]%0)) };
(r) }
On ajoute simplifier pour plus de lisibilité. Cependant, pour pouvoir utiliser cette procédure, il faut connaître α. Pour cela, on va construire GF(2,m) grâce à 16(caractéristique,longueur,options). Par exemple, avec : K:16(2,5,[x,’K’]);
on obtient : Réponse du logiciel GF(2,x^5+x^3+1,[x,K],undef)
qui indique que le polynôme irréductible et primitif utilisé est X 5 + X 3 + 1. On va utiliser comme élément primitif générateur de GF(2,5) x, qui est désigné par K(x) : poly_min(cyclo(3,5),K(x))
renvoie : Réponse du logiciel x^5+x^3+x^2+x+K(1)
Donc, on peut maintenant créer une procédure gen(t,m) :
256
3& * - 2 8 2 2 ! gen(t,m):{ g,alpha,j,p; K:16(2,m,[x,’K’]);alpha:K(x); p: (poly_min(cyclo(2*j-1,m),alpha),j1t); (p%2); }
et : gen(3,5)
renvoie : Réponse du logiciel x^15+x^14+x^13+x^12+x^10+x^8+x^7+x^6+x^5+x^4+K(1) % 2
On peut alors créer une matrice de contrôle assez rapidement. Le problème sera de corriger l’erreur... Pour des codes 1-correcteurs, notre procédure Hamming suffit. On construit un polynôme générateur d’un code de Hamming grâce à gen(1,longueur). Pour obtenir des capacités de correction plus grande, mieux vaut se tourner vers les codes de Reed-Solomon que nous ne développerons pas ici. Une procédure concernant ces codes existe dans les exemples fournis par votre distribution XCAS dans Exemples->Poly->reed_sol.xws.
257
Surfaces de projection imposée Logiciel(s) abordé(s) : XCAS
Notions informatiques : Nous traiterons un problème qui semblerait plutôt adapté à un langage fonctionnel comme Caml mais qui peut cependant être également traité par XCAS. Nous verrons aussi comment tracer des surfaces définies implicitement. Problématique : On va chercher à donner une « équation » d’un polygone régulier de R2 défini normalement à l’aide d’un système d’inégalités. Pour cela on définira une variété de R3 dont la projection sur R2 est le polygone. Ce problème est inspiré d’un sujet de l’épreuve de modélisation de l’agrégation externe, session 2006.
9
Commençons par descendre d’une dimension pour poser le problème. La demi-droite de R définie par l’inégalité x 0 peut être également caractérisée comme étant la projection sur R de la parabole de R2 d’équation x = t 2 . Le problème que nous traiterons ici concernera les polygones réguliers de R2 que nous pouvons facilement définir ainsi, avec les b i des polynômes : S = (x, y, z) ∈ R3 , b1 (x, y, z) 0, . . . , b n (x, y, z) 0 Il s’agit donc d’ensembles semi-algébriques à comparer aux ensembles algébriques qui sont des ensembles des zéros d’un système d’équations polynomiales. Il est souvent peu pratique de travailler avec des ensembles semi-algébriques, au moins informatiquement parlant, puisqu’il faut tenir compte de n conditions. Nous admettrons alors le résultat suivant :
2@
; " ! 8 ! %! (x, y, z) ∈ S ⇐:∃t ∈ R, P(x, y, z, t ) = 0
2 0 : 8 Notre problème sera donc de trouver de tels polynômes, de tracer la surface d’équation implicite P(x, y, z, t ) = 0 et de la projeter correctement pour « voir » le polygone.
9 " % &@ %
( ! "
Soit n un entier naturel non nula et k ∈ 0 ; n. On fabrique une suite de polynômes de la manière suivante :
(A 2@
P1 (x1 , u) = u − x1 1 X = (x1 , . . . , xn ) 2 Pk+1(x1 , . . . , xk+1 , u) = Pk a1 (X), . . . , ak (X), u − (x1 + · · · + xk+1 )
ak (X) = xk+1 (x1 + · · · + xk )
Pour se familiariser avec ces polynômes, on peut construire les premiers à la main. 2 P2 (x, y, u) = P1 a1 (x, y), u − (x + y) . Or a1 (x, y) = y(x), donc 2 2 P2 (x, y, u) = P1 x y, u − (x + y) = u − (x + y) − x y
"
La définition des polynômes ak ne pose pas trop de problème : a(k,x):x[k+1]* (x[j],j,1,k)
Le problème vient surtout de cette définition de polynômes qui dépendent d’un nombre variable d’indéterminées et dont la définition est triplement récurrente puisqu’elle dépend du polynôme d’ordre inférieur, mais aussi d’autres polynômes, les ak et de la somme des indéterminées qui dépend aussi de k. Un mathématicien un peu informaticien voit ici des « fonctions de fonctions » et pencherait vers un langage fonctionnel tel que Caml. C’est une manière naturelle de voir les choses, mais peu efficace avec un langage impératif comme celui utilisé par XCAS. Il faut donc apprendre à réfléchir autrement et voir un programme impératif comme un casier à tiroirs dont on peut à volonté modifier le contenu en gardant une même structure. Et pour changer le contenu des tiroirs, on utilise (Expression,ancien,nouveau)b . Par exemple, créons une expression : L:a+b-c*d
et remplaçons b par 2 : a Dans le cas qui nous intéresse, n = 3. b
a d’autres propriétés comme par exemple les changements de variables dans les intégrales.
260
4 ! ! 8 2 L: (L,b,2)
qui pourrait se lire :« dans L, on remplace b par 2 ». On peut également faire des substitutions plus conséquentes : L: (L,[a,c,d],[1,3,4])
C’est exactement ce que nous allons faire pour nos polynômes. Le secret est de ne pas travailler sur des fonctions mais sur des expressions pour palier au problème du nombre variable... de variables. Voici le cœur du programme : nouveauzarguments:[ (a(j,x),j1k),(u- (x[j],j,1,k+1))^2] indeterminees:[ (x[j],j1k),u]; polytemp: (polytemp,indeterminees,nouveauzarguments);
Au départ, polytemp vaut Pk (x1 , . . . , xk , u). 2 On remplace alors x1 , . . . , xk , u (noté indeterminees) par a1 (X), . . . , ak (X), u−(x1 +· · ·+xk+1 ) (noté nouveauzarguments) dans polytemp, et on recommence... Voici le programme complet : ListePoly(n):{ k,polytemp,nouveauzarguments,indeterminees,liste; polytemp:u-x[1]; liste:polytemp; (k:1;k
Le problème, c’est que nous n’avons pas un polynôme, mais une liste de polynômes. Ainsi : ListePoly(2)
renvoie : Réponse du logiciel
u − (x[1]), (u − (x[1]) − (x[2]))2 − (x[2] · x[1])
Nous allons utiliser (Expression,Variable(s)) qui transforme une expression en fonction de la ou des variable(s). P2:( (ListePoly(2)[1],[x[1],x[2]],[x1,x2]),x1,x2,u)
261
2 0 : 8 Réponse du logiciel
(x1,x2,u)->(u-x1-x2)^2-x2*x1
et donc : P2(x,y,t^2)
renvoie : Réponse du logiciel
(t )2 − x − y
2
− y·x
9 0B 3 % & + Notre problème est de définir avec un minimum d’inégalités un polygone convexe régulier, ou plus précisément « l’intérieur » du polygone. Une chose est d’abord sûre : les sommets du polygone sont inscriptibles dans un cerclec , donc le polygone est compris dans un disque. Ici, cela nous donne déjà une inégalité : 1 − x2 − y 2 0 En fait, nous allons tenter de n’utiliser qu’une deuxième inégalité.
*
?
Observons un cas particulier. On peut considérer les côtés deux à deux. Par exemple appelons f 1 et f 2 les fonctions affines dont les représentations graphiques sont respectivement d1 et d1 . On obtient facilement qu’il existe deux réels a et b tels que f 1 (x) = ax + b et f 1 (x) = −ax − b. Avec un peu d’astuce, on obtient que le polygone peut être caractérisé par le système : ⎧ ⎪ ⎪ (ax + b)2 − y 2 0 ⎪ ⎪ ⎨ (ax − b)2 − y 2 0 ⎪ ⎪ ⎪ ⎪ ⎩ 2 c − y2 0 c Nous considèrerons ici qu’il s’agit du cercle de centre O et de rayon 1.
262
4& (2< - 2%! )! " 2! b
e
2iπ × 2/n
d2 c
e
d3 e
2iπ × 1/n
d1
2iπ × 3/n
e d 3
e
2iπ × 4/n
−c d 2
2iπ × 0/n
d 1 e
2iπ × 5/n
−b
Hexagone
Et avec énormément d’astuce, tout ceci peut se réduire au système :
⎧ ⎪ ⎨(ax + b)2 − y 2 (ax − b)2 − y 2 c 2 − y 2 0 ⎪ ⎩1 − x 2 − y 2 0
*
?
Observons un autre cas particulier. Avec toujours autant d’astuce, on peut caractériser le polygone par le système :
⎧ ⎪ ⎨(a x + b )2 − y 2 (a x + b )2 − y 2 x − b 0 1 1 2 2 3 ⎪ ⎩ 2 2 1−x − y 0
263
2 0 : 8
b1
e
e
d2 b2
2iπ × 2/n
2iπ × 1/n
d1
d3
e
b3 e
2iπ × 3/n
d 2
−b 2
2iπ × 0/n
d 1
2iπ × 4/n
e −b 1
Pentagone
"
Nous utiliserons la commande (point1,point2)d qui détermine la droite passant par les points 1 et 2. Nous utiliserons également (courbe,[x,y]) qui donne une équation de la courbe courbe. Enfin, la commande (egalite)[0] renvoie la partie droite d’une égalité. La lecture du programme suivant devient alors limpide : b( g ) : { B ; B : ; ( k : 1 ; k< g / 2 ; k++) { B[ k−1] : ( ( ( ( ( * ( k−1) * 2 * /g ) , ( * k * 2 * /g ) ) , [ x , y ] ) [ 0 ] ) ) ^2−y^2 } ( g 2 0) { ( (B[ j ] , j 0g/2−1) ,1−x^2−y ^2) } {
( (B[ j ] , j 0 ( g / 2) −1) * ( x− ( 2 * * ( g / 2) /g ) ) ,1−x^2−y^2) } }:;
Par exemple : b(4)
donne : d Il y a bien d’autres syntaxes possibles.
264
4 ! ) 2%! 7 2< - 2%! Réponse du logiciel
((−x + 1)2 − (y)2 ) · ((x + 1)2 − (y)2 ), 1 − (x)2 − (y)2
9 " ? % B 3 Vous pourrez prouver pendant vos temps libres qu’il existe un polynôme P tel que v ∈ S = X ∈ R2 , b(X) 0, c(X) 0 ⇐:∃z ∈ R, P(b(v), c(v), z 2 ) = 0 et que P2 décrit plus haut convient. Pour visualiser, nous utiliserons la commande
(P(x,y),x,y).
( (p2(b(4),z^2)),x-11,y-11,z05, 0.1, 0.1," 0.1)
Variété dont la projection est un carré Pour obtenir la vue de dessus, on clique sur Menu−→3-d−→vue de dessus z=cst :
265
2 0 : 8
Carré : projection sur (xOy)
;3 ( (p2(b(6),z^2)),x-11,y-11,z05, 0.1, 0.1," 0.1)
Variété dont la projection est un hexagone
266
4# Pour obtenir la vue de dessus, on clique sur Menu−→3-d−→vue de dessus z=cst :
Hexagone : projection sur (xOy)
9,
Le texte complet du sujet d’agrégation se trouve à l’adresse http://agreg.dnsalias.org/Textes/590.pdf
Vous comprendrez alors pourquoi nous avons construit une procédure pour trouver P2 alors qu’il aurait été plus simple de le déterminer « à la main » : nous n’avons en effet exploré que le cas particulier des polygones convexes réguliers.
267
Taches des animaux Logiciel(s) abordé(s) : Scilab
Notions informatiques : Modélisation rudimentaire d’équations aux dérivées partielles par des différences finies
Problématique : Le logiciel Scilab est adapté au calcul approché de systèmes dynamiques faisant intervenir des dérivées partielles.
Le problème étudié ici est dû à une conjecture développée par Alan Turing concernant la formation des taches sur le pelage des animaux. Le véritable processus biologique n’est pas connu : voir le livre de Murraya . Le modèle mathématique est celui de deux hypothétiques substances chimiques A et B qui interagissent et se diffusent dans la peau de l’embryon d’un animal. À un certain stade de développement de l’embryon, le processus est figé et la concentration de l’un des deux produits en un endroit donné détermine la couleur de la peau ou des poils quand elle dépasse un certain seuil. Les concentrations notées A et B des deux produits dépendent du temps et de l’espace (bidimensionnel). L’évolution est conditionnée par le système ⎧ ∂A ⎪ ⎪ ⎪ ⎪ ⎨ ∂t
=
F(A, B)
+
DA Δ A
⎪ ⎪ ⎪ ⎪ ⎩ ∂B ∂t
=
G(A, B)
+
DB Δ B
Les fonctions F et G décrivent la cinétique chimique. Les laplaciens représentent le phénomène de diffusion. a M URRAY , J. D. Mathematical biology . Berlin: Springer, 1993.
1
Le laplacien est la divergence du gradient : c’est un opérateur différentiel du second ordre. La divergence d’un champ de vecteurs est la trace de l’application linéaire tangente à ce champ.
Il est important que les deux coefficients de diffusion DA et DB soient différents et non nuls. Le calcul approché sera fait sous Scilab en représentant l’espace par un maillage rectangulaire. Les concentrations A et B sont représentées par des matrices. Le laplacien est réalisé sous forme discrète par un calcul matriciel. Trois formes de domaines sont présentées :
➥
un rectangle ;
➥
un cylindre, c’est-à-dire un rectangle dont deux côtés opposés sont recollés ;
➥
un tore, c’est-à-dire un rectangle ; dont les côtés opposés sont recollés deux-à-deux : un cylindre fermé.
#C'
Les données sont stockées dans des fichiers. Il faut d’abord récupérer les matrices qui correspondent aux dix étapes. A0 (’./A0’,maille,maille)/1e2 A1 (’./A1’,maille,maille)/1e2 A2 (’./A2’,maille,maille)/1e2 A3 (’./A3’,maille,maille)/1e2 A4 (’./A4’,maille,maille)/1e2 A5 (’./A5’,maille,maille)/1e2 A6 (’./A6’,maille,maille)/1e2 A7 (’./A7’,maille,maille)/1e2 A8 (’./A8’,maille,maille)/1e2 A9 (’./A9’,maille,maille)/1e2
; ; ; ; ; ; ; ; ; ;
B0 (’./B0’,maille,maille)/1e2 B1 (’./B1’,maille,maille)/1e2 B2 (’./B2’,maille,maille)/1e2 B3 (’./B3’,maille,maille)/1e2 B4 (’./B4’,maille,maille)/1e2 B5 (’./B5’,maille,maille)/1e2 B6 (’./B6’,maille,maille)/1e2 B7 (’./B7’,maille,maille)/1e2 B8 (’./B8’,maille,maille)/1e2 B9 (’./B9’,maille,maille)/1e2
; ; ; ; ; ; ; ; ; ;
270
= 2
Les matrices Ai représentent les concentrations en produit A à la date i . On définit les coordonnées des noeuds de la grille. xx1:S yyxx
La palette des couleurs est réduite pour des vidéoprojections en toutes conditions, et pour mettre en valeur l’effet de seuil.
("colormap", (32)) r[0;1]; g[0;1]; b[1;0]; h[r g b]; On affiche la première donnée, concentration en produit A au début.
("colormap",h) %(xx,yy,A0) On affiche la deuxième donnée après une demi-seconde.
(’sleep 0.5’) %(xx,yy,A1)
Attention ! Certains interpréteurs de commandes (Shell) des systèmes Linux sont malheureusement francisés pour les données numériques, ce qui oblige soit à changer les durées 0.5 en 0,5, soit à changer une variable d’environnement linguistique. . .
On aurait pu construire une boucle itérative pour toutes ces opérations répétitives, mais pour un film de dix images cela n’en vaut pas la peine.
(’sleep 0.5’) %(xx,yy,A2) (’sleep 0.5’) %(xx,yy,A3) (’sleep 0.5’) %(xx,yy,A4) (’sleep 0.5’) %(xx,yy,A5) 271
1 (’sleep 0.5’) %(xx,yy,A6) (’sleep 0.5’) %(xx,yy,A7) (’sleep 0.5’) %(xx,yy,A8) (’sleep 0.5’) %(xx,yy,A9) On ouvre une nouvelle fenêtre pour y placer la représentation colorée de la concentration en produit B. La matrice h des couleurs est déja fixée.
() //
couleurs
("colormap", (32)) Il ne reste plus qu’à y placer le film pour B.
("colormap",h) %(xx,yy,B0) (’sleep 0.5’) %(xx,yy,B1) (’sleep 0.5’) %(xx,yy,B2) (’sleep 0.5’) %(xx,yy,B3) (’sleep 0.5’) %(xx,yy,B4) (’sleep 0.5’) %(xx,yy,B5) (’sleep 0.5’) %(xx,yy,B6) (’sleep 0.5’) %(xx,yy,B7) (’sleep 272
0.5’)
& ! ! !
%(xx,yy,B8) (’sleep 0.5’) %(xx,yy,B9)
" Le laplacien discret appliqué à une matrice carrée A est construit de manière traditionnelle.
Dlap(A) s" (A) tts(1) ttt-1 TTs(2) TTT-1 j (t,t) z" (t,1) kk[z’,0;j,z] m2* (tt,tt)-kk-kk’ J (T,T) Z" (T,1) KK[Z’,0;J,Z] M2* (TT,TT)-KK-KK’ Dm*A+A*M
Il faut définir les données qui interviennent dans l’équation d’évolution. DA1 DB2 k1.1 k2.02 k3.03 k4.04
La fonction qui contient le système dynamique s’appelle champ. L’équation d’évolution est considérée comme une équation différentielle ordinaire en le temps t . La partie spatiale de l’évolution est contenue dans la fonction champ et la dimension des matrices.
ypoint (t,y) T" (y,1) S" (y,2) id (S,S) ; un (S,S) ; Z" (S,S) D[ DA*id , Z ; Z , DB*id ] F[ -k2*id , Z ; Z , -k4*id ] ypoint( [ k1*un ; k3*un ]+F*y ) + D*lap(y)
273
1 Les conditions initiales sont d’abord initialisées par une répartition spatiale aléatoire. t0:.01:.13 ; t00 ; maille10 y00.00001* (2*maille,maille) ;
La première photographie de la situation est calculée. Les dimensions S et T sont définies par commodité. y
(y0,t0,t, T" (y,2) S" (y,1)/2
)
;
Les données initiales sont enregistrées dans des fichiers. A0y0(1:S,:) B0y0(S+1:2*S,:) (’./A0’,A0) (’./B0’,B0)
Les données de la première étape sont enregistrées à leur tour. Y1y(:,T-S+1:T) A1Y1(1:S,:) B1Y1(S+1:2*S,:) (’./A1’,A1) (’./B1’,B1)
Les autres étapes sont enregistrées. La facilité d’utilisation de l’éditeur de texte Emacs nous a dissuadé de construire une boucle. . . y2
(Y1,t0,t, Y2y2(:,T-S+1:T) A2Y2(1:S,:) B2Y2(S+1:2*S,:) (’./A2’,A2) (’./B2’,B2)
)
;
y3
(Y2,t0,t, Y3y3(:,T-S+1:T) A3Y3(1:S,:) B3Y3(S+1:2*S,:) (’./A3’,A3) (’./B3’,B3)
)
;
y4
(Y3,t0,t, Y4y4(:,T-S+1:T) A4Y4(1:S,:) B4Y4(S+1:2*S,:) (’./A4’,A4)
)
;
274
& ! ! !
(’./B4’,B4) y5
(Y4,t0,t, Y5y5(:,T-S+1:T) A5Y5(1:S,:) B5Y5(S+1:2*S,:) (’./A5’,A5) (’./B5’,B5)
)
;
y6
(Y5,t0,t, Y6y6(:,T-S+1:T) A6Y6(1:S,:) B6Y6(S+1:2*S,:) (’./A6’,A6) (’./B6’,B6)
)
;
y7
(Y6,t0,t, Y7y7(:,T-S+1:T) A7Y7(1:S,:) B7Y7(S+1:2*S,:) (’./A7’,A7) (’./B7’,B7)
)
;
y8
(Y7,t0,t, Y8y8(:,T-S+1:T) A8Y8(1:S,:) B8Y8(S+1:2*S,:) (’./A8’,A8) (’./B8’,B8)
)
;
y9
(Y8,t0,t, Y9y9(:,T-S+1:T) A9Y9(1:S,:) B9Y9(S+1:2*S,:) (’./A9’,A9) (’./B9’,B9)
)
;
Les fichiers sont prêts pour l’affichage (voir section 11.2). Si des fichiers Ai,Bi sont déja enregistrés, il est bon de les effacer par la commande :
(’rm
A[0-9] B[0-9]’)
Le programme de construction peut alors être exécuté.
275
1
La concentration en produit B à la fin de l’animation sur le rectangle
" Le recollement des arêtes du rectangle affecte seulement la définition du laplacien.
Dlap(A) s" (A) tts(1) ttt-1 TTs(2) TTT-1 j (t,t) z" (t,1) k[z’,1;j,z] l2* (tt,tt)-k-k’ J (T,T) Z" (T,1) K[Z’,1;J,Z] L2* (TT,TT)-K-K’ Dl*A+A*L
Le reste du programme est le même. L’affichage de la concentration finale B donne des valeurs moins élevées.
276
# ! ! !
La concentration en produit B à la fin de l’animation sur le tore
, " & La définition du laplacien sur un cylindre est intermédiaire entre le cas du rectangle et celui du tore.
Dlap(A) s" (A) tts(1) ttt-1 TTs(2) TTT-1 j (t,t) z" (t,1) k[z’,1;j,z] l2* (tt,tt)-k-k’ J (T,T) Z" (T,1) KK[Z’,0;J,Z] M2* (TT,TT)-KK-KK’ Dl*A+A*M
Les données sont modifiées pour rapprocher les deux coefficients de diffusion. DA1 DB1.00001 k1.0002
277
1 k2.0002 k30.0002 k4.0002
Les intervalles de temps sont agrandis, le maillage est plus fin. t0:.01:.27 ; t00 ; maille20 ;
Le reste du programme est similaire aux autres cas. L’affichage de la concentration finale B montre une figure nettement différente.
La concentration en produit B à la fin de l’animation sur le cylindre
278
Quatrième partie
ANNEXES
Tableaux comparatifs
D Logiciel
Licence
Site internet
Bc
GPL
http://www.gnu.org/software/bc/manual/bc.html
Maxima
GPL
http://maxima.sourceforge.net
MuPAD
commerciale
http://www.mupad.de
Octave
GPL
http://www.octave.org
PARI/Gp
GPL
http://pari.math.u-bordeaux.fr/
Scilab
Scilab
http://www.scilab.fr
Yacas
GPL
http://yacas.sourceforge.net
XCAS
GPL
http://www-fourier.ujf-grenoble.fr/~parisse/giac_fr.html
GnuPlot
GPL
http://www.gnuplot.info/
Sites de téléchargement
Logiciel
Fichier de configuration
Maxima
/.wxMaxima
PARI/Gp
/.gprc
Yacas
/yacas/yacasinit.ys
XCAS
/.xcasrc
Où se trouve le fichier de configuration ?
1 1 : Logiciel
Ensemble
Liste
Matrice
Maxima
[1, 2]
[1, 2]
matrix([1,2], [3,4])
MuPAD
{1, 2}
[1, 2]
matrix([[1, 2], [3, 4]])
Octave
[1 2]
[1 2;3 4]
PARI/Gp
[1,2]
[1,2 ; 3,4]
Scilab
[1 2]
A=[1 2;3 4]
Yacas
{1,2}
{1,2},{3,4}}
[1,2]
[[1,2],[3,4]]
XCAS
set[1,2] %{1,2%}
matrix(2,2,(j,k)->j+k)
Entrer une liste ou une matrice
Logiciel
Équation
Élément d’une liste
Élément d’une matrice
Longueur d’une liste
Maxima
x=0
l[2]
m[2, 3]
length(l)
MuPAD
x=0
l[2]
m[2, 3]
nops(l)
Octave
x=0
l(2)
l(2,1)
PARI/Gp
x=0
l[2]
l[1,2]
Scilab
x=0
l(2)
l(2,1)
Yacas
x==0
XCAS
x=0
length(l)
l[2][1] l[2]
l[2][1]
size(l)
Manipulation des listes et matrices
Logiciel
True
False
And
Or
Not
Equal
Bc
0
1
&&
||
!
==
Maxima
true
false
and
or
not
=
#
MuPAD
true
false
and
or
not
=
<>
PARI/Gp
0
1
&&
||
!
==
Scilab
%t
%f
&
or
not
= ==
Yacas
True
False
MathAnd
MathOr
MathNot
Equals
XCAS
0
1
and &&
or ||
!
==
Opérateurs booléens
282
Not equal
<>
!=
" !" 5
Logiciel
Assignement
Définition de fonctions
Bc
y=3
define f(x,y) {return(x*y);}
Maxima
y:3;
f(x, y):= x*y;
MuPAD
y:= 3;
f:= proc(x, y)
Octave
y=3;
function f(x,y)
begin x*y end_ proc;
x*y endfunction PARI/Gp
y=3
f(x,y)=x*y
Scilab
y=3;
function f(x,y) x*y endfunction
Yacas
y:=3;
Function(“f”,x,y)[x*y;];
XCAS
y:=3
f(x,y):={x*y }
Comment rentrer une fonction ?
Logiciel
If+then+else
Bc
if(test) ...;...;
Maxima
if test then ... else if test then ... else ...
MuPAD
if test then ... elif test then ... else ... end_if
Octave
if (test) ... else ... endif
PARI/Gp
if(test,...,...)
Scilab
if test then, ..., else, ..., end
Yacas
if(test)..else...
XCAS
if(test)...; else ...; si(test)...; sinon ...; si test alors ...; sinon ...; fsi
Test if...then...else
283
1 1 : Logiciel
Boucle for
Bc
for(i=1;i<=n;n=n+1){x;y;}
Maxima
for i:1 thru n do (x, y);
MuPAD
for i from 1 to n do x; y end_for;
Octave
for j=1:n x;y; endfor
PARI/Gp
for(j=1,n,action)
Scilab
for k=1..n, x,end
Yacas
ForEach(j,1..n)[x;y;]
XCAS
for (k:=1;k<=n;k++)x;y; pour(k:=1;k<=n;k++)x;y; pour n de 1 jusque n pas 1 faire x; y; fpour
Boucle for
Logiciel
Afficher texte et résultat
Maxima
print("sin(",0, ") =", sin(0))$
MuPAD
print(Unquoted, "sin(".0.")" = sin(0)):
PARI/Gp
print("sin(",0,")=",sin(0))
Yacas
Echo("sin(",0,")=",MathSin(0));
XCAS
print("sin("+0+")="+sin(0))
Comment afficher un résultat avec du texte ?
/ ' %'
21/3
Logiciel
e
π
i
+∞
Maxima
%e
%pi
%i
inf
sqrt(2)
2ˆ(1/3)
MuPAD
E
PI
I
infinity
sqrt(2)
2ˆ(1/3)
Octave
e
pi
i
sqrt(2)
2ˆ(1/3)
PARI/Gp
exp(1)
Pi
I
sqrt(2)
2ˆ(1/3)
Scilab
%e
%pi
%i
sqrt(2)
2ˆ(1/3)
Yacas
Exp(1)
Pi, Pi()
I
Infinity
Sqrt(2), MathSqrt(2)
2ˆ(1/3)
XCAS
e
Pi,pi,PI
i
infinity
sqrt(2)
2ˆ(1/3)
284
2
" !" 5
Les principales constantes mathématiques
Logiciel
ln
Arctan
n!
Bc
l(x)
a(x)
Maxima
log(x)
atan(x)
n!
MuPAD
ln(x)
atan(x)
n!
Octave
log(x)
atan(x)
prod(1:n)
PARI/Gp
log(x)
atan(x)
n!
Scilab
log(x)
atan(x)
factorial(n)
Yacas
Ln(x)
ArcTan(x)
n!
Les fonctions existantes
Logiciel
n mod m
Maxima
mod(n, m)
MuPAD
n mod m
Octave
mod(n,m)
PARI/Gp
n%m, Mod(n,m)
Scilab
modulo(n,m), pmodulo(n,m)
Yacas
Mod(n,m)
XCAS
n mod m, m%n
Calcul modulaire
Logiciel
Partie réelle
Forme algébrique d’un complexe
Maxima
realpart(f(z))
rectform(f(z))
MuPAD
Re(f(z))
rectform(f(z))
Octave
real(z)
PARI/Gp Scilab
real(z)
Yacas
Re(z)
XCAS
Re(z)
evalc(z)
Calcul avec les complexes
285
1 1 : Logiciel
Somme :
n '
f (i )
i=1
Maxima
sum(f(i),i,1,n) ,simpsum
MuPAD
sum(f(i), i = 1..n)
Octave PARI/Gp
sum(k=1,n,f(k))
Scilab Yacas
Sum(i,1,n,f(i))
XCAS
sum(f(k),k,1,n), sum(f(k),k=1..n)
Calcul de sommes
Logiciel
Limites : lim f (x)
Développements limités et asymptotiques
Maxima
limit(f(x), x, 0, minus)
taylor(f(x), x, 0, 3)
MuPAD
limit(f(x), x = 0, Left)
series(f(x), x = 0, 4)
x→0−
Octave PARI/Gp
f(x)
Scilab Yacas
Limit(x,0,Left) f(x)
Taylor(x,0,4) f(x)
XCAS
limit(f(x),x=0,-1)
series(f(x), x = 0, 4)
Calcul de limites
Logiciel
Calcul différentiel :
d 3 f (x, y) d x3
1 Intégration :
f (x) d x 0
Maxima
diff(f(x, y), x, 3)
integrate(f(x), x, 0, 1)
MuPAD
diff(f(x, y), x$3)
int(f(x), x = 0..1) quad("f",0,pi/2)
Octave PARI/Gp
deriv(f(x),x) intg(0,1,f)
Scilab Yacas
D(x,3) f(x,y)
Integrate(x,0,1) f(x)
XCAS
diff(f(x, y), x$3)
int(f(x), x = 0..1)
Calcul différentiel et intégral
286
" !" 5
Logiciel
Graphe 2D
Maxima
plot(x, x, 0, 1)$
MuPAD
plotfunc(x, acsch(x), x = 0..1):
plot(acsch(x), x, 0, 1)$
Octave PARI/Gp Scilab
fplot2d(x,f)
Yacas
Plot2D(x,ArcCos(x),0:1)
XCAS
plot([x,acosh(x)],x=1..2,color=[green,red],legende=["x","Argch"])
Graphe 2D
Logiciel
Graphe 3D
Maxima
plot3d(abs(x*y), x, 0, 1, y, 0, 1)$
MuPAD
plotfunc(abs(x*y), x = 0..1, y = 0..1):
Octave PARI/Gp Scilab
fplot3d(x,y,f)
Yacas
Plot3DS(Abs(x*y), 0:1,0:1)
XCAS
plot3d(abs(x*y), x = 0..1, y = 0..1)
Graphe 3D
287
Bibliographie
A BDELJAOUAD , Mahdi: Éléments de Géométrie du Plan . Tunis: Association Tunisienne des Sciences Mathématiques, 2000 A MYOTTE , Luc: Introduction au calcul avancé et à ses applications en sciences . Québec: ERPI, 2004 A PPEL , Walter: Mathématiques pour la physique et les physiciens. Paris: H&K, 2005 B ADRIKIAN , Josèphe: Mathématiques pour téléinformatique : codes correcteurs. Paris: Ellipses, 2002 B EL ABAS , Karim: Site officiel de PARI/GP . 〈URL: http://pari.math.u-bordeaux.fr/〉 B ELLOC , J.C./T HUILLIER , P.: Mathématiques analyse 3 . Paris: Dunod, 2004 B RUGÈRE , Thierry/M OLL ARD , Alain: Mathématiques à l’usage des informaticiens. Paris: Ellipses, 2003 C ONNAN , Guillaume/R OUQUÈS , Jean-Philippe: Le simulateur de khôlles de maths . Paris: Ellipses, 2002 D AL ANG , Robert C./C HAABOUNI , Amel: Algèbre linéaire . Lausanne: Presses polytechniques et universitaires romandes, 2001, 127–137 INRIA : Site officiel de Scilab . 〈URL: http://www.scilab.fr〉 I VALDI , Philippe: ressources Asymptote . 〈URL: http://piprim.tuxfamily.org/ asymptote/travaux/index.html〉 L E F UR , Denis: ressources Gnuplot . 〈URL: http://mathsp.tuxfamily.org/spip.php? rubrique39〉 M ARLE , Charles-Michel/P ILIBOSSIAN , Philippe: Méthodes numériques itératives . Paris: Ellipses, 2006, 168–185 M ONGE , M./AUDOIN -É GOROFF , M.C./L MAIRE -B ODY, F.: Mathématiques Terminales C et E . Paris: Belin, 1974 M URRAY , J. D.: Mathematical biology . Berlin: Springer, 1993, 372–380 PARISSE , Bernard: Site officiel de XCAS . 〈URL: http://www-fourier.ujf-grenoble.fr/ ~parisse/irem.html〉 R OUQUÈS , Jean-Philippe/D OMINGUEZ , Sophie: Leçons particulières - Cours de Maths . Paris: Ellipses, 2002, 316–328 S ORTAIS , Yvonne/S ORTAIS , René: La géométrie du triangle . Paris: Hermann, 1987, 16–21
1 B T ENENBAUM , Gérald/M ENDÈS F RANCE , Michel: Les nombres premiers . Paris: PUF, 1997 T HÉBAULT , Victor: Sur le tranchet d’Archimède . Bulletin de la S.M.F. Tome 72 1944, 68–75 W ESTER , Michael: Computer Algebra Systems: A Practical Guide . Chichester: John Wiley & Sons, 1999
290
Index général
ABBA, 83 Abscisse, 180 Affixes, 181, 197 Aire, 69, 70 Algèbre de Boole, 185 Alignement de points, 189 Amplitude, 105 Analyse en composantes principales, 106 Animation, 103 Approximation, 165 Approximation affine, ix, 163 Approximation numérique, 55 Arrêter une boucle, 103 ASCII, 35, 87 assume ou element ?, 72 Asymptote(programme), 26 awk(programme), 14 Axiome, 185 Baccalauréat, 120 Base, 85 Base 2, 248 Base canonique, 158 Base, changement de, vi, 48 Bc(programme), 3, 7, 8, 13, 23, 24, 45, 46, 48, 67, 281–285 Bessel-Parseval, 228 Boîte à moustache, 100, 102 BSD, 7 C++(programme), 26, 31, 32 C-shell(programme), 14
Calcul formel, 183 Calcul matriciel, 75, 270 Calcul modulaire, 247 Caml(programme), 260
Centiles, 106 Cercle, 197 Cercle médiateur, 195 Cercles tangents, 194 Chaînes de Markov, vii Changement de variable, viii, 144 Chaînes de Markov, 83 Chiffrement de Hill, 86 Chiffres significatifs, 56 Classes cyclotomiques, 255 Code de Hamming, 247 Codes correcteurs, 247 Collège, 69 Commande externe, 16 Concaténation, 38 Condition d’alignement, 190 Cône, 221 Congruences, vi, 49 Conique, 180 Coniques, 205 Contraposée, 186 Convergence d’une suite, 174 Coordonnées barycentriques, x Coordonnées barycentriques, 189 Copier-coller, 14 Corps fini, 247, 255 Courbe de niveau, 133 Courbe paramétrée, 197 Courbe représentative, 71, 164 Courbure, 118 Courbure de Gauss, 126 courbures(variable), 126 Cube, 94 CygWin(programme), 7 Cylindre, 270, 277
1 Date, 30 Dé, 99 Décodage, 40 Décomposition en éléments simples, 140 Démonstration, 180 Dérivée, 113 Dérivées partielles, 133, 135 Dérivées partielles, 125, 269 Dessins, 26 Déterminant, 77, 87, 190 Développement limité, 116, 153 Diagramme de bifurcation, 203 Différentielle, 116 Dimension, 249, 273 Dimension d’une matrice, 75 Directrice, x, 180, 214 Divergence, 270 Division euclidienne, 88 Droite, 180, 264 Écart-type, 105 Échantillon, 105 Éditer une commande, 13 Éditeur de programme, 31 Éditeur de texte, 3, 16 Effet papillon, 203 Égalité-définition, 67 Ellipse, 211 Emacs(programme), 14, 16, 27–29, 274 Enlever une colonne, 250 Ensemble, 58 Ensembles de nombres, 58 Entrées-sorties standards, 30 Environnement, 17, 19 Épreuve experimentale, 173 Équation aux dérivées partielles, 269 Équation de courbe, 264 Équation de droite, 92, 216 Équation de plan, 91 Équation différentielle ordinaire, 169, 273 Équation implicite, 214, 260 Équations différentielles ordinaires, 157 Équations dépendant de paramètres, 58 Estimation d’erreur, ix, 165 Étude métrique, viii Étude métrique, 125
292
Euler-Mac Laurin, 150 Exponentielle matricielle, 160 Expression, 115, 261 Extremum, 133 Extremum relatif, 136 Fabrication de sons, xi, 238 Faux, 185 Fenêtre 3D, 93 Fichier eps, 21 Fichiers spéciaux, 30 Figure, 20 Fink(programme), 7 Flottants, 58 Fonction, 115 Fonction définie par morceaux, 230 Fonction dérivée, 115, 180 Fonction et expression, 69 Fonction exponentielle, 163 Format de l’entrée, 14, 15 Format double, 57 Format enjolivé, 14, 15 Forme algébrique, 197 Forme exacte, 55 Forme quadratique, 126, 208, 210 Foyer, x, 180, 214 Fraction rationnelle, 62, 140 Fréquence, 105, 111 Galois, 247, 255 Gauss-Jordan, vii, 80 Gaussienne, 108 Générateur aléatoire, viii Générateur aléatoire, 105 Géométrie dynamique, 173 giac(programme), 16, 26, 28 GnuPlot(programme), 3, 7, 8, 13, 20, 21, 23, 24, 26, 27, 30, 45, 47, 96, 281 Gp(programme), 3, 7, 8, 13, 15, 45, 49, 53, 61, 64, 67, 113, 116, 153, 154 GPL, 3 Gradient, 116, 133 Groupe de Lie, 157 Groupe spécial orthogonal, 157 Hauteur de casse, 14
1 Heure, 30 Histogramme, 102, 106–108 Hyperbole, 215, 222 Image d’une matrice, 78 Implication, 187 Incrémenter, 32 Index des commandes, 9 Intégration par parties, viii Interpréteur de commande, 29 Intersection, 70, 121, 177, 216, 218, 219, 221 Intégrale, 139 Intégrales de Wallis, 147 Intégration par parties, 144 Inversion, 196 Involution, 186 Isocèle, 95 Kile(programme), 16
Laplacien, 269, 276, 277 LATEX(programme), 15–18, 20–23, 26 Lebesgue, 225 Lemme de Riemann-Lebesgue, 227 licence, 3 Ligne brisée, ix Ligne brisée, 163 Ligne de commande, 14 Lignes de niveaux, 96 Limite d’une suite, 174 Linux, 7 Logiciels abordés, v Logiciels abordés, 2 Logiciels libres, 2 Logique, 185 Loi de Morgan, 185 Loi de répartition, 108 Lycée, 69 MacOSX, 7 Manuel d’aide, 10 MAPLE(programme), 31 Matrice, 235, 241, 249, 254 Matrice antisymétrique, 157 Matrice compagne, 61 Matrice d’endomorphisme, 78 Matrice de passage, 209
Matrice extraite, 241 Matrice hessienne, 116, 136 Matrice inverse, vii, 77, 79 Matrice transposée, 87 Maxima(programme), 3, 7, 8, 13, 14, 26, 28, 45, 49, 61, 62, 67, 75, 113, 114, 139–141, 143, 153, 154, 157, 166, 169, 170, 281–287 Médiane, 103, 105 Médiatrice, 218 Mesure de Lebesgue, 107 MetaPOST(programme), 22, 26 Méthode d’Euler, ix Méthode d’Euler, 162, 163 Méthode de Newton, 56 Méthode de Steffenson, 57 Méthode des rectangles, ix Méthode des rectangles, 148 Mode graphique, 3 Mode texte, 3 Mot-clé, 8 Moyenne, 100, 102 Moyenne arithmétique, 105 Moyenne géométrique, 105 Moyenne harmonique, 105 Multiplicateur de Lagrange, viii, 132 MuPAD(programme), 3, 7, 26, 28, 31, 55, 58, 59, 139, 143, 146, 157, 167, 281–287 Nappe paramétrée, 119 Négation, 186 Nombre dérivé, 115 Nombres p-adiques, 53, 64 Nombres premiers, 50 Nombres pseudo-premiers, 51 Non-contradiction, 185, 186 Normale, 108 Norme euclidienne, 75 Norme linéaire, 75 Norme spectrale, 75 Notation scientifique, 13 Noyau d’une matrice, 78 Nuage de points, 105 Octave(programme), 3, 7, 8, 13, 45, 49, 67,
74, 75, 77, 157, 161, 281–287
293
1 Opérande, 58 Opérations élémentaires sur les lignes d’une matrice, 81 Orbite, 158 Ordonnée, 180 Ordonnée à l’origine, 91, 105 Palette des couleurs, 271 Papier-crayon, 140 Parabole, 206, 218 Parallèle, 70, 219 Paramètre, 70 PARI/Gp(programme), 26, 51, 52, 281–287 Partie exponentielle, 13 Pente, 91, 105 Perl(programme), 14 Perpendiculaire, 70, 216, 218, 219 Phénomène de Gibbs, 233 Plan, 221 Point, 69 Point fixe attractif, 202 Point fixe répulsif, 202 Points critiques, 136 Polices, 26 Polygone, xi, 259, 260, 262 Polynôme de Taylor, ix Polynôme, 61, 253, 260 Polynôme caractéristique, 78, 85 Polynôme de Taylor, 155 Polynôme dérivé, 61 Polynôme irréductible, 255 Polynôme minimal, 255 Polynôme quotient, 253 PPCM, 255 Primitive, 139 Procédure, ix Procédure, 164 Procédure récursive, 33, 39 Produit scalaire, 75, 116, 181, 217 Produit tensoriel, 75 Projecteur, vii, 78 Projection, 214 Propriétaire, 3 Précision, 45 Précision d’un calcul, 56 Prédicat, 185
294
Pseudosphère, 127 PStricks(programme), 26 Puissance d’un point par rapport à un cercle, 193 Puissance de matrice, vii, 79 Quantiles, 106 Quartiles, 106 Racine d’un polynôme, 141 Racines, 61 Rajouter une ligne, 250 Rang d’une matrice, 75, 209 Rectangle, 70 Récurrence, 178 Récursion, 51 Réduction d’endomorphisme, vii Réduction d’endomorphisme, 76 réel, 55 Répartition, 105, 107, 108 Représentation paramétrique, 197, 210 Résolution de systèmes non-linéaires, 189 Rotationnel, 116 RSA, 40 Scilab(programme), 3, 7, 8, 13–15, 30, 31,
41, 45, 49, 61, 62, 67, 72–75, 77, 91, 98, 99, 105, 106, 109, 113, 114, 116, 125, 139, 142, 150, 157, 235, 238, 239, 241, 269, 270, 281–287 Sections planes de surfaces, 220 sed(programme), 14 Séries de Fourier, xi Séries entières, 153 Session 2D, 92 Shell(programme), 8, 16, 26, 28, 30, 271 Simulation d’expérience aléatoire, viii Simulation d’expérience aléatoire, 99 Solutions d’une équation, 55 Somme, 249 Souris, 70 Sous-espace affine, 105 Sous-espace propre, 85 Sous-espace vectoriel engendré, 86 ssh(programme), 3 Style de figure, 22
1 Subdivision, ix, 162, 163 Suites récurrentes, 201 Surface, 96 Syldavie, 203 Symétrie orthogonale, 92 Syntaxe, 2, 37 Syracuse, suite de, 37 Système d’équations linéaires, vii Système d’équations linéaires, 76 Système linéaire, 59 Tableaux, 241 Tangente, 180, 212, 215 Tant que, 164 Tautologie, 185 Terminale, 163 Test booléen, 216 Test d’arrêt, 33, 39 TeXmacs(programme), 26, 27 TeXmaker(programme), 16 Théorème de Ménélaüs, x Théorème de Ménélaüs, 190 Théorème de Pappus, 195 Théorème des nombres premiers, 50 Tiers exclu, 185, 186 Tikz(programme), 26 Tore, xii, 270, 276 Torsion, 118 Tortue XCAS, 37 Trace, 270 Tractrice, 127 Transformée de Laplace, 169 Triangle rectangle, 69
Trier, 250 Tubage de processus, 29 Turing, Alan, 269 Valeur moyenne, 227 Valeur propre, 85 Variables complexes, 55 Variance, 105 Variété, 259 Vecteur, 181 Vecteur colonne, 75 Vecteur ligne, 75 Vecteur unitaire, 86 Vecteurs propres, 76 Vrai, 185 Windows Microsoft(programme), 16 XCAS(programme), xiii, 3, 7–9, 13, 15–18, 20,
26, 28, 31, 34–36, 39, 45, 49, 51–53, 55–57, 61, 63, 64, 67–69, 75, 81, 83, 88, 91, 95, 99, 113–115, 136, 139, 143, 145, 146, 148–150, 153, 157, 165, 166, 169, 170, 173, 176, 179–182, 184, 189, 191, 192, 194, 196, 197, 199, 205, 210, 216, 217, 222, 225, 227, 247, 249, 257, 259, 260, 281–287 Yacas(programme), 3, 7, 8, 13, 15, 26, 28, 45,
49, 61, 65, 67, 73, 113, 116, 139, 153, 185, 187, 281–287 Zräjdz, 200
295
Index des commandes
Bc
quit, 21, 22 replot, 24 set, 21, 22, 24, 96–98 sin, 21, 22 size, 24, 97 splot, 21, 22, 98 sqrt, 21, 22 surface, 96 term, 24 terminal, 21, 22 textcolor, 24 title, 24 using, 24 view, 97 with, 98 xlabel, 24, 97 xrange, 24, 97 xtics, 97 ylabel, 24, 97 yrange, 24, 97 ytics, 97 zlabel, 97 ztics, 97
a, 45 auto, 24 define, 24, 72 for, 24 ibase, 48, 48, 49 l, 45, 72 obase, 48, 49 print, 24 quit, 24, 49 return, 72 scale, 24, 45, 45 temp, 24
GnuPlot border, 24 clabel, 96 cntrparam, 96 color, 21, 22, 24 contour, 96 eps, 21, 24 exit, 24 exp, 24 graph, 24 hidden3d, 21, 22 isosamples, 21, 21, 22, 97 label, 24, 98 left, 24, 98 linetype, 24 nopoint, 24 norotate, 24 output, 21, 22 plot, 24 postscript, 21, 24 print, 47, 48
Gp \p, 46 atan, 46 cos, 153 deriv, 64, 116 exp, 116, 153 log, 67 Mod, 49 Pi, 46, 153 polroots, 64 sqrt, 53
1 LATEX
\VerbatimEnvironment, 17 \includegraphics, 21 fancyvrb, 16 VerbatimOut, 16
Maxima :=, 67 ^^, 78 ASINH, 140 bfloat, 46, 46, 68 charpoly, 78, 78 cos, 154 cosh, 169 determinant, 77 diff, 62, 114, 114, 166, 169 DISPLAY2D:FALSE, 14 DISPLAY2D:FALSE;, 14 DISPLAY2D:TRUE, 14 eigenvalues, 78, 78 exp, 114, 154, 169 FALSE, 49 float, 68, 154 fpprec, 46, 46 ilt, 169, 170 integrate, 139–141, 170 invert, 77 laplace, 169, 170 laplace(f(x),x,p), 169 log, 67, 140, 142 matrix, 77, 77 mod, 49 MODULUS, 49 ode2, 166 partfrac, 140, 141 plot2d, 154 positive, 141 ratsubst, 154 realpart, 141 rhs, 140 romberg, 141 sin, 139, 142, 170 solve, 62, 78, 140 sqrt, 140 tan, 140 taylor, 154
298
MuPAD begin, 37–40 DOM_SET, 58 else, 39 end, 38 for, 38, 40 from, 38, 40 if, 39 in, 59 intersect, 39, 59 intlib::byparts, 147 minus, 39 proc, 37–40 step, 38, 40 substring, 40 then, 39 to, 38, 40 union, 39 while, 39
Octave daspk, 161 endfunction, 74 eye, 77 function, 74 inv, 77 log, 74 lsode, 161 pinv, 77 poly, 77, 77 rand, 77 rank, 77 roots, 77 schur, 77 size, 77
Scilab *, 73 .*, 73 .*., 75 %io(1), 30 %io(2), 30 abs, 273 atanh, 127 champ, 273–275 companion, 61
1 cos, 117, 157, 161 deff, 119 derivat, 61 derivative, 113, 116–118, 120 det, 62, 126, 127 disp, 41, 246 else, 41, 236–239, 242 end, 41, 110, 111, 113, 123, 128, 159,
235–240, 242–246 endfunction, 41, 72, 73, 113, 116–123,
126–128, 150, 157, 160, 235–245, 273, 276, 277 evstr, 242–245 exec, 41 execstr, 245 exp, 73, 109, 113, 239 expm, 73, 159, 160 eye, 62, 76, 273, 276, 277 floor, 242 for, 41, 110, 111, 113, 123, 128, 159, 235–238, 240, 242–245 format, 150 fplot2d, 119 fplot3d, 120, 120, 121, 121, 122, 123, 124 fplot3d1, 120, 121, 123 freq, 111 fsolve, 123 function, 41, 72, 73, 113, 116–123, 125–128, 150, 157, 160, 235–245, 273, 276, 277 geomean, 105 graycolormap, 271, 272 gsort, 107 harmean, 105 hist3d, 111 histplot, 108 if, 41, 41, 236–239, 242–244, 246 intg, 142, 150 inv, 76 kernel, 76 linsolve, 76 list, 158, 159 list(), 159 log, 72, 73, 239 ls, 30
matrix, 111 max, 244 mean, 105 median, 105 min, 237, 242 modulo, 49, 236, 237 nfreq, 106, 109 norm, 75, 76, 116–118, 126, 159, 161 ode, 157, 158, 160, 274, 275 ones, 241, 273 param3d, 117, 123, 124, 158 param3d1, 158, 159 perctl, 106, 107 pinv, 126 plot, 73, 105, 107, 109, 113, 157, 160 plot3d1, 271–273 plot3d3, 121, 121, 123 pmodulo, 49, 235, 236, 242 poly, 14, 61, 76 quart, 106 rand, 76, 105, 106, 108, 157, 274 rank, 75 read, 270 reglin, 91, 105 roots, 61, 76 rot(g,x), 117 savewave, 239 schur, 76 sci2exp, 14 sin, 14, 117, 238 size, 75, 128, 235–238, 273, 274, 276,
277 sort, 106 spec, 62, 76, 126 sqrt, 109, 119, 126, 127, 150 stdev, 105 strange, 106 string, 30, 41, 238, 240 sum, 111, 236, 242, 244 tabul, 106, 109, 109, 110, 111 tangent, 120, 125, 126 tanh, 239 then, 41, 236–239, 242–244, 246 trace, 127 unix_g, 30 unix_w, 30
299
1 variance, 105 while, 246 write, 30, 238, 274, 275 xbasc, 157, 158, 160 xinit, 106–108, 111, 120, 121, 123, 128,
158, 159, 272 xset, 271, 272 zeros, 76, 110, 127, 128, 236, 241, 243,
273, 276, 277
Shell -l, 67 bc -l, 72 info, 8 lynx, 8 man, 8 read, 30 xdvi, 8
XCAS :=, 250 =<, 250 “chaine”, 35 abs, 56, 227 abscisse, 180, 180, 190, 195, 196, 216,
216, 217, 218 affichage, 95, 148, 175, 176 affixe, 181, 197 aire, 70, 95 alors, 36, 174, 190 and, 101, 179, 180, 229 angle, 93 animation, 103, 103 ans, 16, 115, 178 apply, 87–89 approx, 56 asc, 35, 36, 87, 87 assume, 55, 72, 72, 94, 179, 180, 211, 213, 226, 231 atan, 46 augment, 80, 80, 250, 252 avance, 37 barycentre, 194 begin, 16 bissectrice, 219 bleu, 71, 101, 102, 104, 148, 155, 156, 162, 175, 178, 192, 195, 212–215,
300
219, 221 blockmatrix, 250, 250, 252 blue, 228, 230, 232 break, 103 cat, 16, 35 cercle, 192, 194–197 char, 35, 35, 36, 87, 87 charpoly, 85, 85 Cmplx_var, 55, 56 col, 85, 85, 209, 209 color, 134, 155, 156, 222, 228, 230, 232 Complex, 56 concat, 34, 35, 209, 230, 248, 251, 251,
252 cone, 221, 222 conique, 210, 215, 217 contourplot, 134, 135 convert, 154, 155, 248, 248 coordonnees, 95 cos, 34, 145, 146, 148, 154, 155, 217, 227,
231, 232, 264 cosh, 170 couleur, 52, 70, 71, 93, 95, 101, 102, 104,
148, 162, 175, 178, 192, 194, 195, 210, 212–216, 218, 219, 221, 222, 228, 228, 230 count_eq, 100 courbe_parametrique, 197 cyan, 52, 93, 134, 148, 212, 213, 221, 222 degree, 254 delcols, 250, 252 derive, 115 desolve, 20, 161, 162 det, 79, 87, 137, 190–192, 209 diff, 63, 69, 69, 114, 114, 115, 133, 136, 136, 137, 145, 170, 211 DIGITS, 46, 57 Digits, 46, 46, 56, 56, 150 droite, 70, 72, 92, 93, 104, 180, 180, 181, 196, 197, 212–214, 216–219, 264, 264 dsolve, 162 e, 215 egv, 85, 85 eigenvals, 85, 85 eigenvalues, 209
1 eigenvectors, 209 element, 70, 70, 72, 72, 93, 95, 148, 148,
155, 162, 182, 192, 194, 201, 213, 213, 214–216, 216, 218, 221, 222 else, 103, 104, 196, 214, 250–255, 264 end, 16 equation, 93, 196, 216, 216, 221, 222, 264, 264 evalb, 216, 216, 218 evalc, 197 evalf, 46, 52, 53, 56, 57, 68, 100, 102, 104, 149–151, 166, 229, 265, 266 exact, 221, 221 exp, 57, 114, 115, 154, 166, 170, 264 expr, 35 faire, 36, 37, 164, 165, 175, 176 fclose, 16, 17 floor, 104, 155, 155, 156, 203, 251, 252, 264 fonction_derivee, 69, 115 fopen, 16, 17 for, 32, 35, 51, 100, 101, 103, 148, 151, 162, 196, 197, 203, 230, 231, 249–252, 254, 256, 261, 264 fpour, 36, 175, 176 fprint, 16, 17 fsi, 36, 174, 190 fsolve, 196 ftantque, 36, 37, 164, 165 funcplot, 134 GF, 256, 256, 257 grad, 133, 133 graphe, 71, 71, 175, 178 head, 102, 102 hessian, 136, 136, 137 histogram, 102, 102 i, 92, 190, 264 ibpdv, 144, 144, 145, 146 id, 68, 115 idn, 80, 85 if, 33, 51, 103, 104, 196, 214, 248–252, 254, 264 ilaplace, 170, 170 image, 79 implicitplot, 134, 135, 265 in, 16
infinity, 179, 227 int, 52, 53, 143–145, 147, 150, 229–231 integer, 226, 231 integrate, 143, 170 inter, 93, 193, 195, 196, 221, 222 inter_droite, 216 inter_unique, 70, 181 interactive_plotode, 162 intersect, 34 inv, 79, 83, 83, 88 inversion, 196, 197 iquo, 248 irem, 50, 50, 88, 88, 89, 248 is_prime, 51 isprime, 52 ispseudoprime, 52 jaune, 70, 101, 102, 218, 219 jusque, 36, 175, 176 k,T,j, 81 ker, 78, 85, 85 laplace, 144, 170 latex, 16, 17 lieu, 218 limit, 212, 227 limite, 9, 179 list2mat, 87, 87, 88, 251, 251, 252 ln, 52, 53, 55, 57, 68, 115, 144, 145, 149,
156 local, 32, 33, 35, 56, 100, 101, 103, 148,
151, 162, 175–177, 197, 200, 203, 214, 230–232, 248, 251, 252, 254–257, 261, 264 longueur, 93, 94, 193, 196 longueur2, 214, 214 magenta, 194, 212, 213, 216, 218, 219 map, 34 mat2list, 88, 89, 101 mean, 100, 100, 102, 104 median, 104 mediatrice, 218 member, 249, 249, 250, 252, 254, 255 mid, 35 milieu, 93 min, 251 minus, 34 mod, 103, 250, 252, 264
301
1 moustache, 100, 101, 102, 104 moyenne, 102, 104 mRow, 81 mRowAdd, 81, 81, 82 ncols, 80, 249, 251, 252 nDeriv, 115, 115 newton, 56 nextprime, 51, 51 nInt, 149 nops, 252, 254, 256 normalize, 209, 209 nrows, 82, 249, 251, 252 NULL, 34, 100, 101, 103, 148, 162, 164,
165, 175, 195–197, 249, 252, 254, 264 op, 248, 250, 252 ordonnee, 180, 180, 190, 195, 196, 216, 216, 217, 218 parallele, 70, 70, 219 parameq, 197, 197 partfrac, 143 pas, 36, 52, 104, 175, 176, 190, 251, 252, 254 perpendiculaire, 70, 72, 216, 216, 218, 219 pi, 53, 143, 216, 221, 222, 229, 264 plan, 221, 222 plot, 20, 52, 95, 148, 155, 156, 162, 230 plotarea, 148, 148 plotfunc, 134, 212, 213, 225, 228, 232 plotimplicit, 214, 214, 222, 222, 265, 266 plotode, 162 plotseq, 176, 176, 201, 201, 202 point, 52, 69–72, 92–95, 148, 162, 163, 164–166, 175, 176, 180, 181, 190, 192, 194–197, 203, 212–214, 216–218 point_milieu, 148 poly2symb, 85, 85 polygone, 70, 70, 148 polygone_ouvert, 164 pour, 36, 36, 92, 104, 175, 176, 200, 215, 229 preval, 144, 145, 147
302
print, 101, 102, 102, 104, 104, 250–252,
254 product, 257, 264 projection, 214 proot, 64 purge, 192, 196 q2a, 208, 208, 209 quo, 253, 254 rand, 99, 99, 100, 101 randpoly, 63 rank, 209 ranm, 100, 100, 101, 103 re, 55 read, 16, 17 rectangle_droit, 148 rectangle_gauche, 148 remove, 34 rempli, 70, 93, 95, 101, 102, 104, 134,
148, 221, 222 resoudre, 177, 177 return, 31–33, 35, 51, 57, 148, 151, 174,
177, 190, 196, 197, 203, 214, 215, 230, 231, 248, 251–255, 261, 264 right, 216, 264, 264 romberg, 143 roots, 63 rotate, 254, 254, 255 rouge, 93, 148, 162, 175, 176, 194, 214, 216, 218, 219, 221, 222 rowspace, 86, 86 scalar_product, 181, 217 segment, 93, 95, 216, 219 select, 34 seq, 34, 34, 52, 53, 103, 147, 166, 166, 200, 201, 261 set, 33, 34 si, 36, 36, 174, 190 simplifier, 70, 177, 178, 182, 182, 256 simplify, 16, 79, 93, 94, 137, 155, 191, 209–212, 216, 217, 229–232, 257 sin, 68, 69, 115, 143, 145–147, 170, 217, 231, 232 sinon, 36, 174, 190 size, 34, 35, 53, 248, 250, 252 solve, 55, 55, 56, 57, 79, 85, 93, 133, 136, 191, 192, 195, 201, 205, 221, 222
1 sort, 250, 250, 252 SortD, 102 sqrt, 56, 115, 143, 149, 150, 180, 181,
ystep, 134, 135, 265, 266 zip, 34 zstep, 265, 266
211, 213, 215–217 subs, 196 subsop, 34 subst, 137, 137, 144, 144, 206, 260, 261 sum, 83, 83, 149, 227, 229, 232, 249, 249,
250–252, 260, 261 symb2poly, 254, 254 symetrie, 92, 93, 196, 212, 213 tan, 143 tantque, 36, 36, 37, 164, 165 taylor, 154, 155 transpose, 87–89, 209, 254, 255 trapeze, 148 triangle, 93, 95 triangle_rectangle, 70 trigsin, 146, 147 unapply, 68, 68, 69, 115, 261, 261 union, 34 unitV, 86, 86 vecteur, 181, 182 vert, 95, 148, 212, 213, 216, 218, 219 while, 33, 56, 101, 151, 229, 248, 250,
252, 255 xstep, 134, 135, 221, 222, 265, 266
Yacas <=, 187 And, 185, 186, 186, 187 CanProve, 185, 185, 186, 187 Clear, 186 Cos, 153 Curl, 116 D, 65, 116 Exp, 116, 153 GetPrecision, 46 Integrate, 139 Ln, 73, 139 Mod, 49 N, 46, 47, 73, 139 Not, 185, 186, 186, 187 Or, 185, 186, 186 Pi, 47, 139 Precision, 47 PrettyForm, 15, 153 Psolve, 65 Sin, 139 Tan, 139 Taylor, 153
303
Guillaume Connan Stéphane Grognet
GUIDE DU CALCUL AVEC LES LOGICIELS LIBRES Le Guide du Calcul avec les logiciels libres vous propose de maîtriser les bases de plusieurs logiciels gratuits de calcul formel et numérique, et de géométrie dynamique : XCAS, Scilab, Bc, Gp, GnuPlot, Maxima, Octave, Yacas, et également MuPAD (non libre). Ces logiciels sont multiplateformes (Windows, Mac, Linux) et s’installent rapidement. La grande originalité de cet ouvrage est de détailler pas à pas l’utilisation de plusieurs logiciels pour plusieurs types de calcul. Il propose ainsi des applications en mathématiques, en physique et en sciences de l’ingénieur (par exemple : équations différentielles utilisées en physique, traitement du son...). Il vous aidera à savoir utiliser le bon logiciel au bon moment pour résoudre le bon problème. Cet ouvrage s’adresse à toute personne voulant utiliser le calcul en mathématiques à l’aide de logiciels libres : étudiants en mathématiques ou en informatique, professeurs de lycée souhaitant utiliser ces outils dans le cadre de leur cours et jusqu’aux candidats à l’agrégation désirant se préparer à l’épreuve de modélisation. Un index thématique et un index des commandes par logiciel aident le lecteur à trouver rapidement l’information qu’il recherche.
GUILLAUME CONNAN Professeur agrégé de mathématiques au Lycée Jean Perrin (Rezé). STÉPHANE GROGNET Maître de conférences à l’Université de Nantes, directeur de l’IREM des Pays de la Loire.
MATHÉMATIQUES
PHYSIQUE
CHIMIE
SCIENCES DE L’INGÉNIEUR
INFORMATIQUE
SCIENCES DE LA VIE
SCIENCES DE LA TERRE
ISBN 978-2-10-053934-5
www.dunod.com