Vincent Neiger et Henri Lastakowski 2010/2011 Matlab – TP no 2 Les fonctions 1 1.1 Introduction Les fonctions dans Matlab Dans ce TP, on va voir comment définir des fonctions en Matlab. On a déjà vu au TP précédent qu’il fallait créer un fichier .m pour chaque fonction, et que la syntaxe de ce fichier était particulière. Ainsi la première ligne sera toujours de la forme function resultats = nom_fonction(arguments) où nom_fonction est le nom du fichier .m utilisé, et resultats et arguments sont des nouveaux noms introduits pour savoir de quoi on parle dans la suite du fichier. Ainsi, on pourra par exemple avoir comme définitions de fonctions (première ligne d’un fichier .m) : function r = plus(a,b) function [q, r] = euclide(a,b) function f = factorielle(n) On peut mettre n’importe quel nom de variable à la place de resultats ou arguments, il faudra simplement s’y tenir dans tout le fichier .m Remarque pour la suite : l’indentation (les espaces en début de chaque ligne) est importante, à la fois pour vous (pour relire facilement votre code), et pour Matlab. 1.2 Notion d’algorithme Matlab peut nous permettre de résoudre des problèmes numériques, mais -et c’est ce qui nous intéresse ici- on peut aussi s’en servir pour résoudre des problèmes en donnant un algorithme. Etant donné un problème, nous appelons algorithme une suite d’instructions composant un processus visant à résoudre ce problème. Cette notion sera plus claire dans la suite. L’important lorsqu’on donne un algorithme est la rigueur du raisonnement plutôt que la syntaxe, qui sera importante seulement lors de l’implémentation en Matlab. Par exemple, pour obtenir le maximum de deux nombres a et b, on utilise l’algorithme Si a > b, Renvoyer a Sinon, Renvoyer b Pour obtenir la somme des éléments d’un tableau t de taille n (en matlab ce sera un vecteur), on a l’algorithme : somme = 0 Pour i allant de 1 a n, Faire somme = somme + t(i) Renvoyer somme Matlab – TP no 2 Les fonctions 2/?? En général, lorsqu’on voudra résoudre un problème, on procèdera en deux étapes : 1. Analyse et résolution algorithmique du problème, avec un stylo et du papier. 2. Traduction de l’algorithme ainsi obtenu dans un langage de programmation, sur ordinateur, par exemple Matlab. 2 Les fonctions de base Dans le TP 1, nous avons défini la fonction récursive de fibonacci dans un fichier. Q 2.a) Revoir cette définition et noter les mots clef (c’est a dire les nom d’instruction prédéfinis dans matlab) dans votre cahier. Pour définir une fonction x 7→ f (x) = y on utilise la syntaxe suivante dans le fichier f.m : function y = f(x) instruction 1 ... instruction n où les instructions permettent de calculer puis d’affecter une valeur à y. Q 2.b) écrire les fonctions carre(n) et divise(a,b) (dans deux fichiers séparés) qui calculent respectivement n2 et a/b. Matlab peut également renvoyer plusieur résultats (sous forme d’un tableau, ou vecteur) pour un même fonction. Q 2.c) écrire la fonction [q r] = euclide (a b) qui renvoie le quotient et le reste de la division euclidienne de a par b. On n’utilisera pas ici d’algorithme à proprement parler, et on se permettra d’utiliser la fonction matlab prédéfinie mod(x,y) pour calculer le reste directement. Le but est seulement de découvrir les fonctions renvoyant plusieurs résultats. 3 Branchement conditionnel On peut demander à Matlab d’exécuter une instruction instruction_1 si et seulement si une condition est vérifiée, avec if. if condition instruction_1 end Mais on peut aussi demander d’exécuter une autre instruction si la condition n’est pas vérifiée, avec else if condition instruction_1 else instruction_2 end Enfin, on peut créer des cas intermédiaires, qui dépendent d’autres conditions ; conditions qui ne seront évaluées que si condition_1 est fausse, et ainsi de suite. if condition_1 instruction_1 Matlab – TP no 2 Les fonctions 3/?? elseif condition_2 instruction_2 ... else instruction_n end Les conditions seront toujours des valeurs qui représentent vrai ou faux, par exemple le résultat d’un test d’égalité (a == b), ou une comparaison (a <= b). Nous verrons des exemples plus compliqués dans un prochain TP. Q 3.a) Ecrivez une fonction Matlab qui renvoie la valeur absolue d’un nombre passé en argument (absolue(x)). Q 3.b) Ecrivez des fonctions Matlab qui renvoient le maximum, ainsi que le minimum de deux nombres. Q 3.c) Donnez un algorithme pour trouver le maximum (resp. le minimum) de trois nombres (par exemple a, b, c), en utilisant le moins de comparaisons possibles (i.e. deux comparaisons à chaque fois, pas trois). Puis écrivez les fonctions minimum3, maximum3 correspondantes. 4 4.1 Boucles for Quelques fonctions mathématiques Les boucles permettent d’itérer une série d’instructions dans un algorithme (on parle alors d’algorithme itératif ) : Pour i allant de 0 a n Faire: ( instruction 1 ... instruction m) La variable i, appelée indice de boucle, a deux utilités : elle permet de compter le nombre de fois qu’on effectue les instructions, mais aussi d’effectuer des instructions qui dépendent de i. L’exemple le plus typique est le parcours de tableau : lors de la ieme étape, on regarde l’élément de la ieme case. Q 4.a) Proposer une définition des mots "itérer" et "itération". Q 4.b) écrire un algorithme itératif qui calcule la factorielle, et un qui calcule 2n en fonction de n. Indice : on définira une variable résultat dont la valeur changera à chaque itération. En Matlab, la syntaxe est la suivante : for i= 0:n instruction 1 ... instruction m end Q 4.c) Implémenter les algorithmes de la question précédente en Matlab. Lors du dernier TP, nous avons vu comment afficher la courbe d’une fonction en 3D. Pour dessiner une courbe en 2D, il faut utiliser l’instruction plot (au lieu de plot3. Lorsque l’on Matlab – TP no 2 Les fonctions 4/?? veut afficher plusieurs courbes sur un même graphe, il suffit d’utiliser la commande hold on après la définition de chaque courbe. Q 4.d) Afficher sur un même graphique les courbes de fonctions factorielle, carre et puissance avec trois couleurs différentes, et les identifier. 4.2 Itération et vecteurs On considère ici qu’un vecteur est un tableau (à une ligne) de nombres. En Matlab, le vecteur v contenant les nombres 14, 07, 17, 89 est défini par v = [14 07 17 89]. Le tableau vide est noté []. On peut également définir un vecteur t en concaténant (c’est à dire en collant bout à bout) les vecteurs t1 et t2 : t = [t1 t2]. Enfin, on peut connaitre la longueur d’un vecteur v grâce à la fonction prédéfinie length, et sa ieme valeur avec v(i). Q 4.e) Définir le vecteur v dans matlab, et demander sa longueur ainsi que sa 2ème valeur. Q 4.f) Dans des fichiers séparés, définir : – la fonction pluspetit qui renvoie la plus petite valeur de v – la fonction pairs qui renvoie le nombre de valeurs paires. – la fonction somme qui renvoie la somme des valeurs. Chacune de ces fonctions prendra un vecteur v en argument. Q 4.g) écrivez une fonction Matlab qui renvoie le vecteur contenant les n premiers entiers naturels : [1, 2, ...., n]. Faites de même pour les carrés des n premiers entiers naturels [1, 4, 9, 16, ...., n2 ] Q 4.h) On rappelle que la suite de Fibonacci est définie par f1 = f2 = 1 et pour tout n plus grand que 2, fn = fn−1 + fn−2 . On a vu au TP précédent qu’on pouvait programmer cette fonction avec un algorithme récursif (fibonacci(n) appelait fibonacci(n-1) et fibonacci(n2)), mais ce n’était pas très efficace : écrivez les premières valeurs de cette suite sur votre cahier dans un tableau, et déduisez-en un algorithme différent de celui vu la dernière fois pour calculer la suite de Fibonacci. Implémentez ensuite cet algorithme en Matlab. Etant donné n, on veut renvoyer le tableau de toutes les valeurs fk pour k plus petit que n. 4.3 Composer des fonctions L’intérêt principal des fonctions au niveau calculatoire est que l’on peut les composer comme en Maths. En effet, toutes les fonctions que l’on a écrites renvoient un résultat, que l’on peut utiliser comme argument pour une autre fonction : g(f(x)). Par exemple, si x est un réel, on peut demander à Matlab de calculer minimum(cos(x), (sin(x)). Q 4.i) Utilisez les fonctions divise et somme définies précédemment, ainsi que la fonction matlab length pour calculer la moyenne des éléments d’un vecteur en matlab. 5 Questions en vrac Q 5.a) Ecrire une fonction qui vérifie si un tableau est trié en ordre croissant. Q 5.b) Ecrire une fonction qui fusionne deux tableaux triés en ordre croissant.