corriges scilab - Hachette Education

publicité
Corrigés – SCILAB
Avertissement
1) Pour écrire un programme, on ouvre l'Editeur
(Applications, Editeur) et on y écrit le
programme. Les retraits gauches (indentations) se
font de façon automatique.
2) Pour exécuter le programme, on a plusieurs
possibilités :
- soit Exécuter, Charger dans Scilab ;
- soit on sélectionne la partie du programme qu'on
souhaite exécuter, on la copie, et on la colle dans
la Console.
Fonctions
10 3) On propose :
x=input("x = ? ");
if x<=10 then V=100*x;
else V=750+25*x;
end;
afficher(V,"le volume est :");
Il faut exécuter le programme un certain nombre de fois,
ce qui est un peu lourd en manipulations entre la Console
et l'Editeur. On peut alors penser à créer une fonction :
function V=volume(x)
if x<=10 then V=100*x;
else V=750+25*x;
end;
endfunction;
Il suffit de charger cette fonction dans la Console, puis de
l'appeler par l'instruction volume(5) par exemple (sans
mettre de point-virgule pour afficher le résultat).
Pour l'appeler plusieurs fois, dans la Console on utilise la
flèche du clavier ↑ pour remonter dans l'historique, et on
modifie l'argument de la fonction.
4) On teste plusieurs valeurs de x et on procède par
encadrements successifs pour trouver la valeur de x
associée à V = 625.
11 2b) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
S=100;
for i=1:10
S=S+100+2*i;
end;
afficher(S,"capital :");
3) On peut commencer par faire quelques essais en
calculant des images de la fonction capital, puis
procéder par encadrements successifs :
Page 1
On peut ensuite éventuellement introduire une boucle Tant
que :
S=100;
n=0;
while S<1999
n=n+1;
S=S+100+2*n;
end;
afficher(n,"nombre d années :");
13 4) b) On transcrit l'algorithme en langage Scilab :
x=-3; x0=-3; m=34;
while x<=3
x=x+0.1;
y=3*x^2-2*x+1;
if y<m then
x0=x;
m=y;
end;
end;
afficher(m,"le min paraît être :");
afficher(x0,"il est atteint en :");
15 2) On peut commencer par faire quelques essais en
calculant des images de la fonction population, puis
procéder par encadrements successifs :
function P=population(n)
P=5000;
for i=1:n
P=P*0.95;
end;
endfunction;
On peut ensuite éventuellement introduire une boucle Tant
que :
P=5000;
n=0;
while P>2500
n=n+1;
P=P*0.95;
end;
afficher(n,"nombre d années :");
16 2) b) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
n=input("nombre d années = ?");
C=1000;
for i=1:n
C=1.025*C;
end;
afficher(C,"le capital est :");
function S=capital(n)
S=100;
for i=1:n S=S+100+2*i;
end;
endfunction;
3) On utilise le programme précédent en testant plusieurs
valeurs de n, et en procédant par encadrements successifs.
Pour cela, on charge cette fonction dans la Console, et on
l'appelle par l'instruction capital(12) (sans pointvirgule pour afficher le résultat).
Pour l'appeler plusieurs fois, dans la Console on utilise la
flèche du clavier ↑ pour remonter dans l'historique, et on
modifie l'argument de la fonction.
function C=capital(n)
C=1000;
for i=1:n C=1.0125*C; end;
endfunction;
Comme on souhaite exécuter le programme un certain
nombre de fois, on peut penser à créer une fonction :
Corrigés – SCILAB
Page 2
Prolongement : on peut éventuellement écrire un
algorithme avant de le transcrire en langage Scilab :
4) On utilise le programme précédent en testant plusieurs
valeurs de D et en procédant par encadrements successifs.
C=1000;
n=0;
while C<2000
n=n+1;
C=1.025*C;
end;
afficher(n,"nombre d années :");
Comme on souhaite exécuter le programme un certain
nombre de fois, on peut penser à créer une fonction :
4) On utilise le programme de la question 2) b) en testant
plusieurs valeurs de n, et en procédant par encadrements
successifs.
Comme on souhaite exécuter le programme un certain
nombre de fois, on peut préférer utiliser la fonction
capital de la question 3).
Prolongement : on peut éventuellement écrire un
algorithme avant de le transcrire en langage Scilab :
C=1000;
n=0;
S=input("somme à atteindre = ?");
while C<S
n=n+1;
C=1.025*C;
end;
afficher(n,"nombre d années :");
18 6) On transcrit l'algorithme en langage Scilab :
p=input("précision = ?");
a=-1; b=0;
while b-a>p
m=(a+b)/2;
y=m^4-4*m-1;
if y>0 then a=m;
else b=m;
end;
end;
afficher(a,"la solution est entre");
afficher(b," et");
20 3) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
D=input("durée en min = ?");
if D<=120 then A=19.5; B=22;
else
A=19.5+0.45*(D-120);
B=22+0.37*(D-120);
end;
if D<=180 then C=29;
else C=29+0.37*(D-180);
end;
if A<=B & A<=C then
afficher(A,"forfait A pour le montant :");
end;
if B<=A & B<=C then
afficher(B,"forfait B pour le montant :");
end;
if C<=A & C<=B then
afficher(C,"forfait C pour le montant :");
end;
On a groupé ici les calculs des montants des forfaits A et B
pour raccourcir la taille du programme.
function forfait(D)
if D<=120 then A=19.5; B=22;
else
A=19.5+0.45*(D-120);
B=22+0.37*(D-120);
end;
if D<=180 then C=29;
else C=29+0.37*(D-180);
end;
if A<=B & A<=C then
afficher(A,"forfait A pour le montant :");
end;
if B<=A & B<=C then
afficher(B,"forfait B pour le montant :");
end;
if C<=A & C<=B then
afficher(C,"forfait C pour le montant :");
end;
endfunction;
On peut aussi penser à tracer les courbes représentatives
des fonctions associées aux différents forfaits. Pour cela,
on crée les fonctions forfaitA, forfaitB et
forfaitC, puis on trace leurs courbes représentatives sur
l'intervalle [0 ; 200] :
function A=forfaitA(D)
if D<=120 then A=19.5;
else A=19.5+0.45*(D-120);
end;
endfunction;
function B=forfaitB(D)
if D<=120 then B=22;
else B=22+0.37*(D-120);
end;
endfunction;
function C=forfaitC(D)
if D<=180 then C=29;
else C=29+0.37*(D-180);
end;
endfunction;
x=linspace(0,200,200);
plot(x,forfaitA,"r");//en rouge
plot(x,forfaitB,"b");//en bleu
plot(x,forfaitC,"g");//en vert
On obtient dans la fenêtre graphique :
Corrigés – SCILAB
Page 3
On peut aussi résoudre des inéquations en créant les
vecteurs uA, uB et uC contenant les valeurs des montants
des forfaits A, B et C pour des durées entières inférieures à
200 minutes. Par exemple :
for n=1:200 uA(n)=forfaitA(n); end;
for n=1:200 uB(n)=forfaitB(n); end;
for n=1:200 uC(n)=forfaitC(n); end;
find(uA<=uC)//ne
pas
mettre
de
virgule pour afficher le résultat.
On obtient dans la fenêtre graphique :
point-
On obtient ainsi l'affichage de toutes les durées entières
inférieures à 200 minutes pour lesquelles le forfait A est
plus avantageux que le forfait C.
21 2) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
n=input("nombre de SMS = ?");
A=20;
B=0.15*n;
C=12+0.05*n;
if A<=B & A<=C then
afficher(A,"forfait A pour le montant :");
end;
if B<=A & B<=C then
afficher(B,"forfait B pour le montant :");
end;
if C<=A & C<=B then
afficher(C,"forfait C pour le montant :");
end;
3) On utilise le programme précédent en testant plusieurs
valeurs de n et en procédant par encadrements successifs.
Comme on souhaite exécuter le programme un certain
nombre de fois, on peut penser à créer une fonction :
function forfait(n)
A=20;
B=0.15*n;
C=12+0.05*n;
if A<=B & A<=C then
afficher(A,"forfait A pour le montant :");
end;
if B<=A & B<=C then
afficher(B,"forfait B pour le montant :");
end;
if C<=A & C<=B then
afficher(C,"forfait C pour le montant :");
end;
endfunction;
On peut aussi penser à tracer les représentations
graphiques des "suites" forfaitA, forfaitB et
forfaitC associées aux différents forfaits, définies par :
forfaitA(n) est le montant du forfait A pour n SMS ;
forfaitB(n) est le montant du forfait B pour n SMS ;
forfaitC(n) est le montant du forfait C pour n SMS.
On trace leurs représentations graphiques sur l'intervalle
[1 ; 200] :
for n=1:200 forfaitA(n)=20; end;
for n=1:200 forfaitB(n)=0.15*n; end;
for n=1:200 forfaitC(n)=12+0.05*n; end;
plot(forfaitA,"r");//en rouge
plot(forfaitB,"b");//en bleu
plot(forfaitC,"g");//en vert
On peut aussi résoudre des inéquations. Par exemple :
find(forfaitB<=forfaitC)//ne pas mettre de
point-virgule pour afficher le résultat.
On obtient alors l'affichage de tous les nombres de SMS
inférieurs à 200 pour lesquels le forfait B est plus
avantageux que le forfait C.
22 2) b) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
popA=20000; popB=80000; n=0;
while popA<popB
n=n+1; a=popA; b=popB;
popA=a*0.9+b*0.2;
popB=a*0.1+b*0.8;
end;
afficher(n,"le nombre d années nécessaires
est :");
3) On modifie le programme précédent de façon à obtenir
les tailles des populations (popA et popB) des villes A et B
en fonction du nombre d'années écoulées (n). La démarche
peut être résumée par l'algorithme :
Variables :
n,i : entier ;
popA,popB,a,b : réels ;
Début
Entrer(n) ;
popA←20000 ; popB←80000 ;
Pour i allant de 1 à n faire
a←popA ; b←popB ;
popA← a×0,9+b×0,2 ;
popB← a×0,1+b×0,8 ;
FinPour ;
Afficher("la taille de la ville A est ",popA);
Afficher("la taille de la ville B est ",popB);
Fin.
Il se transcrit en langage Scilab par :
n=input("nombre d annes = ?");
popA=20000; popB=80000;
for i=1:n
a=popA; b=popB;
popA=a*0.9+b*0.2;
popB=a*0.1+b*0.8;
end;
afficher(popA,"taille de la ville A :");
afficher(popB,"taille de la ville B :");
Corrigés – SCILAB
On teste plusieurs valeurs pour répondre aux questions.
Comme on souhaite exécuter le programme un certain
nombre de fois, on peut penser à créer une fonction :
function population(n)
popA=20000; popB=80000;
for i=1:n
a=popA; b=popB;
popA=a*0.9+b*0.2;
popB=a*0.1+b*0.8;
end;
afficher(popA,"ville A :");
afficher(popB,"ville B :");
endfunction;
On peut aussi penser à tracer les représentations
graphiques des "suites" villeA et villeB associées aux
tailles des deux villes, définies par :
villeA(n) est la taille de la ville A l'année n-1 ;
villeB(n) est la taille de la ville B l'année n-1.
On trace leurs représentations graphiques sur l'intervalle
[1 ; 40] :
villeA(1)=20000;villeB(1)=80000;
for n=1:40
villeA(n+1)=villeA(n)*0.9+villeB(n)*0.2;
villeB(n+1)=villeA(n)*0.1+villeB(n)*0.8;
end;
plot(villeA,"+r");//+ rouge
plot(villeB,"*b");//* bleu
On obtient dans la fenêtre graphique :
Page 4
Comme on souhaite exécuter le programme un certain
nombre de fois, on peut penser à créer une fonction :
function benefice(M)
if M<800 then C=5000+12*M;
else C=5000+13.2*M;
end;
if M<900 then R=20*M;
else R=20*M-100;
end;
if R>=C then
afficher("l
entreprise
réalise
des
bénéfices");
else afficher("l entreprise ne réalise pas
de bénéfice");
end;
endfunction;
On peut aussi penser à tracer les courbes représentatives
des fonctions associées aux coûts et aux recettes.
Pour cela, on crée les fonctions couts et recettes,
puis on trace leurs courbes représentatives sur l'intervalle
[0 ; 1000] :
function C=couts(M)
if M<800 then C=5000+12*M;
else C=5000+13.2*M;
end;
endfunction;
function R=recettes(M)
if M<900 then R=20*M;
else R=20*M-100;
end;
endfunction;
x=linspace(0,1000,1000);
plot(x,couts,"r");//en rouge
plot(x,recettes,"g");//en vert
On obtient dans la fenêtre graphique :
23 3) b) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
M=input("masse en kg = ?");
if M<800 then C=5000+12*M;
else C=5000+13.2*M;
end;
if M<900 then R=20*M;
else R=20*M-100;
end;
if R>=C then
afficher("l
entreprise
réalise
des
bénéfices");
else afficher("l entreprise ne réalise pas de
bénéfice");
end;
On teste plusieurs valeurs de M et on procède par
encadrements successifs pour résoudre le problème.
Corrigés – SCILAB
Géométrie
Page 5
30 2) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
xA=input("xA = ?"); yA=input("yA = ?");
xB=input("xB = ?"); yB=input("yB = ?");
xC=input("xC = ?"); yC=input("yC = ?");
c=(xB-xA)^2+(yB-yA)^2;
b=(xC-xA)^2+(yC-yA)^2;
a=(xC-xB)^2+(yC-yB)^2;
if a==b & a==c then
afficher("ABC triangle équilatéral");
afficher(3*sqrt(a),"de périmètre :");
afficher(a*sqrt(3)/4,"d aire :");
else afficher("ABC non équilatéral");
end;
26 3) c) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
a=10;
n=input("n = ?");
for i=1:n
a=sqrt((a-2)^2+4);
end;
afficher(a^2,"l aire est :");
Comme on souhaite exécuter ce programme un certain
nombre de fois, on peut penser à créer une fonction :
function A=aire(n)
a=10;
for i=1:n
a=sqrt((a-2)^2+4);
end;
A=a^2;
endfunction;
Il suffit de charger cette fonction dans la Console, puis de
l'appeler par l'instruction aire(5) par exemple (sans
point-virgule pour afficher le résultat).
Pour l'appeler plusieurs fois, dans la Console on utilise la
flèche du clavier ↑ pour remonter dans l'historique, et on
modifie l'argument de la fonction.
4) On utilise le programme de la question précédente et on
teste à l'aide de quelques valeurs.
(attention aux arrondis qui peuvent éventuellement induire
en erreur les résultats).
31 2) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
xA=input("xA = ?"); yA=input("yA = ?");
xB=input("xB = ?"); yB=input("yB = ?");
xC=input("xC = ?"); yC=input("yC = ?");
xD=input("xD = ?"); yD=input("yD = ?");
xI=(xA+xC)/2; yI=(yA+yC)/2;
xJ=(xB+xD)/2; yJ=(yB+yD)/2;
if xI==xJ & yI==yJ then
afficher("ABCD parallélogramme");
else afficher("ABCD non parallélogramme");
end;
ou
28 5) On peut éventuellement écrire un algorithme pour
résumer la démarche du calcul de l'aire noircie totale à
chaque étape avant de le transcrire en langage Scilab :
n=input("n = ?");
N=1; a=8; A=16*sqrt(3);
for i=2:n
N=3*N;
a=a/2;
A=A+N*a^2*sqrt(3)/4;
end;
afficher(A,"l aire noircie totale vaut :");
Comme on souhaite exécuter ce programme un certain
nombre de fois, on peut penser à créer une fonction :
function A=aire(n)
N=1; a=8; A=16*sqrt(3);
for i=2:n
N=3*N;
a=a/2;
A=A+N*a^2*sqrt(3)/4;
end;
endfunction;
On peut ensuite éventuellement introduire une boucle Tant
que :
n=1; N=1; a=8; A=16*sqrt(3);
while A<0.9*64*sqrt(3)
n=n+1; N=3*N; a=a/2;
A=A+N*a^2*sqrt(3)/4;
end;
afficher(n,"le nombre d étapes est :");
xA=input("xA = ?"); yA=input("yA = ?");
xB=input("xB = ?"); yB=input("yB = ?");
xC=input("xC = ?"); yC=input("yC = ?");
xD=input("xD = ?"); yD=input("yD = ?");
a=(xB-xA)^2+(yB-yA)^2;
b=(xC-xB)^2+(yC-yB)^2;
c=(xD-xC)^2+(yD-yC)^2;
d=(xD-xA)^2+(yD-yA)^2;
if a==c & b==d then
afficher("ABCD parallélogramme");
else afficher("ABCD non parallélogramme");
end;
32 2) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
xA=input("xA = ?"); yA=input("yA = ?");
xB=input("xB = ?"); yB=input("yB = ?");
xC=input("xC = ?"); yC=input("yC = ?");
xD=input("xD = ?"); yD=input("yD = ?");
a=(xB-xA)^2+(yB-yA)^2;
b=(xC-xB)^2+(yC-yB)^2;
c=(xD-xC)^2+(yD-yC)^2;
d=(xD-xA)^2+(yD-yA)^2;
e=(xC-xA)^2+(yC-yA)^2;
if a==c & b==d & a==b & e==a+b then
afficher("ABCD est un carré");
afficher(4*sqrt(a),"de périmètre :");
afficher(a,"et d aire :");
else afficher("ABCD n est pas un carré");
end;
Corrigés – SCILAB
Page 6
33 2) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
37 2) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
xA=input("xA = ?"); yA=input("yA = ?");
xB=input("xB = ?"); yB=input("yB = ?");
xC=input("xC = ?"); yC=input("yC = ?");
xD=input("xD = ?"); yD=input("yD = ?");
a=(xB-xA)^2+(yB-yA)^2;
b=(xC-xB)^2+(yC-yB)^2;
c=(xD-xC)^2+(yD-yC)^2;
d=(xD-xA)^2+(yD-yA)^2;
e=(xC-xA)^2+(yC-yA)^2;
if a==c & b==d & a==b then
afficher("ABCD est un losange");
else afficher("ABCD n est pas un losange");
end;
if a==c & b==d & e==a+b then
afficher("ABCD est un rectangle");
else afficher("ABCD n est pas un rectangle");
end;
if a==c & b==d & a==b & e==a+b then
afficher("ABCD est un carré");
else afficher("ABCD n est pas un carré");
end;
xA=input("xA = ?"); yA=input("yA = ?");
xB=input("xB = ?"); yB=input("yB = ?");
xC=input("xC = ?"); yC=input("yC = ?");
if xA==xB & xA==xC then
afficher("les points sont alignés.");
else
if xA<>xB & xA<>xC then
if (xC-xA)*(yB-yA)==(xB-xA)*(yC-yA) then
afficher("les points sont alignés.");
else afficher("les points ne sont pas
alignés.");
end;
else afficher("les points ne sont pas
alignés");
end;
end;
35 2) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
xA=input("xA = ?"); yA=input("yA = ?");
xB=input("xB = ?"); yB=input("yB = ?");
if xA==xB then
afficher(xA,"l équation est x = ");
else
m=(yB-yA)/(xB-xA);
p=yA-m*xA;
afficher("l équation est y = mx + p");
afficher(m,"où m vaut :");
afficher(p,"et p vaut :");
end;
36 3) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
a=input("a = ?"); b=input("b = ?");
c=input("c = ?"); d=input("d = ?");
if a==c then
if b==d then
afficher("les droites sont confondues");
else afficher("les droites sont strictement
parallèles");
end;
else
x0=(d-b)/(a-c);
y0=a*x0+b;
afficher("les droites sont sécantes au point
de coordonnées (x0;y0)");
afficher(x0,"où x0 vaut");
afficher(y0,"et y0 vaut");
end;
38 2) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
a=input("a = ?"); b=input("b = ?");
c=input("c = ?"); d=input("d = ?");
e=input("e = ?"); f=input("f = ?");
if a*e-b*d<>0 then
afficher("le
système
admet
un
couple
solution unique (x;y)");
afficher((c*e-b*f)/(a*e-b*d),"où x vaut :");
afficher((a*f-d*c)/(a*e-b*d),"et y vaut :");
else
afficher("le système n admet pas de solution
unique");
end;
Complément : Scilab sait résoudre des systèmes linéaires.
Par exemple pour la question 3a) :
A=[2,3;3,-1];
B=[7;5];
A\B //A\ signifie multiplication à gauche
par A^(-1) (sans point-virgule à la fin de
la ligne pour afficher le résultat)
40 2) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
xu=input("xu = ?"); yu=input("yu = ?");
xv=input("xv = ?"); yv=input("yv = ?");
if xu*yv==xv*yu then
afficher("les vecteurs sont colinéaires");
afficher("on a v = k*u avec k égal à :");
if xu<>0 then disp(xv/xu);
else afficher(yv/yu);
end;
else afficher("les vecteurs ne sont pas
colinéaires");
end;
Corrigés – SCILAB
Page 7
41 2) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de la transcrire en langage
Scilab :
xA=input("xA = ?"); yA=input("yA = ?");
xB=input("xB = ?"); yB=input("yB = ?");
xC=input("xC = ?"); yC=input("yC = ?");
xD=input("xD = ?"); yD=input("yD = ?");
if (xB-xA)*(yD-yC)==(xD-xC)*(yB-yA) then
afficher("(AB) et (CD) sont parallèles");
else afficher("(AB) et (CD) ne sont pas
parallèles");
end;
42 2) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
xA=input("xA = ?"); yA=input("yA = ?");
xB=input("xB = ?"); yB=input("yB = ?");
xC=input("xC = ?"); yC=input("yC = ?");
xD=input("xD = ?"); yD=input("yD = ?");
if xB-xA==xC-xD & yB-yA==yC-yD then
afficher("ABCD parallélogramme");
else afficher("ABCD non parallélogramme");
end;
43 2) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
xA=input("xA = ?"); yA=input("yA = ?");
xB=input("xB = ?"); yB=input("yB = ?");
xC=input("xC = ?"); yC=input("yC = ?");
if (xB-xA)*(yC-yA)==(xC-xA)*(yB-yA) then
afficher("les points sont alignés");
else
afficher("les
points
ne
sont
alignés");
end;
pas
Statistiques et probabilités
Avertissement
Scilab dispose de fonctions adaptées à la simulation, entre
autres :
• rand() retourne de façon aléatoire un nombre décimal
dans l'intervalle [0 ; 1[ ;
• tirage_entiers(N,a,b) retourne un vecteur de taille N
(entier), contenant les résultats de N tirages aléatoires
d'entiers entre a et b inclus (où a et b sont des entiers
où a ≤ b) ;
• tirage_réels(N,a,b) retourne un vecteur de taille N
(entier), contenant les résultats de N tirages aléatoires
de réels entre a et b (où a et b sont des réels où a ≤ b) ;
• frequence(i,S) retourne la fréquence de l'entier i dans
le vecteur S ;
• frequence_tirage_entier(N,a,b) retourne la suite des
fréquences d'apparition des entiers entre a et b inclus
(où a et b sont entiers où a ≤ b) lors de N tirages
aléatoires (N entier) d'entiers entre a et b inclus ;
• bar(V) affiche le diagramme en bâton du vecteur V :
en abscisse les entiers i, en ordonnée les valeurs V(i).
44 A) 2) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
note1=input("note 1 = ?");
note2=input("note 2 = ?");
m=(2*note1+3*note2)/5;
afficher(m,"la moyenne est :");
3) On veut exécuter le programme précédent un certain
nombre de fois, ce qui est lourd en manipulations entre la
Console et l'Editeur. On peut alors penser à créer une
fonction :
function moyenne_Kathy(note1,note2)
m=(2*note1+3*note2)/5;
afficher(m,"la moyenne est :");
endfunction;
Il suffit de charger cette fonction dans la Console, puis de
l'appeler par l'instruction moyenne_Kathy(10,11) par
exemple (sans point-virgule pour afficher le résultat). Pour
l'appeler plusieurs fois, dans la Console on utilise la
flèche du clavier ↑ pour remonter dans l'historique, et on
modifie l'argument de la fonction.
On teste quelques valeurs pour répondre aux questions.
B) 1) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
coeff1=input("coeff1 = ?");
coeff2=input("coeff2 = ?");
m=(coeff1*8+coeff2*13)/(coeff1+coeff2);
afficher(m,"la moyenne est :");
Comme on souhaite exécuter ce programme un certain
nombre de fois, on peut penser à créer une fonction :
function moyenne_Kathy_2(coeff1,coeff2)
m=(coeff1*8+coeff2*13)/(coeff1+coeff2);
afficher(m,"la moyenne est :");
endfunction;
On teste quelques valeurs en appelant dans la Console
moyenne_Kathy_2(2,3) par exemple (sans pointvirgule pour afficher le résultat).
Corrigés – SCILAB
46 2) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
N=input("Nombre de lancers = ?"); P=0;
for i=1:N x=rand();
if x<0.5 then P=P+1; end;
end;
afficher(P/N,"la fréquence de Pile est :");
Comme on souhaite exécuter ce programme plusieurs fois,
on peut penser à créer une fonction :
function f=lancers_piece(N)
P=0;
for i=1:N x=rand();
if x<0.5 then P=P+1; end;
end;
f=P/N;
endfunction;
Il suffit de charger cette fonction dans la Console, puis de
l'appeler par l'instruction lancer_pieces(100) par
exemple (sans point-virgule pour afficher le résultat). Pour
l'appeler plusieurs fois, dans la Console on utilise la
flèche du clavier ↑ pour remonter dans l'historique, et on
modifie l'argument de la fonction.
La simulation de N lancers d'une pièce et l'obtention de la
fréquence d'apparition de Pile peuvent aussi se faire en
utilisant les fonctionnalités de Scilab :
N=input("Nombre de lancers = ?");
S=tirage_reel(N,0,1);
P=taille(find(S<0.5))
afficher(P/N,"la fréquence de Pile est :");
On peut aussi simuler le lancer d'une pièce par un tirage
aléatoire d'un entier entre 0 et 1 (1 pour Pile, 0 pour Face) :
N=input("Nombre de lancers = ?");
S=tirage_entier(N,0,1);
P=frequence(1,S);
afficher(P,"la fréquence de Pile est :");
ou encore :
Page 8
47 2) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
N=input("Nombre de lancers du dé = ?");
for k=1:6 E(k)=0; end;
for i=1:N
k=tirage_entier(1,1,6);
E(k)=E(k)+1;
end;
afficher("les fréquences sont :");
for k=1:6 afficher([k,E(k)/N]); end;
On choisit ici de mettre les effectifs dans le vecteur E :
pour k de 1 à 6, E(k) contient l'effectif du numéro k.
Comme on souhaite exécuter ce programme un certain
nombre de fois, on peut penser à créer une fonction :
function lancers_des(N)
for k=1:6 E(k)=0; end;
for i=1:N
k=tirage_entier(1,1,6);
E(k)=E(k)+1;
end;
afficher("les fréquences sont :");
for k=1:6 afficher([k,E(k)/N]); end;
endfunction;
Il suffit de charger cette fonction dans la Console, puis de
l'appeler par l'instruction lancers_des(100) par
exemple (sans point-virgule pour afficher le résultat). Pour
l'appeler plusieurs fois, dans la Console on utilise la
flèche du clavier ↑ pour remonter dans l'historique, et on
modifie l'argument de la fonction.
La simulation de N lancers d'un dé et l'obtention des
fréquences d'apparition des numéros peuvent aussi se faire
en utilisant les fonctionnalités de Scilab :
N=input("Nombre de lancers = ?");
S=tirage_entier(N,1,6);
for i=1:6
f=frequence(i,S);
afficher([i,f]);
end;
N=input("Nombre de lancers = ?");
P=sum(tirage_entier(N,0,1));
afficher(P/N,"la fréquence de Pile est :");
ou encore :
On peut faire constater la fluctuation d'échantillonnage et
la stabilisation de la fréquence de Pile lorsque le nombre
de lancers devient assez grand en traçant la représentation
graphique de la fonction lancers_piece sur
l'intervalle [1 ; 5000]. Ainsi :
ou encore en créant le vecteur fréquence F, pour permettre
d'afficher numéro et fréquence sur la même ligne :
for i=1:5000 Pile(i)=lancers_piece(i); end;
plot(Pile,"+");
On obtient
dans la
fenêtre
graphique :
N=input("Nombre de lancers = ?");
frequence_tirage_entier(N,1,6)
N=input("Nombre de lancers = ?");
F=[frequence_tirage_entier(N,1,6)];
for i=1:6 afficher([i,F(i)]); end;
Pour constater la stabilisation des fréquences, on peut aussi
demander de tracer le diagramme en bâton des fréquences
obtenues :
N=input("Nombre de lancers = ?");
bar(frequence_tirage_entier(N,1,6));
On obtient par
exemple pour 1000
lancers dans la
fenêtre graphique :
Corrigés – SCILAB
Page 9
48 2) a) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
R=0;
for i=1:100
x=rand();
if x<0.6 then R=R+1; end;
end;
afficher(R/100,"la fréquence
des boules rouges est");
d
apparition
Comme on souhaite exécuter ce programme un certain
nombre de fois, on peut penser à créer une fonction :
function f=echantillon_boules()
R=0;
for i=1:100
x=rand();
if x<0.6 then R=R+1; end;
end;
f=R/100;
endfunction;
F=frequence_echantillon(1000);
N=taille(find(F>=0.5 & F<=0.7));
afficher(N,"le nombre de fréquences dans l
intervalle est");
d
apparition
d
apparition
ou encore :
S=tirage_entier(100,1,100);
R=taille(find(S<=60));
afficher(R/100,"la fréquence
des boules rouge est");
3) a) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
n=input("n = ?");
for k=1:n
R=0;
for i=1:100
x=rand();
if x<0.6 then R=R+1; end;
end;
F(k)=R/100;
end;
afficher(F,"la liste des fréquences
boules rouges est:");
des
On a choisi ici de placer les fréquences successives dans le
vecteur F.
Comme on souhaite exécuter plusieurs fois ce programme,
on peut penser à créer une fonction (on a utilisé ici les
fonctionnalités de Scilab) :
function F=frequence_echantillon(n)
for k=1:n
S=tirage_reel(100,0,1);
R=taille(find(S<0.6));
F(k)=R/100;
end;
endfunction;
n=input("n = ?");
N=0;
for k=1:n
R=0;
for i=1:100
x=rand();
if x<0.6 then R=R+1; end;
end;
if R>=50 & R<=70 then N=N+1; end;
end;
afficher(N,"le nombre de fréquences dans l
intervalle est");
ou encore pour 1000 échantillons :
La simulation de 100 tirages dans l'urne et l'obtention de la
fréquence d'apparition des boules rouges peuvent aussi se
faire en utilisant les fonctionnalités de Scilab :
S=tirage_reel(100,0,1);
R=taille(find(S<0.6));
afficher(R/100,"la fréquence
des boules rouge est");
Pour obtenir le nombre de fréquences appartenant à
l'intervalle de fluctuation :
Il peut être aussi intéressant, par exemple pour 2000
échantillons, de représenter graphiquement la fréquence
d'apparition des boules rouges de chaque échantillon, et de
placer les droites d'équation y = 0,5 et y = 0,7 pour
représenter l'intervalle de fluctuation. Pour cela :
function y=inf_intervalle(x)
y=0.5;
endfunction;
function y=sup_intervalle(x)
y=0.7;
endfunction;
x=linspace(0,2000,2000);
plot(x,inf_intervalle,"r");
plot(x,sup_intervalle,"r");
F=frequence_echantillon(2000);
plot(F,"+");
On obtient dans la fenêtre graphique :
Corrigés – SCILAB
49 1) c) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
N=input("N = ?");
for k=1:8 E(k)=0; end;// sécurité E(1)=0
for i=1:N
a=tirage_entier(1,1,4);
b=tirage_entier(1,1,4);
E(a+b)=E(a+b)+1;
end;
for k=2:8 afficher([k,E(k)/N]); end;
On choisit ici de mettre les effectifs dans le vecteur E :
pour k de 2 à 8, E(k) contient l'effectif de la somme k.
Comme on souhaite exécuter ce programme un certain
nombre de fois, on peut penser à créer une fonction :
Page 10
b) On peut créer une fonction donnant le gain de Maxime
en fonction du nombre de parties :
function G=gain_Maxime(N)
G=0;
for i=1:N
S=sum(tirage_entier(2,1,4));
if S==5 then G=G-9; end;
if S==6 then G=G+10; end;
end;
endfunction;
Pour créer 2000 échantillons de taille 100 et représenter
graphiquement le gain de Maxime sur ces 100 parties :
for i=1:2000 M(i)=gain_Maxime(100); end;
plot(M,"+");
On obtient dans la fenêtre graphique :
function F=frequence_somme(N)
for k=1:8 E(k)=0; end;
for i=1:N
a=tirage_entier(1,1,4);
b=tirage_entier(1,1,4);
E(a+b)=E(a+b)+1;
end;
F=E/N;
endfunction;
Complément : en utilisant les fonctionnalités de Scilab, la
somme obtenue lors du lancer de deux dés tétraédriques
peut être obtenue par :
sum(tirage_entier(2,1,4));
2) On peut tester le programme précédent et observer la
distribution des fréquences de la somme possible.
On peut aussi représenter graphiquement cette distribution,
par exemple sur une simulation de 2000 lancers :
F=frequence_somme(2000);
bar(F);
On obtient dans la fenêtre graphique :
50 1) c) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
N=input("Nombre de parties = ?");
G=0;
for k=1:N
P=1;
for i=1:6
a=tirage_entier(1,1,6);
P=P*(a-6);
end;
if P==0 then G=G+1; end;
end;
afficher(G/N,"la fréquence de gain est");
Comme on souhaite exécuter ce programme un certain
nombre de fois, on peut penser à créer une fonction.
En utilisant les fonctionnalités de Scilab :
3) a) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
N=input("Nombre de parties = ?");
J=0; M=0;
for i=1:N
S=sum(tirage_entier(2,1,4));
if S==5 then J=J+9; M=M-9; end;
if S==6 then J=J-10; M=M+10; end;
end;
afficher(J,"le gain de Julie est:");
afficher(M,"le gain de Maxime est:");
function f=frequence_gain(N)
G=0;
for k=1:N
P=prod(tirage_entier(6,1,6)-6);
if P==0 then G=G+1; end;
end;
f=G/N;
endfunction;
Pour tracer la représentation graphique de la fréquence de
gain observée en fonction du nombre de parties sur
l'intervalle [1 ; 2000] :
for i=1:2000
Gain(i)=frequence_gain(i);
end;
plot(Gain,"+");
Corrigés – SCILAB
On obtient dans la fenêtre graphique :
51 1) c) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
N=input("Nombre de lâchers = ?");
for i=1:4 numero(i)=0; end;
for k=1:N
a=tirage_entier(1,0,1);
b=tirage_entier(1,0,1);
c=tirage_entier(1,0,1);
numero(a+b+c+1)=numero(a+b+c+1)+1;
end;
afficher("les fréquences sont :");
for i=1:4
afficher([i-1,numero(i)/N]);
end;
Ici les effectifs de chaque numéro sont stockés dans le
vecteur numero.
Comme on souhaite exécuter ce programme un certain
nombre de fois, on peut penser à créer une fonction.
En utilisant les fonctionnalités de Scilab :
function F=frequence_numero(N)
for i=1:4 numero(i)=0; end;
for k=1:N
i=sum(tirage_entier(3,0,1));
numero(i+1)=numero(i+1)+1;
end;
F=numero/N;
endfunction;
Page 11
52 3) b) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
N=input("nombre d expériences = ?");
for i=1:5 eff(i)=0; end;
for k=1:N
x=0;
for i=1:4
a=tirage_entier(1,0,1);
if a==1 then x=x+1; else x=x-1; end;
end;
if x==-4 then eff(1)=eff(1)+1; end;
if x==-2 then eff(2)=eff(2)+1; end;
if x==0 then eff(3)=eff(3)+1; end;
if x==2 then eff(4)=eff(4)+1; end;
if x==4 then eff(5)=eff(5)+1; end;
end;
afficher("les fréquences sont :");
for i=1:5 afficher([2*i-6,eff(i)/N]); end;
Comme on souhaite exécuter ce programme un certain
nombre de fois, on peut alors penser à créer une fonction :
function frequence_robot(N)
for i=1:5 eff(i)=0; end;
for k=1:N
x=0;
for i=1:4
a=tirage_entier(1,0,1);
if a==1 then x=x+1; else x=x-1; end;
end;
if x==-4 then eff(1)=eff(1)+1; end;
if x==-2 then eff(2)=eff(2)+1; end;
if x==0 then eff(3)=eff(3)+1; end;
if x==2 then eff(4)=eff(4)+1; end;
if x==4 then eff(5)=eff(5)+1; end;
end;
afficher("les fréquences sont :");
for i=1:5 afficher([2*i-6,eff(i)/N]); end;
endfunction;
Complément : on peut de façon "astucieuse" et en utilisant
les fonctionnalités de Scilab simuler l'expérience plus
rapidement :
- pour l'abscisse x après quatre pas :
x=2*sum(tirage_entier(4,0,1))-4;
- pour l'incrémentation du compteur dans le vecteur eff
en fonction de x :
i=(x+4)/2+1;
eff(i)=eff(i)+1;
- la fonction frequence_robot peut ainsi être définie :
function frequence_robot(N)
for i=1:5 eff(i)=0; end;
for k=1:N
x=2*sum(tirage_entier(4,0,1))-4;
i=(x+4)/2+1;
eff(i)=eff(i)+1;
end;
afficher("les fréquences sont :");
for i=1:5 afficher([2*i-6,eff(i)/N]); end;
endfunction;
Corrigés – SCILAB
53 2) b) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
N=input("nombre de parties = ?");
N1=0; N2=0; N3=0;
for i=1:N
a=tirage_entier(1,1,4);
if a==1 then N2=N2+1;
else b=tirage_entier(1,1,3);
if b==1 then N3=N3+1;
else N1=N1+1;
end;
end;
end;
afficher(N1/N,"la fréquence du gain 2€ est");
afficher(N2/N,"la fréquence du gain 1€ est");
afficher(N3/N,"la fréquence du gain -2€ est");
Comme on souhaite exécuter ce programme un certain
nombre de fois, on peut penser à créer une fonction :
function jeu(N)
N1=0; N2=0; N3=0;
for i=1:N
a=tirage_entier(1,1,4);
if a==1 then N2=N2+1;
else b=tirage_entier(1,1,3);
if b==1 then N3=N3+1;
else N1=N1+1;
end;
end;
end;
afficher(N1/N,"la fréquence du gain 2€ est");
afficher(N2/N,"la fréquence du gain 1€ est");
afficher(N3/N,"la fréquence du gain -2€ est");
endfunction;
54 1) b) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
xA=rand(); xB=rand()
if max(xA,xB)-min(xA,xB)>0.5 then
afficher("D est réalisé");
else afficher("D n est pas réalisé");
end;
Comme on souhaite exécuter ce programme un certain
nombre de fois, on peut penser à créer une fonction :
function distanceAB()
xA=rand(); xB=rand();
if max(xA,xB)-min(xA-xB)>0.5 then
afficher("D est réalisé");
else afficher("D n est pas réalisé");
end;
endfunction;
2) a) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
N=input("nombre d expériences = ?");
n=0;
for k=1:N
xA=rand(); xB=rand();
if max(xA,xB)-min(xA,xB)>0.5 then
n=n+1;
end;
end;
afficher(n/N,"la fréquence de D est ");
Page 12
Comme on souhaite exécuter ce programme un certain
nombre de fois, on peut penser à créer une fonction :
function f=NdistanceAB(N)
n=0;
for k=1:N
xA=rand(); xB=rand();
if max(xA,xB)-min(xA,xB)>0.5 then
n=n+1;
end;
end;
f=n/N;
endfunction;
Pour tracer la représentation graphique de la fréquence
d'apparition de D en fonction du nombre de simulations
sur l'intervalle [1 ; 5000] :
for i=1:5000 D(i)=NdistanceAB(i); end;
plot(D,"+");
On obtient dans la fenêtre graphique :
55 3) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
N=input("nombre de rendez-vous = ?");
n=0;
for i=1:N
xR=tirage_reel(1,0,60);
xJ=tirage_reel(1,0,60);
if max(xR,xJ)-min(xR,xJ)<=10 then
n=n+1;
end;
end;
afficher(n/N,"la fréquence de rencontres
est");
Comme on souhaite exécuter ce programme un certain
nombre de fois, on peut penser à créer une fonction :
function f=rencontre(N)
n=0;
for i=1:N
xR=tirage_reel(1,0,60);
xJ=tirage_reel(1,0,60);
if max(xR,xJ)-min(xR,xJ)<=10 then
n=n+1;
end;
end;
f=n/N;
endfunction;
Pour tracer la représentation graphique de la fréquence de
rencontres en fonction du nombre de simulations sur
l'intervalle [1 ; 2000] :
for i=1:2000 r(i)=rencontre(i); end;
plot(r,"+");
Corrigés – SCILAB
On obtient dans la fenêtre graphique :
Page 13
57 2) b) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
N=input("nombre de tirs = ?");
n=0;
for i=1:N
x=tirage_reel(1,0,1);
y=tirage_reel(1,0,1);
if x^2+y^2<=1 & (1-x)^2+(1-y)^2<=1 then
n=n+1;
end;
end;
afficher(n/N,"la fréquence d atteinte de la
partie colorée est");
Comme on souhaite exécuter ce programme un certain
nombre de fois, on peut penser à créer une fonction :
56 2) b) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
N=input("nombre de tirs = ?");
n=0;
for i=1:N
x=tirage_reel(1,0,1);
y=tirage_reel(1,0,1);
if x^2+y^2<=1 then n=n+1; end;
end;
afficher(n/N,"la fréquence d atteinte de la
partie colorée est");
Comme on souhaite exécuter un certain nombre de fois ce
programme, on peut penser à créer une fonction :
function f=tir(N)
n=0;
for i=1:N
x=tirage_reel(1,0,1);
y=tirage_reel(1,0,1);
if x^2+y^2<=1 then n=n+1; end;
end;
f=n/N;
endfunction;
Pour tracer la représentation graphique de la fréquence
d'atteinte de la partie colorée en fonction du nombre de
simulations sur l'intervalle [1 ; 1000] :
for i=1:1000 t(i)=tir(i); end;
plot(t,"+");
On obtient dans la fenêtre graphique :
function f=tir(N)
n=0;
for i=1:N
x=tirage_reel(1,0,1);
y=tirage_reel(1,0,1);
if x^2+y^2<=1 & (1-x)^2+(1-y)^2<=1
n=n+1;
end;
end;
f=n/N;
endfunction;
then
Pour tracer la représentation graphique de la fréquence
d'atteinte de la partie colorée en fonction du nombre de
simulations sur l'intervalle [1 ; 1000] :
for i=1:1000 t(i)=tir(i); end;
plot(t,"+");
On obtient dans la fenêtre graphique :
Corrigés – SCILAB
58 2) b) On peut éventuellement écrire un algorithme pour
résumer la démarche avant de le transcrire en langage
Scilab :
N=input("nombre de tirs = ?");
n=0;
for i=1:N
x=tirage_reel(1,0,1);
y=tirage_reel(1,0,1);
if y<=x^2 then n=n+1; end;
end;
afficher(n/N,"la fréquence est");
Comme on souhaite exécuter ce programme un certain
nombre de fois, on peut penser à créer une fonction :
function f=tir(N)
n=0;
for i=1:N
x=tirage_reel(1,0,1);
y=tirage_reel(1,0,1);
if y<=x^2 then n=n+1; end;
end;
f=n/N;
endfunction;
Pour tracer la représentation graphique de la fréquence
d'atteinte de la partie colorée en fonction du nombre de
simulations sur l'intervalle [1 ; 1000] :
for i=1:1000 t(i)=tir(i); end;
plot(t,"+");
On obtient dans la fenêtre graphique :
Page 14
Téléchargement