Scilab

publicité
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 :-)
Téléchargement