Outils pour utilisateurs

Outils du site


tp:methnum:progmatlab

Programmation Matlab

Nous proposons ici de commencer l'écriture de scripts et de fonctions dans le langage Matlab.

Utiliser l'éditeur

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 :

  • ouvrir la fenêtre de l'éditeur (entrez edit à l'invite de commande)
  • entrer le court script qui précède
  • enregistrer ce script dans un répertoire spécifique au calcul scientifique dans votre répertoire personnel (Z:) sous le nom fibo.m
  • exécuter ce script depuis la fenêtre de commande en entrant son nom, sans l'extension : 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 500×500. 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) ?

Suite logistique

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 :

  • une fonction qui calcule $u_{n+1}$ en fonction de $u_{n}$ et $\mu$ ;
  • une fonction qui calcule un vecteur contenant les N premiers termes de la suite, étant donnés $\mu$, $u_0$ et N ;

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érifications

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.

Quelques résultats / graphisme

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 ?

tp/methnum/progmatlab.txt · Dernière modification: 2014/05/16 16:32 (modification externe)