Nous proposons ici de commencer l'écriture de scripts et de fonctions dans le langage Matlab.
Pour taper des séquences d'instructions longues, ou pour tout travail un peu conséquent, il est conseillé d'utiliser l'éditeur intégré et de mettre les commande dans l'éditeur. On demandera ensuite à Matlab d'exécuter toutes les commandes qui sont dans le fichier. On dit alors que l'on écrit un **script** Matlab.
Voici un exemple de script qui va être utilisé dans la suite :
fib=[1 1]; for i=3:30 fib(i)=fib(i-1)+fib(i-2); end
Vous devez bien comprendre les étapes suivantes :
edit
à l'invite de commande)fibo.m
fibo
Attention, ce n'est pas parce que vous obtenez la réponse à la question qui suit que vous avez correctement fait toutes les étapes et que vous avez correctement enregistré votre fichier.
Question 1) Combien vaut fib(20)
?
Assurez-vous de maîtriser parfaitement la navigation dans les répertoires : À quel endroit enregistrez-vous ? Sous quel nom ? Quel est le répertoire courant ? Vous devez pouvoir répondre à tout moment à ces questions. N'hésitez pas à demander de l'aide à l'encadrant si ce n'est pas le cas.
Question 2) Modifiez votre script de manière à ce qu'il calcule à présent 1000 termes. Quelle ligne faut-il modifier ?
Question 3) Maintenant que vous disposez d'un vecteur contenant les 1000 premiers termes de la suite de Fibonacci, calculez dans un nouveau vecteur le rapport de chaque terme sur le précédent. Ce nouveau vecteur devra contenir : f(2)/f(1)
, f(3)/f(2)
, ... , f(1000)/f(999)
Il ne contiendra donc que 999 valeurs.
Proposez deux façon d'y arriver, avec ou sans boucle. Cela signifie que vous devez donner, dans votre rapports, deux manières différentes de faire le même calcul. Une de ces méthodes devra utiliser des boucles et l'autre non.
Les deux commandes tic
et toc
permettent de mesurer approximativement la durée d'une commande :
>> tic;eig(rand(500,500));toc Elapsed time is 0.779455 seconds.
La commande toc
affiche en fait le temps qui s'est écoulé depuis l'émission de la commande tic
. La commande eig(rand(500,500))
calcule les valeurs propres d'une matrice aléatoire de taille 500x500. Nous voyons dans l'exemple qu'il a fallu 0.8 secondes pour faire ce calcul.
Question 3bis)
Utilisez ce principe pour comparer la vitesse de vos deux méthodes de calcul précédentes. Quelle méthode est la plus rapide ? À quoi cette différence est-elle due principalement (attention, ce n'est pas évident) ? Pensez à placer la commande clear all
au début de vos scripts, de manière à nettoyer l'environnement de travail (la présence préalable de certaines variables peut modifier les résultats obtenus à cette question).
Question 4) Que pensez-vous des valeurs obtenues à la question 3. Un nombre particulier doit apparaître. Quel est ce nouveau nombre (il est presque aussi célèbre que $\pi$, une recherche sur Internet devrait vous permettre de trouver son nom) ?
En travaux dirigés, nous avons parlé de la suite logistique : $$u_{n+1}=\mu u_n(1-u_n)$$
Nous allons voir comment la programmer et l'étudier sommairement avec Matlab. Puisqu'il s'agit d'une famille de suites, paramétrée par $\mu$, nous allons écrire les fonctions suivantes :
Vous appellerez ces deux fonctions : logistique
et suitelogistique
. Voici le tout début de ces fonctions. Vous devez les compléter et les enregistrer dans deux fichiers séparés nommés logistique.m
et suitelogistique.m
. Les noms des fonctions doivent correspondre aux noms des fichiers pour que Matlab puisse les retrouver par la suite.
function v=logistique(mu,u) ... end
function res=suitelogistique(N,mu,u0) ... end
Vérifiez que vos deux fonctions donnent des résultats corrects. Pour cela, contrôlez d'abord la fonction logistique
.
Question 5) Quels sont les contrôles que vous avez faits pour vérifier que la fonction logistique
est correcte ? Donnez des copié/collés de vos manips.
Question 6) Quels sont les contrôles que vous avez faits pour vérifier que la fonction suitelogistique
est correcte ? Donnez des copié/collés de vos manips.
Question 7) Une fois les deux fonctions vérifiées, donnez en le texte dans votre compte rendu.
Essayez d'utiliser la fonction suitelogistique
ainsi :
v=suitelogistique(100,11/4,0.5); plot(v,'.')
La fonction ''plot'' affiche la liste des points obtenus.
Vous devriez obtenir une figure similaire à celle qui suit :
Question 8) Vers quelle valeur semble converger la suite ?
En augmentant la valeur de $\mu$, la suite change de comportement, et ne converge plus vers une valeur unique, mais vers deux valeurs.
Question 9) En procédant de manière très minutieuse à partir de la valeur $\mu=11/4=2.75$ (augmentez le nombre de points tracés par exemple, et faites varier $\mu$ tout doucement), vers quelle valeur de $\mu$ la suite se met-elle à osciller entre deux valeurs ? Quelles sont ces valeurs ?
Question 10) Si vous continuez à augmenter $\mu$ (on reste néanmoins en deça de 4), il se produit un autre changement qualitatif et la suite converge vers quatre valeurs. Pour quelle valeur de $\mu$ ce phénomène se produit-il ?
Question 11) Qu'observez-vous pour $\mu=3.75$ ? Vous pouvez tracer jusqu'à 1 million de points.
Question 12) Pour $\mu=3.845$, entre combien de valeurs la suite finit-elle par osciller ?