TD Programmation sous Octave

Transcription

TD Programmation sous Octave
TD Programmation sous Octave
Exercices divers en Octave
Responsables : J. Ah-Pine, , M.A. Rizoiu
Débuts
?? Exercice 1 : Démarrez Octave (commande octave sous linux). Si vous êtes sous linux, il existe
une interface graphique appelée qtoctave qui est peut-être installée (à essayer).
En ligne de commande, tapez x = −1 : 0.1 : 1. Ensuite, exécutez chacune des commandes suivantes
et observez attentivement les résultats :
sqrt(x)
sin(x)
x^2
x.^3
plot(x,cos(x.^2))
cos(x)
x.^2
plot(x,sin(x.^3))
Commentez les résultats lorsque cela vous semble nécessaire (à l’aide du caractère de commentaire %).
?? Exercice 2 : Exécutez les commandes suivantes et expliquez les résultats obtenus :
x = [2 3 4 5]
y = -1 : 1 : 2
x.^y
x.*y
x./y
Vecteurs et matrices
?? Exercice 3 : Que produisent les commandes Octave suivantes ?
x=1:1:10
z=rand(10)
y=[z;x]
x=rand(4)
x2=x’
c=[1 2 2 ; 3 1 0 ; 1 2 3]
e=[c eye(size(c))] ; [eye(size(c)) ones(size(c))]
d=sqrt(c)
t1=d*d
t2=d.*d
?? Exercice 4 : On note :






1
−5
−1
u1 =  2  , u2 =  2  , u3 =  −3 
3
1
7
1. définissez ces vecteurs sous Octave.
2. calculez u1 + u2 , u1 + 3u2 − 5u3 , u3/5.
3. calculez ku1 k2 , ku2 k1 , ku3 k∞ en utilisant la commande norm. Pour comprendre comment fonctionne cette commande, utilisez la commande help norm. Pour vous déplacer dans l’aide, utiliser
les flèches haut et bas. Pour revenir au prompt Octave, appuyez ensuite sur la touche Q (comme
Quit).
4. calculez le cosinus de l’angle formé par les vecteurs u1 et u2 .
La norme d’un vecteur peut être calculée à l’aide de la commande norm d’Octave. Pour rappel, le
cosinus de l’angle formé par deux vecteurs est égal au produit scalaire de ces vecteurs divisé par le
produit de leur norme euclidienne.
?? Exercice 5 : Initialisez la matrice A=[1 5 8 ; 84 81 7 ; 12 34 71] et examinez le contenu de
A(1, 1), A(2, 1), A(3, 3), A(1 : 2, :), A(:, 1), A(3, :), A(:, 2 : 3). Très important : essayez de comprendre,
en vous aidant du cours si besoin, à quoi correspond le symbole ‘ :’.
?? Exercice 6 : Initialisez une matrice A4x4 de votre choix. Calculez la somme de la première
ligne et de la deuxième colonne de cette matrice. Pour cela, vous pouvez procéder en 3 étapes :
1. Affectez à B la sélection de la première ligne de la matrice A (pensez à utiliser ‘ :’ !).
2. Affectez à C la sélection de la deuxième colonne de A.
3. Faı̂te la somme de B avec la transposée de C.
?? Exercice 7 : Soient

−2
A =  −2
1
trois matrices A, B et C


−2 1
−3
1 −2  , B =  0
−2 −2
0
:



0 0
1 1
1
−3 0  , C =  1 0 −2 
0 3
1 −1 1
Au moyen d’Octave, calculez C −1 × A × C. Que peut-on en conclure ?
?? Exercice 8 : On note :






5/8 −1/4 1/8
1
5
0
1/4  , b =  −1  , u0 =  2 
A =  1/4
1/8 −1/4 5/8
1
−4
1. Calculez les premiers termes de la suite un = A ∗ un−1 + b. Pour obtenir un affichage avec des
fractions, utilisez la commande format.
2. Qu’observez-vous ?
3. Même question avec :



 
2
5 6 3
1
B =  −1 5 −1  , b =  −1  , u0 =  1 
0
1 2 0
1

?? Exercice 9 : Résoudre le système d’équation suivant :
4x + 3y + 2z + t = 1
3x + 4y + 3z + 2t = 1
2x + 3y + 4z + 3t = −1
x + 2y + 3z + 4t = −1
en utilisant l’opérateur \ d’Octave.
?? Exercice 10 : Calculez les déterminants, inverses, valeurs propres et vecteurs propres de
chacune des matrices :


2 3 4
2 3
A=
,B =  7 6 5 
6 5
2 8 7
Pour cela, vous utiliserez les commandes det, eig et inv.
2
Graphiques
?? Exercice 11 : La fonction plot(x,y) trace un graphique à l’aide des points dont les valeurs
(x, y) se trouvent dans les vecteurs x et y. Pour expérimenter cela, initialisez la variable x avec la
suite des 100 valeurs equidistantes situées entre −π et π en utilisant la commande linspace. Tracez
ensuite le graphique correspondant à la fonction y = sin(x).
?? Exercice 12 : Changez la couleur de la courbe en bleu en utilisant le troisième argument de
la fonction plot. Ajoutez un titre, une légende et des noms aux axes à l’aide des commandes title,
legend, xlabel et ylabel.
?? Exercice 13 : Modifiez l’échelle des axes à l’aide de la commande axis. Cette commande
admet 1 argument qui permet de préciser les valeurs de début et de fin des axes X et Y à l’aide d’un
vecteur de 4 valeurs du type : [x min x max y min y max].
?? Exercice 14 : Ajoutez une grille à l’aide de la commande grid.
?? Exercice 15 : Ajoutez une seconde fonction y = 2∗sin(x/3) sur le même graphique en utilisant
la commande hold (options ’on’ et ’off’). N’oubliez pas de changer la couleur de la courbe pour bien la
différencier de la première. Une alternative est de faire afficher toutes les courbes à l’aide de la même
commande plot : plot(x1,y1,opt1,x2,y2,opt2).
?? Exercice 16 :
En utilisant la commande plot, l’objectif de cet exercice est de reproduire les deux graphiques vus
en cours suivants :
Pour cela, vous suivrez les étapes suivantes :
1. Générez un vecteur de 16 valeurs comprises entre le 1er avril 2005 et le 3 avril 2005. Pour cela,
vous utiliserez la commande datenum qui retourne le numéro d’un jour étant donné sa date
(chaı̂ne de caractères au format ’JJ-MMM-AAAA’). Générez ensuite un vecteur de même taille
comprenant 16 valeurs aléatoires comprises entre 0 et 10 (cf. commande rand).
2. Tracez le graphique à l’aide de la commande plot.
3. Ajoutez un quadrillage pointillé.
4. Changez l’étiquetage de l’axe des abscisses à l’aide de la commande set(gca,’Xtick’,valeurs).
Le paramètre valeurs est un vecteur comportant les valeurs correspondant aux trois dates qui
nous intéressent.
5. Remplacez les valeurs numériques de l’axe des abscisses par les chaı̂nes de caractères correspondantes en utilisant la commande set(gca,’XtickLabel’,noms). Le paramètre nom est un
vecteur contenant les chaı̂nes de caractères à afficher. Pour calculer les chaı̂nes de caractères de
date correspondant à une valeur numérique, il faut utiliser la commande datestr.
6. Changez l’étiquetage de l’axe des ordonnées pour obtenir celui demandé.
?? Exercice 17 : Soit une population d’individus dont l’âge est recensé ci-dessous :
individu
âge
1
20
2
19
3
65
4
57
5
30
6
27
7
30
8
28
9
40
10
42
11
18
12
21
13
45
14
26
1. En utilisant la commande hist, représentez cette population sur un histogramme à dix graduations. Attention : il ne s’agit plus d’une courbe comme celle tracée précédemment avec plot,
il ne faut donc pas utiliser les valeurs servant à numéroter les individus.
3
2. Calculez ensuite, toujours à l’aide de la commande hist une nouvelle représentation centrée sur
les trois valeurs suivante : 18, 30 et 50.
3. Séparez à présent les hommes des femmes (les hommes sont représentés par les nombre impairs)
et représentez les deux distributions l’une au-dessus, l’autre au-dessous (commande subplot).
Attention, vous devez calculer la séparation de manière automatique avec Octave (et non pas
recopier les valeurs à la main). Que constatez-vous ? N’hésitez pas à changer la signification des
l’axe des abscisses.
4. Calculez ensuite les statistiques habituelles : moyenne, écart-type, etc.
Premier script
?? Exercice 18 : On considère la matrice

2
 −1


An = 


tridiagonale d’ordre n définie par :

−1

2 −1


..
..
..

.
.
.

−1 2 −1 
−1 2
1. Que fait la séquence d’instruction suivante ?
S = [eye(n) zeros(n,1)];
S = S(:,2 : n+1);
A = 2*eye(n) - S - S’
2. Même question avec la séquence d’instructions :
D = diag(ones(n,1));
SD = diag(ones(n-1,1), 1);
A = 2*D - SD - SD’;
?? Exercice 19 : En général, il est recommandé de sauvegarder dans un fichier une suite d’instructions que l’on veut utiliser plusieurs fois. Ce fichier, dont le suffixe est en ‘.m’, est ce que l’on
appelle un script. Pour illustrer cela, suivez les étapes suivantes :
1. Créez un fichier “sol.m” à l’aide de l’éditeur de votre choix (par exemple WordPad) et placez-le
dans le répertoire où se trouve Octave. Attention à bien vérifier que l’extension est ‘.m’ et non
pas ‘.m.txt’ !
2. Une fois ce fichier vide créé, placez-y la séquence d’instructions écrites à l’exercice précédente,
c’est-à-dire la création de An pour n quelconque.
3. Placez-vous dans l’interpréteur Octave, donnez une valeur pour n et exécutez le script en utilisant
la commande source("sol.m"). Vérifiez que tout a bien fonctionné en testant la valeur de A.
4. Modifiez votre script pour mesurez le temps de calcul du script à l’aide de la commande cputime.
Vous placerez ce temps de calcul dans une valeur temps.
5. Exécutez votre script une nouvelle fois pour différentes valeurs de n. Affichez à chaque fois le
temps de calcul en utilisant les commandes printf et num2str.
Polynômes
?? Exercice 20 : Soit le tableau de valeurs suivant :
x
y
0
-.447
0.1
1.978
0.2
3.28
0.3
6.16
0.4
7.08
0.5
7.34
0.6
7.66
0.7
9.56
0.8
9.48
0.9
9.3
1
11.2
1. Représentez cette population de points à l’aide d’un graphique (commande plot).
4
2. Trouvez le polynôme de degré 2 le plus proche de ces points (commande polyfit). A partir du
résultat sorti par Octave, quel est l’écriture standard de ce polynôme ?
3. Représentez la courbe correspondant à ce polynôme sur le même graphique. Pour cela, vous
aurez besoin des commandes linspace et polyval.
?? Exercice 21 : Calculez la dérivée du polynôme que vous avez trouvé à l’exercice précédent sur
les points (x ;y). Vous utiliserez la commande polyderiv.
Les fonctions dans Octave
Comme n’importe quel autre langage de programmation, Octave offre une prise en charge complète
pour créer des fonctions. Les fonctions sont un outil essentiel qui permet de fractionner de gros
problèmes en un certain nombre de petites tâches. Une fonction doit effectuer une tâche spécifique et
doit l’exécuter correctement. Ces critères sont très importants. Plus la tâche qu’une fonction exécute
est spécifique, plus elle sera réutilisable ; bien que vous puissiez l’écrire pour vous aider à résoudre votre
problème actuel, si elle est bien définie, vous pourrez vous en servir dans de nombreux problèmes futurs. Par “exécuter correctement”, j’entends que la fonction devra donner la réponse correcte à une
entrée valide tout en signalant une erreur en cas d’entrée invalide ; ce devrait être un véritable “boı̂te
noire”. Une fois écrite et testée, elle devra être de qualité suffisante pour que vous puissiez lui faire
confiance sans avoir à la revérifier dans tous vos problèmes futurs.
?? Exercice 22 : Une fonction mathématique extrêmement simple qui fait défaut à Octave est la
fonction factorielle. Elle est définie ainsi :
n! = n × (n − 1)...2 × 1
Commencez par écrire une fonction appelée factor1 dont le code se trouvera dans le fichier factor1.m.
Vous placerez ce fichier dans le répertoire courant (celui où vous avez lancé Octave) et vous l’éditerez
avec n’importe quel éditeur de texte (NotePad sous Windows, xemacs sous Linux, etc.). Voici le code
de la fonction en langage algorithmique :
Fonction factor1 ( n : entier naturel ) : entier naturel
Début
reponse := 1
Pour i:=1 à n faire
reponse := response * i
FinPour
factor1 := reponse
Fin
Attention, il faut que vous utilisiez la syntaxe d’Octave. Pour mémoire, voilà la syntaxe général
d’écriture d’une fonction sous Octave :
function [retval1, retval2, etc] = name( arg1, arg2, etc )
body
endfunction
?? Exercice 23 : Testez votre nouvelle fonction dans l’interpréteur d’Octave.
?? Exercice 24 : Il y a deux règles supplémentaires dans la définition mathématique de la fonction
factorielle :
0! = 1
n≥0
Ecrivez une nouvelle fonction factor2 dans le fichier factor2.m afin de prendre en compte ces nouvelles informations. Vous utiliserez la structure de test if... elseif... endif et la commande
5
error afin de déclencher un message d’erreur lorsque le paramètre d’entrée n’est pas correct. Que
constatez-vous lorsque vous testez votre fonction avec une valeur négative ?
?? Exercice 25 : Que se passe-t-il si votre fonction factor2 est appelée sans arguments ? Afin de
résoudre le problème soulevé, écrivez une nouvelle fonction factor3 dans un nouveau fichier factor3.m
dans laquelle vous utiliserez les commandes nargin et usage.
?? Exercice 26 : Même question mais en utilisant la commande prod afin d’éviter le recours à la
boucle for. Vous appelerez votre fonction factor5.
?? Exercice 27 : Ajoutez un copyright au début de factor5 afin de permettre l’affichage d’un
texte d’aide lors de l’utilisation de help.
?? Exercice 28 : Ecrivez une nouvelle fonction appelée factor6 pour calculer le factoriel, mais
cette fois de manière récursive. Vous ne devez donc pas utiliser de for ni de prod, mais faire appel à
la fonction à l’intérieur même de celle-ci.
?? Exercice 29 : Pour tester l’efficacité des différentes fonctions écrites calculant le factoriel,
rédigez un script Octave qui demande à l’utilisateur le paramètre n d’entrée. Pour cela, vous ferez
appel à la commande cputime (vue précédemment) ou alors aux commandes tic et toc, ainsi qu’à la
commande input qui demande à l’utilisateur d’entrer une valeur au clavier.
Structures de contrôle
Pour chacun des exercices de cette partie, vous prendrez soin de rédiger le code en langage algorithmique avant de vous lancer en Octave.
?? Exercice 30 : Ecrivez la fonction qui calcule le plus grand de 3 nombres.
?? Exercice 31 : Une équation itérative pour résoudre l’équation x2 − x − 1 = 0 est donnée par :
xr+1 = 1 +
1
pour r = 0, 1, 2 . . .
xr
Etant donné que x0 vaut 2, écrire un script Octave pour résoudre l’équation. Une précision suffisante
est obtenue quand :
abs(xr+1 − xr ) < 0.0005
Inclure une vérification dans la réponse.
?? Exercice 32 : Ecrivez une fonction fibo qui prend comme argument un entier naturel n et
qui calcule les n premiers termes de la suite de Fibonacci. Cette suite F (n) est définie comme suit :
F (n) = F (n − 1) + F (n − 2), avec F (1) = F (2) = 1
Exercices supplémentaires
?? Exercice 33 : L’exercice suivant vous donne l’occasion d’effectuer des manipulations de matrice :
1. Définissez A une matrice 3x3
2. Mettez à zéro l’élément (3,3)
3. changez la valeur de l’élément dans la 2ème ligne, 6ème colonne, que se passe-t-il ?
4. Mettez tous les éléments de la 4ème colonne à 4
5. Créez B en prenant les lignes de A en sens inverse
6. Créer C en accolant toutes les lignes de la première et troisième colonne de B à la droite de A
7. Créer D sous-matrice de A faite des deux premières lignes et les deux dernières colonnes de A.
Trouvez aussi une manière de faire qui ne dépende pas de la taille de A. Note : chacun de ces
exercices se fait en une seule instruction, sans boucles itératives.
6
?? Exercice 34 : Soit la matrice :


1 2 3
An =  4 5 6 
7 8 9
Testez les fonctions fournies flipud, fliplr, rot90, reshape, diag, triu, tril, en indiquant à chaque fois
l’opération qui a été réalisée.
?? Exercice 35 : Sans utiliser de boucles d’itération (voir le cours sur les structures de contrôle),
ajoutez aux éléments d’une matrice l’indice de leur colonne.
?? Exercice 36 : Trouvez le plus grand élément dans un vecteur de nombres. Pour cela, vous
écrirez une fonction “index of max” qui retourne l’index de l’élément le plus grand d’un vecteur.
?? Exercice 37 : Ecrivez la fonction qui calcule le plus petit élément d’un vecteur de nombres.
?? Exercice 38 : Ecrivez la fonction qui calcule la somme des éléments d’un vecteur.
?? Exercice 39 : Ecrivez la fonction qui calcule le produit des éléments d’un vecteur, en omettant
toutefois le kième élément.
?? Exercice 40 : Ecrivez la fonction qui calcule la moyenne des éléments d’un vecteur.
?? Exercice 41 : Sur un ensemble de notes entre 0 et 20,
1. écrivez la fonction qui calcule le nombre de notes supérieures ou égales à 10,
2. écrivez la fonction qui calcule le nombre de notes supérieures à la moyenne des notes.
?? Exercice 42 : Ecrivez la fonction qui calcule la somme des éléments des colonnes d’une matrice.
?? Exercice 43 : Etant donné une matrice A4x5 , écrivez un script pour trouver les sommes de
chacune des colonnes en utilisant :
1. La commande for
2. La fonction sum
?? Exercice 44 : Ecrivez une fonction qui retourne 1 si une matrice donnée en entrée est antisymétrique et 0 sinon.
?? Exercice 45 : Ecrivez une fonction qui renvoie 1 si la matrice symétrique An×n qui lui est
passée en paramètre est définie positive et 0 sinon. Vous pouvez tester votre fonction sur la matrice
définie positive suivante :


3 2 1
A= 2 2 1 
1 1 1
?? Exercice 46 : Ecrivez une fonction monsort qui prend un vecteur de nombres réels comme
argument et qui renvoie, comme résultat, ce même vecteur avec les éléments triés par ordre croissant.
Pour cela, vous utiliserez l’algorithme de votre choix (tri à bulles, tri fusion, etc.). Comparez votre
programme (résultats et performances) avec la fonction sort d’Octave.
?? Exercice 47 : Dans un script pluspetitnombre.m, utilisez la structure while pour évaluer le
plus petit nombre tel que, ajouté à 1, on obtient un nombre supérieur à 1.
Fonctions à plusieurs paramètres
?? Exercice 48 : Ecrivez la fonction qui génère une matrice dont les coefficients le long de la
diagonale principale valent d et dont les coefficients au-dessus et au-dessous de la diagonale principale
valent c, le reste de la matrice étant constitué de zéros. Le script devra donner des indications claires
sur le format des données (c et d) et afficher le résultat avec une en-tête convenable.
?? Exercice 49 : Ecrivez la fonction qui résout l’équation suivante :
ax2 + bx + c = 0
7
La fonction utilisera trois paramètres en entrée a, b et c et renverra comme résultat les valeurs des
deux racines.
?? Exercice 50 : Ecrivez une fonction qui résout un système d’équations linéaires en utilisant la
méthode de Cramer. Vous pouvez utiliser la fonction det() qui calcule le déterminant de la matrice
qui lui est passée en paramètre. Testez votre fonction sur le système Ax = b où :


 
1 2 3
1
A =  0 5 6 ,b =  2 
5 6 7
3
?? Exercice 51 : Il peut être prouvé que la série (I − A)−1 = I + A + A2 + A3 + . . ., où A est
une matrice n × n, converge si les valeurs propres de A sont plus petites que l’unité. La matrice n × n
suivante satisfait cette condition si a + 2b < 1 :


a b 0 ... 0 0 0
 b a b ... 0 0 0 


 .. .. ..
.. .. .. 
 . . .
. . . 


 0 0 0 ... b a b 
0 0 0 ... 0 b a
Expérimentez avec cette matrice pour différentes valeurs de n, a et b pour illustrer que les séries
convergent sous les conditions annoncées.
Manipulation de textes et de fichiers
?? Exercice 52 : Ecrivez la fonction qui compte le nombre de mots de 2 lettres dans un texte
entré en argument.
?? Exercice 53 : Ecrivez une fonction [y] = compare(x,y) qui prend 2 chaı̂nes de caractères
comme arguments et renvoie 1 si x est avant y dans l’ordre lexicographique, et 0 sinon.
?? Exercice 54 : Ecrivez la fonction qui compte le nombre de lignes dans un fichier (excepté les
commentaires).
?? Exercice 55 : Ecrivez la fonction qui affiche les lignes de commentaires qui se trouvent dans
l’entête d’un fichier.
?? Exercice 56 : Ecrivez la fonction qui recherche la première occurrence d’une lettre dans une
chaı̂ne de caractères et retourne sa position dans le texte.
?? Exercice 57 : Reprenez l’exercice 56. Ecrivez la fonction qui affiche un message d’erreur qui
stoppe l’exécution du programme si le texte ou la lettre saisis sont vides.
?? Exercice 58 : Reprenez l’exercice 56. Ecrivez la fonction qui affiche un message d’avertissement
et demande à l’utilisateur de saisir le texte et la lettre jusqu’à ce qu’ils ne soient plus vides.
?? Exercice 59 : Reprenez l’exercice 56. Ecrivez la fonction qui affiche un message d’avertissement
et demande à l’utilisateur de saisir le texte et la lettre jusqu’à ce qu’ils ne soient plus vides. Faire une
pause de 5 secondes entre la saisie du texte et la saisie de la lettre. Demandez à l’utilisateur de taper
une touche du clavier pour afficher la position de la lettre.
8