Correction d’exercices d’annales de Scilab Correction d’exercices d’annales de Scilab
En prépa EC, tout le monde connaît l’importance du coefficient des épreuves de mathématiques. Pourtant, le Scilab est fortement négligé par de nombreux candidats... Correction d’exercices d’annales de Scilab

En prépa EC, tout le monde connaît l’importance du coefficient des épreuves de mathématiques. Pourtant, le Scilab est fortement négligé par de nombreux candidats qui ne lisent parfois même pas les questions d’informatique.

Grave erreur ! Cet aspect des mathématiques est de plus en plus prié par les concepteurs de sujets. De plus, comme les candidats qui répondent (correctement) aux questions Scilab ne sont pas majoritaires, ces questions sont souvent bonifiées. Cela crée une différence très importante entre les candidats qui traitent les questions Scilab et les autres. C’est pourquoi il est important de ne pas négliger cet aspect des mathématiques.  Comme nous allons le voir, les questions Scilab sont pourtant (souvent) accessibles.

 

EDHEC 2018 (sujet dit « de Clermont », sujet annulé)

Le premier exercice provient du fameux sujet EDHEC 2018 tombé à Clermont et annulé. On peut déjà remarquer que le Scilab constitue une partie entière du problème. De plus, on note que le script à compléter est extrêmement lié à l’énoncé. Il est donc important de bien le lire et de bien le comprendre avant de lire le script demandé.

 

Question 1

Première partie de la question

Premièrement, on note que Sk compte le nombre de lancers nécessaires avant d’obtenir k fois pile. On sait aussi que « pile » est obtenu avec une probabilité p et que les lancers sont indépendants.

On comprend donc qu’il faut que le programme parvienne à vérifier si un lancer renvoie pile ou face. Pour cela, c’est classique donc il faut le retenir. On utilise, la fonction rand(). On rappelle que cette fonction renvoie une valeur aléatoire comprise entre 0 et 1.

Pour comprendre le lien entre cette fonction et le fait de simuler un lancer de pièce de probabilité p, il faut « visualiser » ce que fait cette fonction. Cette fonction permet de sélectionner un point aléatoire sur le segment [0;1]. Or, si on pose que p est une valeur de [0 ;1] (logique car c’est une probabilité ..) on comprend qu’il y a une probabilité p que la fonction rand() renvoie un point de [0 ;p] !

Donc pour en revenir à notre exercice, la probabilité que la fonction rand() renvoie une valeur de [0 ;p] est égale à la probabilité d’obtenir pile sur le lancer de pièce. Soit encore (écrit de manière non « conventionnelle ») :

P(rand()<p)=P(le lancer renvoie pile).

D’où le fait qu’on complète la ligne 7 comme ceci :

if (rand()<p) then c=c+1

 

Deuxième partie de la question

Pour la ligne 10 il faut comprendre ce que l’on attend du script : on veut que celui-ci nous donne le nombre de lancers nécessaires pour obtenir k « pile ». Il faut donc comprendre la valeur qui importe vraiment EN DEHORS de la boucle. Cette valeur est aussi celle sur laquelle on n’a aucun contrôle.

En effet, on sait que si l’on sort de la boucle alors c vaudra k donc il n’y a aucun intérêt à demander à l’algorithme de renvoyer la valeur de c. En revanche, on remarque que n fonctionne comme un compteur : il compte le nombre de passages dans la boucle nécessaires pour que c=k.

Si on se réfère au contexte de l’exercice on remarque que n compte le nombre de lancers nécessaires pour obtenir k « pile ». Autrement dit n est exactement la valeur que l’on recherche. D’où le fait que l’on complète le script de la manière suivante :

disp(n)

Question 2

Encore une fois, il faut comprendre ce que l’on cherche à faire. Comme on veut obtenir le rang d’apparition du dernier « pile » d’une série de k « pile » consécutifs il faut que l’algorithme puisse encore une fois vérifier si l’on a obtenu « pile » ou non. Il doit aussi faire en sorte que le compteur compte le nombre de « pile » consécutifs et qu’il se réinitialise (reprenne la valeur 0) si l’on obtient un « face ».

Donc encore une fois on utilise  la fonction rand() pour simuler le lancer de pièce sauf que cette fois quelque soit la valeur renvoyée par la fonction le compteur changera de valeur. On complète donc l’algorithme de la manière suivane :

if (rand()<p) then c=c+1, else c=0.

 

Ces deux questions sont très classiques en Scilab et sont accessibles à partir du moment où l’on connait la façon de simuler un lancer de pièce (à l’aide de la fonction « rand() »). Comme on l’a dit elle sont une partie entière d’un problème EDHEC donc cela représente de nombreux points à gagner.

 

ECRICOME 2019

Après le sujet EDHEC où toutes les questions étaient fortement liées à l’énoncé on passe à un sujet ECRICOME où la question ne nécessite presque pas de connaître le reste de l’énoncé. Cela nous permet de voir les deux cas de figure possibles. Le second est plus rare et est souvent accompagné de questions liées à l’énoncé. Mais cela montre l’importance de lire toutes les questions (cela vaut aussi pour les questions « non-Scilab »). En effet certaines questions aident simplement le candidat à gagner quelques points., il ne faut donc pas les laisser de côté.

La ligne 5

On remarque déjà que le cœur de l’algorithme se trouve à la ligne 5 (et si on ne le voit pas l’énoncé nous le rappelle). Il faut donc avant tout comprendre ce qu’il se passe au niveau de cette ligne 5.

Tout d’abord on remarque à nouveau l’utilisation de la fonction rand() sauf que cette fois on a rand()*(n+b)+1 donc au lieu de se placer sur le segment [0 ;1] comme dans le premier exercice on se place ici sur [1 ;n+b+1]. Pour être précis comme P(rand()=1)=0 (pour des raisons de densité) on se place sur l’intervalle [1 ;n+b+1[. Cette précision prend toute son importance lorsque l’on voit que l’algorithme utilise la fonction « floor » ! On rappelle que la fonction « floor » en Scilab correspond à la fonction partie entière. En effet les valeurs que peut prendre la variable r sont alors les entiers compris entre 1 et n+b. On comprend donc que la ligne 5 est une simulation de la loi uniforme sur [|1 ;n+b|].

 

Le reste du script

De cette observation on comprend ce que fait le reste du script. La boucle compte le nombre de fois où cette loi uniforme renvoie un résultat  inférieur ou supérieur à n. La subtilité étant que les valeurs de n et de b ne sont pas fixées. C’est-à-dire qu’à chaque fois que le résultat est supérieur à n la valeur de n augmente de 1 tandis que si la valeur est inférieure à n alors c’est la valeur de b qui augmente de 1.

Comme la boucle va de 1 à k on comprend que l’on fait k simulations de cette loi uniforme. Si on note m le nombre de fois où la simulation a renvoyé une valeur inférieure à n au cours des k simulations, on comprend que l’algorithme renvoie m+1 (car la valeur de b vaut initialement 1).

 

Conclusion

Les exercices Scilab sont présents dans tous les types d’épreuves et rapportent de nombreux points. Et comme on l’a vu il est parfois possible de les traiter sans avoir saisi l’entièreté du contexte de l’exercice. Il faut donc toujours les lire et au moins essayer de les traiter ! Surtout que ces exercices sont en général accessibles !

Théo Tacita

Etudiant de première année à l'ESCP après deux années en prépa ECS au Lycée La Bruyère à Versailles.