• Aucun résultat trouvé

TP 3 : Programmation et algorithmique en langage Matlab

N/A
N/A
Protected

Academic year: 2022

Partager "TP 3 : Programmation et algorithmique en langage Matlab"

Copied!
8
0
0

Texte intégral

(1)

I.N.S.S.E.T. – Université de Picardie Licence Maths et SPI – 2ème année

Programmation avec Matlab M. Marcoux

TP 3 : Programmation et algorithmique en langage Matlab

1. Introduction

Ce TP illustre et propose de mettre en œuvre les principales syntaxes de programmation algorithmique utilisables sous Matlab.

Il présente aussi les opérateurs relationnels permettant d’effectuer des tests conditionnels.

Les structures conditionnelles et itératives sont présentées par l’intermédiaire d’algorithmes simples.

L’ensemble des scripts d’exemples et d’applications réalisés au cours du TP devront être commentés de manière abondante.

2. Structures conditionnelles

Il existe deux structures possibles permettant de réaliser des tests sur les données.

• La structure if permet de tester la valeur d’une variable et d’effectuer différents traitements suivant les cas testés.

• La structure switch permet de choisir entre différents cas, et de faire correspondre un traitement adapté à chacun des cas reconnus

a) Structure if … else … end

La structure if est indispensable à la programmation. Elle est présente dans tous les langages, mais utilise des syntaxes un peu différentes.

En langage Matlab, elle est déclarée de la manière suivante :

(2)

If condition 1 Commandes Elseif condition 2 Commandes Elseif condition 3 Commandes

:

else

Commandes end

Seul le if … end est obligatoire.

Else et elseif sont facultatifs et permettent d’effectuer des tests supplémentaires.

Le script suivant vous donne un exemple d’utilisation de la fonction if sous Matlab.

Tapez ce script dans un fichier "encadre.m" et testez les différents cas possibles.

% Exemple d’utilisation de if, elseif, … end nb = input(‘Rentrez un nombre : ‘) ;

if (nb < 100)

disp(‘votre nombre est < 100’) elseif (nb == 100)

disp(‘Votre nombre est 100’) else

disp(‘votre nombre est > 100’) ; end

Ø Modifiez ensuite ce script pour qu’il indique en plus si le nombre est compris entre 100 et 200.

Remarque : Lorsqu’un test est effectué en bloc sur un vecteur, il suffit qu’une valeur ne vérifie pas le test pour que la condition ne soit pas vérifiée.

Essayez et commentez l’exemple ci-dessous

>> a = zeros(1,10) ;

>> if a == 0, a(5) = 1, end

???

>> if a == 0,a(5) = 0, end

???

b) Structure Switch … case … end

La deuxième structure permet le choix entre différents cas. Le seul test effectué dans cette structure est donc un test d’égalité.

(3)

Cette structure est déclarée par :

Switch variable_testée

Case choix 1 (valeur prise par variable-testée) Commandes

Case choix 2 Commandes Case choix 3 Commandes :

otherwise

Commandes end

Le test d’égalité est donc effectué par la fonction par rapport à chaque cas (case).

Otherwise est une alternative lorsque la variable testée n’a pas d’égaux parmis les différents cas.

Le script suivant vous donne un exemple d’utilisation de la fonction switch sous Matlab.

Tapez ce script dans le fichier "semaine.m" et testez les différents cas possibles.

% Un exemple d’utilisation de switch

jour = input('Quel jour sommes nous ? ', ' s ' ) ; switch jour

case ' lundi ' jr = 5;

case ' mardi ' jr = 4;

case ' mercredi ' jr = 3;

case ' jeudi ' jr = 2;

case ' vendredi ' jr = 1;

otherwise jr = 0;

end

disp ([ 'Encore ' num2str(jr) ' jours avant le weekend’ ])

Ø Modifiez ce script pour qu’il indique "c’est le week end" si le jour est samedi ou dimanche et qu’il indique "ce n’est pas un jour de la semaine" si la chaîne rentrée par l’utilisateur ne correspond pas à un jour de la semaine.

c) Applications

1. Ecrivez une fonction intitulée "signe.m" calculant le signe d’un nombre (-1, 0 ou 1 suivant que le nombre est négatif, nul ou positif).

(4)

2. Écrivez un script intitulé "conversion.m" permettant d'effectuer la conversion de Franc vers Euro ou de Euro vers Franc (rappel : 1 euro = 6.55957 francs). Dans un premier temps, le sens de conversion est choisi par l'utilisateur, avant qu'il n’entre le montant (en 2 questions).

3. Structures itératives

Il existe deux grands types de boucles : les boucles de type for dont on connaît le nombre d’itérations et les boucles de type while dont le nombre d’itérations peut évoluer à l’intérieur de la boucle.

a) Structure For … end

La structure for se présente comme suit :

For vecteur des valeurs Commandes

End

Cette structure est à éviter autant que possible sous Matlab car elle est très coûteuse en temps de calcul par rapport au calcul matriciel.

Dans de nombreux cas, il est possible de faire des traitements en blocs, par des opérations sur les matrices, et il n’est pas nécessaire d’utiliser les boucles for.

Les principaux cas où il est nécessaire d’utiliser ces boucles sont :

• La génération de suites récurrentes, dans lesquelles il est nécessaire de connaître un ou plusieurs termes pour calculer le terme suivant

• Le traitement répétitif de données de longueurs différentes qui ne peuvent donc pas être rangée sous forme matricielle

• La demande à l’utilisateur d’un nombre connu de valeurs nécessaires pour la suite du programme

L’utilisation des fonctions tic et toc entre une série de commandes permet de voir le temps mis pour effectuer ces commandes. Ceci permet par exemple de comparer l’efficacité en temps de deux algorithmes différents réalisant la même fonction.

(5)

Testez l’exemple suivant permettant de comparer le temps mis pour la création d’un vecteur de 1000 points, avec et sans boucle for.

% Un exemple de boucle for tic

vect = [] ; for k = 1 :1000 vect(k) = log(k) ; end

toc

% ceci est equivalent à : tic

k = (1:1000);

vect = log(k);

toc

Ø Créez un script intitulé "tri.m" demandant successivement à l’utilisateur 5 valeurs qui seront rangées dans une variable de type vecteur appelée valeurs.

Elles seront demandées lors d’une boucle for, à chaque itération.

Une fois rentrées, ces valeurs seront affichées dans l’ordre croissant.

Le tri des valeurs d’un vecteur peut etre effectué grâce à la fonction sort, dont vous regarderez l’aide.

b) Structure while … end

La structure while se présente comme suit :

While test sur une variable Commandes

End

La boucle continue donc tant que le test renvoie une valeur de 1. Ce test est aussi appelé condition d’arrêt.

La variable de test doit donc être actualisée pendant l’exécution de la boucle afin que celle-ci s’arrête. Elle doit aussi être initialisée avant la première exécution de sorte que le test renvoie 1, et que la boucle soit effectuée au moins une fois.

Il peut aussi arriver volontairement dans le déroulement d’un programme qu’une boucle while ne soit jamais exécutée.

Essayez l’exemple suivant dans un fichier script "confirme.m".

(6)

% Un exemple de boucle while

% (nombre d’itérations inconnu)

% initialisation de la variable du test reponse = 'cekonveutmaipawi' ;

while(strcmp('oui ',reponse)~=1)

reponse = input('voulez vous arreter ?','s') ; end

Ø Modifiez le script précédent pour que la question posée soit "voulez-vous continuer ?" et qu’une réponse autre que "oui" ou "non" entraîne la remarque "je ne comprends pas la réponse" avant de recommencer la boucle.

c) Application

Ø Modifiez le programme de conversion Franc Euro réalisé précédemment pour rentrer le montant et l'unité en une fois, sous forme de chaîne de caractères. Séparez le montant et les unités, pour convertir le montant en chiffre et effectuer les opérations demandées.

Enregistrez ce nouveau script dans un fichier "conversion2.m".

4. Opérateurs relationnels

Les opérateurs relationnels sont utilisés pour effectuer les différents tests nécessaires dans les boucles et structures conditionnelles (help relop).

On distingue les opérateurs logiques des opérateurs arithmétiques :

a) Opérateurs logiques

Ce sont les fonctions OU (OR), notée ' | ' , ET (AND), notée ' & ' , COMPLEMENT (NOT), notée ' xor(a,b) ' qui considèrent tous les nombres comme binaires, prenant la valeur 0 pour les nombres nuls et la valeur 1 pour les autres.

La comparaison est possible entre des matrices de même taille ou par rapport à un scalaire.

Essayez et expliquez les tests suivants :

(7)

>> ~(-3 : 4)

>> xor(~(-1 : 1),(-1 : 1))

>> (eye(3) & 1)

>> (eye(3) | 0)

b) Opérateurs arithmétiques

Ce sont les 6 fonctions de comparaisons entre les nombres :

• Supériorité >, >=, <, <=

• Egalité == et différence ~=

Les tests s’effectuent par rapport aux valeurs des nombres mais le résultat à ces tests prend la valeur 1 quand ce test est vrai et la valeur 0 quand il est faut.

La comparaison est possible entre des matrices de même taille ou par rapport à un scalaire.

Essayez et expliquez le test suivant :

>> (eye(3) == 0)

>> B = (eye(3) ~=1)

>> (1 :10) > 3.5

>> (1 :10) <= 5

>> sqrt(0 :.2 :2) <= (0 :.2 :2).^2

>> (1 :10) > 4 & (1 :10) <=6

5. Autres fonctions

Une fonction très utile de Matlab pour le traitement en bloc des données, c'est-à-dire sans faire de boucle for, est la fonction find qui permet en plus d’effectuer un test sur une matrice ou un vecteur, de récupérer les indices correspondant aux éléments vérifiant le test.

Cette fonction permet alors de traiter en bloc tous les indices de la matrice vérifiant le test, en évitant souvent une boucle for.

Testez et commentez les exemples suivants :

>> a = (1 : 10) ;

>> indices = find(a > 3.5)

>> a(indices) = -a(indices)

>> B = eye(3) ;

>> B = find(B == 0)) = 2

(8)

Cette fonction permet aussi de travailler sur les chaînes de caractères, pour repérer par exemple un caractère spécial ou attendu.

Les fonctions utiles à cette fin sont :

Lower(chaine) qui permet de passer une chaîne contenant des caractères en majuscules en minuscules. La distinction entre majuscules et minuscules est ainsi supprimée.

>> lower(' BlaBLA')

>> chaine = 'BonJouR Les L2' ;

>> indices = find(lower(chaine) == 'l')

>> disp(chaine(1:indices-1))

str2num(chaine) convertit une chaîne de caractères représentant un nombre en ce nombre.

Il faut en effet bien dissocier les chaînes de caractères et ce qu’elles représentent.

Une chaîne de caractères est codée par la valeur ASCII des caractères, c'est-à-dire des entiers entre 0 et 255.

Par exemple :

>> chaine =’1024’

>> chaine + 10 % ceci ajoute 10 à la valeur ASCII de chaque caractère

>> char(chaine + 10) %Affiche les valeurs ASCII en caractères

>> b = str2num(chaine) + 10

6. Application : Ecrêtage

Ø Créez un script "ecretage.m" permettant à l'utilisateur d'entrer une de fréquence et une amplitude pour un sinus.

Ø Générez alors un vecteur de taille (N) contenant le sinus correspondant aux caractéristiques rentrées précédemment sur une période (N est le nombre de points temporels, fixé dans le script à 256).

On désire alors écrêter ce sinus par rapport à un seuil demandé à l'utilisateur (entre 0 et l'amplitude maximale). Cela revient à chercher les valeurs du signal situées en dehors de l'intervalle

[

seuil;+seuil

]

et à les fixer à . ±seuil

Ø Afficher dans une figure, sur deux sous-figures, les signaux originaux et les signaux écrêtés.

Ø Enregistrez la figure obtenue dans une image "ecretage.jpg".

Références

Documents relatifs

A(5,2)=2 ; affecte la valeur 2 à la composante (5,2) de la matrice A, y=x’ ; la transposée de la matrice x est stockée dans la matrice y ; c=a+b ; la somme des matrices a et b

Définition de la fonction mon_abs(x) qui renvoie un vecteur dont les composantes sont les valeurs absolues des composantes d’un vecteur x : stocker les commandes suivantes dans le

Le titre professionnel est accessible par capitalisation de certificats de compétences professionnelles (CCP) ou suite à un parcours de formation et conformément aux

Un nombre de Carmichael est un entier n qui n’est pas premier, mais qui satisfait quand même la conclusion du petit théorème de Fermat4. Dresser la liste de tous les nombres

Ce genre de diffusion affecte les plus grandes genre de diffusion affecte les plus grandes longueurs d'onde et se produit surtout dans les couches inférieures de l'atmosphère où

Si l'on veut tracer des segments de couleurs différentes, il faut d'abord créér la fenêtre graphique à la bonne échelle (type = &#34;n&#34;, force un graphique vide).. Il

­ Lorsque dans le raisonnement pour résoudre le problème, on répète un certain nombre d’opé- rations plusieurs fois mais sur des objets différents, c’est qu’il y a sûrement

simpson1(a,b,e) Calcul d’une valeur approchée de l’intégrale d’une fonction f, définie au préalable dans l’écran Calculs, par la méthode de Simpson, sur