Lycée A. Malraux Seconde 2 2009/2010 L’algorithmique et Scilab Quelques exemples Il est temps de faire le point sur l’utilisation de Scilab pour mettre en scène des algorithmes que nous avons écrits, découverts ou modifiés depuis la rentrée. Ce sera aussi l’occasion de se convaincre, si tel n’était pas encore le cas, que l’algorithmique est un outil essentiel pour la résolution de certains problèmes. La lecture de ce qui suit vous permettra de consolider1 vos connaissances du logiciel et la pratique de l’algorithmique. Nous allons passer en revue les différents algorithmes étudiés depuis la rentrée, pas nécessairement dans le même ordre. Bonne lecture :-) 1 Quelques rappels pas inutiles scilab-4.1.2 Copyright (c) 1989-2007 Consortium Scilab (INRIA, ENPC) - 1.1 Affectations Vous vous souvenez quel est l’effet sur l’affichage lorsque l’on met ; à la suite d’une affectation? > x=3 3 > y=4; > temp=x 3 > x=y 4 > y=temp 3 Qu’a-t-on fait avec les variables x et y? > ¡ [x ¢y] 4 3 1 je ne me fais pas d’illusion, dans ce qui suit, tout n’est pas acquis par tout le monde :-( Cela permet de rappeler ce que représente [x y] Voici un fichier source Scilab qui donne exemple permettant de manipuler les entrées, sorties et les affectations. Listing 1: Fichier identite.sce N=input ( ’N= ’ ) ; P=input ( ’P= ’ ) ; Q=2 *N* P ; N=N^2; P=P^2; N=N−Q+P ; disp ( ’ l e r é e l obtenu vaut ’ + s t r i n g (N) ) Un autre algorithme: Algorithme Variable Donner un nom à cet algorithme A : entier naturel compris entre 0 et 9 B : entier naturel compris entre 0 et 9 Début Pour i variant De FinPour 1 à n Faire Saisir A Saisir B Afficher 10 ∗ A + B X ← A Y ←B Y ←X + Y X ←Y − X Y ←Y − X A←X B ←Y Afficher 10 ∗ A + B Fin Celui-la, vous pouvez le programmer et l’exécuter pour valider les premières instructions algorithmiques. 1.2 Instruction conditionnelle IF THEN ELSE > x=rand() 0.2113249 > x=rand(); > if x<0.3 then disp('Gagné'), else disp('Perdu'),end Per d u Qui peut expliquer pourquoi Per d u est affiché? Nous avons découvert cette instruction lorsque l’on s’est posé la question suivante: Trois points A; B et C étant donnés, comment savoir si le triangle ABC est isocèle en A? Une solution en langage Scilab: Listing 2: Fichier isocele.sce / / s a i s i s s o n s l e s coordonnées des t r o i s points xA=input ( ’ abscisse de A = ’ ) yA=input ( ’ ordonnée de A = ’ ) xB=input ( ’ abscisse de B = ’ ) yB=input ( ’ ordonnée de B = ’ ) xC=input ( ’ abscisse de C = ’ ) yC=input ( ’ ordonnée de C = ’ ) / / calculons l e s c a r r é s des d i s t a n c e s AB AC e t BC ab=(xB−xA)^2+(yB−yA ) ^ 2 ; ac =(xC−xA)^2+(yC−yA ) ^ 2 ; bc=(xC−xB)^2+(yC−yB ) ^ 2 ; / / t e s t o n s s i ABC i s o c è l e en A i f ab+ac==bc then disp ( ’ ABC e s t i s o c è l e en A ’ ) el se disp ( ’ ABC pas i s o c è l e en A ’ ) , end 1.3 Boucle Un exemple: > for i=1:5 z(i)=i^2;end > z 1 4 9 16 25 Nous avons aussi été amenés à nous poser le problème suivant: 1. À l’aide de votre calculatrice, simuler le tirage de 100 réels choisis au hasard entre 1 et 6. Placer ces nombres dans la liste L 1 . 2. Recommencer l’expérience en plaçant les cent nouveaux nombres dans la liste L 2 . 3. Pour chaque valeur de i , calculer les cent sommes L 2 (i ) + L 1 (i ) que vous placerez dans la liste L 3 . 4. Calculer la fréquence d’apparition du 2 dans la liste L 3 . On peut envisager la question sous forme algorithmique de la manière suivante: Algorithme Variable Lancers de dés n : nombre entier L1 : liste de nombres réels L2 : liste de nombres réels L3 : liste de nombres réels f : nombre réel Début Saisir le nombre n { combien de lancers? } c← 0 { on initialise le compteur à 0 } Pour i variant De 1 à n Faire L1(i )← f l oor (6 ∗ r and ()) + 1 L2(i )← f l oor (6 ∗ r and ()) + 1 L3(i )← L1(i ) + L2(i ) Si L3(i ) = 2 c← c + 1 FinSi FinPour f← Fin Alors { on compte le nombre de 2 dans L3 } c n Afficher la fréquence d'apparition du 2 est f Une solution Listing 3: Fichier LancerDeDes.sce n=input ( ’n= ’ ) c =0; for i =1:n L1 ( i )= f l o o r ( 6 * rand ( ) ) + 1 ; L2 ( i )= f l o o r ( 6 * rand ( ) ) + 1 ; L3 ( i )=L1 ( i )+L2 ( i ) ; i f L3 ( i )==2 then c=c +1;end end , f =c/n ; disp ( ’ l a fréquence d ’ ’ apparition du 2 vaut f = ’ + s tr i n g ( f ) ) . Vous pourrez modifier l’algorithme, de telle sorte qu’il détermine la fréquence d’apparition de chaque somme possible. (2 à 12) Dans la foulée, nous nous sommes intéressés au calcul de la médiane d’une série statisitique, dans un premier temps rangée dans l’ordre croissant.2 1. Déclarer la liste de nombres x = [4 6 3 17 8], puis écrire x = g sor t (x, 0 g 0 , 0 i 0 ). Que fait la commande g sor t ? 2. À l’aide des commandes rand() et floor, écrire une liste de 100 nombres entiers compris entre 0 et 20. 2 nous verrons plus tard comment trier une liste de nombres réels. 3. Ranger la liste x dans l’ordre croissant. 4. Écrire et exécuter un algorithme qui calcule la moyenne x, puis la médiane M de la série statistique x. 5. Modifier l’algorithme pour qu’il calcule la moyenne, puis la médiane d’une série statistique x comprenant N nombres réels compris entre 0 et 50, générés aléatoirement, et calculés avec 20 chiffres significatifs, le nombre N ayant été saisi en entrée. Une solution aux différents problèmes posés écrit en langage Scilab3 . Listing 4: Fichier mediane.sce / / commande g s o r t x =[4 6 3 17 8] x=gsort ( x , ’ g ’ , ’ i ’ ) / / générons 100 nb e n t i e r s e n t r e 0 e t 20 e t t r i o n s la l i s t e for i =1:100 , x ( i )= f l o o r (21 * rand ( ) ) ; end x; disp ( ’ rangeons l a l i s t e dans l ’ ’ ordre c r o i s s a n t ’ ) , x=gsort ( x , ’ g ’ , ’ i ’ ) disp ( ’ l ’ ’ e f f e c i f t o t a l vaut 100 donc l a médiane e s t obtenue en f a i s a n t l a moyenne de l a donnée de rang 50 et 51 ’ ) M=( x (50)+ x ( 5 1 ) ) / 2 ; disp ( ’ l a médiane de c e t t e s é r i e de 100 nb e s t égale à ’ + s t r i n g (M) ) halt ( ’ presser l a touche ENTER pour relancer l e programme ’ ) / / reprenons l e problème : on s a i s i t tout d ’ abord N N=input ( ’ L ’ ’ e f f e c t i f t o t a l vaut N= ’ ); / / Générons N nombres r é e l s e n t r e 0 e t 50 avec 3 décimales format ( 2 5 ) for i =1:N y ( i )=50 * rand ( ) ; end / / rangeons la l i s t e y dans l ’ ordre c r o i s s a n t y=gsort ( y , ’ g ’ , ’ i ’ ) ; / / t e s t o n s la p a r i t é de N e t calculons la médiane M k=N/ 2 ; i f k== f l o o r ( k ) then M=( y ( k )+ y ( k + 1 ) ) / 2 ; e l s e M=y ( f l o o r ( k ) + 1 ) ; end disp ( ’ l a médiane de c e t t e s é r i e s t a t i s t i q u e vaut M= ’ + s t r i n g (M) ) 1.4 Instruction TANT QUE > j=1; > while j<5 f(j)=1/(j+1);j=j+1;end > f 0.5 0.3333333 0.25 0.2 Au passage, on rappelle comment obtenir plus de chiffres significatifs. > 1/3 0.3333333 > format(20) > 1/3 3 la commande halt permet de faire une pause dans l’exécution du programme, puis, en tapant sur ENTER de le relancer. 0.33333333333333331 > Nous avions débuté notre découverte de l’instruction conditionnelle TANT QUE avec ce programme qui est visible et exécutable suivant. Listing 5: Fichier placement.sce S=500; c =0; while S<2200 S=S * 1 . 0 2 ; c=c +1;end disp ( ’ l a somme obtenue vaut S= ’ + s t r i n g ( S ) ) disp ( ’ l e nombre d ’ ’ étapes vaut c= ’ + s t r i n g ( c ) ) Voici un autre algorithme: Algorithme Variable Que fait cet algorithme? N : un nombre entier supérieur ou égal à deux x : une liste de réels x 1 ; x 2 ; ...x N Début Saisir N Saisir x Afficher la liste x Pour i variant De 1 à N − 1 Faire j ←N TantQue i < j Faire Si x j < x j −1 Alors échanger x j et x j −1 dans la liste x on peut procéder pour permuter? } { vous vous souvenez comment FinSi FinTantQue FinPour Afficher la liste x Fin Nous nous étions posé la question de savoir ce que faisait cet algorithme. Il est programmé grâce à ce source : Listing 6: Fichier tri.sce / / on en tr e l e s éléments de la l i s t e L "à la main" , on verra plus tard comment procéder autrement . L=[55 66 12 2 52 47 15 98 122 6 84 2 6 ] ; / / c e t t e commande permet de déterminer l e nombre d ’ éléments de la l i s t e L N=length ( L ) ; L for i =1:N−1 j =N; while i < j i f L ( j ) <L ( j −1) then temp=L ( j ) ; L ( j )=L ( j −1);L ( j −1)=temp ; end , j =j −1;end , end L Alors! Que fait cet algorithme? 2 On va maintenant programmer l’algorithme du devoir 12. La lecture des paragraphes précédents vous permet d’aborder l’algorithme suivant plus sereinement. Algorithme Variable Énoncé a et b : deux nombres réels qui sont les bornes de l’intervalle f : la fonction étudiée n : nombre d’intervalles Début Saisir Saisir Saisir Saisir n f a b b−a pas← n d ← f (b) − f (a) x←a Pour Si i variant De 1 à N Faire f (x + pas) − f (x) et d ne sont pas de même signe Afficher "la fonction f n’est pas monotone" programme est terminé } { et on sort de la boucle, le FinSi x←x + pas FinPour Afficher "la fonction semble monotone" Fin Voici le programme Scilab avec les commentaires en bleu: Listing 7: Fichier monotone.sce n=input ( ’n= ’ ) / / on d é c l a r e $a$ $b$ e t $n$ a=input ( ’ a= ’ ) b=input ( ’b= ’ ) Alors function y= f ( x ) , y=x ** 3−x +1 , endfunction / / on d é c l a r e la fonction $f$ . Vous pourrez changer de fonction à volonté . / / e t v é r i f i e r l ’ e f f i c a c i t é du programme en traçant l e s courbes r e p r é s e n t a i v e s / / des f o n c t i o n s d é c l a r é e s sous GéoGébra . d= f (b)− f ( a ) ; / / on a f f e c t e aux v a r i a b l e s $d$ , $pas$ e t $x$ des valeurs pas =(b−a ) /n ; x=a ; c =0; / / on i n i t i a l i s e l e compteur $c$ à 0 for i =1:n / / on commence la boucle i f d * ( f ( x+pas)− f ( x )) >0 then x=x+pas ; c=c +1; el se disp ( ’ f pas monotone ’ ) , break , end , end / / on t e s t e s i l e s r é e l s $ f ( x+pas)− f ( x ) $ e t $d$ ont même sign e / / s i oui , on continue dans la boucle e t l e compteur augmente de 1 , / / sinon , on a f f i c h e que $f$ n ’ e s t pas monotone / / e t la commande break permet de s o r t i r de la boucle i f c==n then disp ( ’ f semble monotone ’ ) , end / / s i l e compteur vaut $n$ l e nb de subdivisions , / / a l o r s on a f f i c h e que $f$ semble monotone , mais pas sûr Vous n’avez plus qu’à tester tout cela, si vous avez installé au préalable le logiciel, bien évidemment :-)