TP 2 - DTU Compute

publicité
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.
Téléchargement