Matlab tp4 - analyse numérique avec matlab - télécharger pdf

Ce document présente le quatrième Travaux Pratiques (TP) de Matlab, élaboré pour les étudiants universitaires des filières de mathématiques et d'informatique. Il vise à approfondir la maîtrise de l'environnement Matlab à travers des exercices pratiques variés.

Ce TP couvre les notions suivantes :

  • La création et l'analyse de fonctions Matlab.
  • La résolution d'équations et la manipulation de coordonnées.
  • La gestion de matrices et de chaînes de caractères.
  • L'utilisation des boucles (for, while) et la mesure de performance d'exécution.
  • Les opérations de lecture/écriture de fichiers.
Matlab tp4 - analyse numérique avec matlab - télécharger pdf

Travaux Pratiques 4 : Introduction à la Programmation Matlab

Ce document présente une série d'exercices pratiques (TP n°4) conçus pour explorer les fonctionnalités de programmation de Matlab, allant de la création de fonctions simples à la manipulation de matrices et de chaînes de caractères, en passant par l'analyse des performances d'exécution. Ces exercices sont essentiels pour tout utilisateur souhaitant approfondir ses compétences en calcul numérique et en scripting avec Matlab.

Exercice 1 : Programmation et Interprétation de Fonctions Matlab

Programmez les fonctions suivantes sous Matlab et indiquez ce qu'elles réalisent. Ces fonctions illustrent des concepts de base en manipulation de vecteurs et de matrices.

Fonction ps1(U,V)

Cette fonction calcule le produit scalaire (ou produit interne) de deux vecteurs U et V. Si U est un vecteur ligne et V est un vecteur ligne, alors V' est un vecteur colonne. L'opération U * V' effectue donc le produit scalaire standard, renvoyant un scalaire.

function r = ps1(U,V)
r = U * V' ;
end

Fonction ps2(U,V)

Cette fonction calcule également le produit scalaire de deux vecteurs U et V, mais de manière itérative. Elle somme les produits des éléments correspondants de chaque vecteur. Cette approche est équivalente à sum(U .* V) ou à la fonction ps1 pour des vecteurs lignes de même taille.

function r = ps2(U,V)
n = size(U,2);
r = 0. ;
for i = 1:n,
r = r + U(i) * V(i);
end
end

Fonction insere(X,a)

Cette fonction vise à créer une nouvelle matrice Y en insérant la matrice X dans une plus grande structure remplie de la valeur a. L'initialisation Y=a*ones(1,2*n); crée une matrice d'une seule ligne et 2n colonnes. Si X a plus d'une ligne (m > 1), l'affectation Y(2 : 1+m , n+1 : end) = X; causera une erreur de dimension car Y n'a qu'une seule ligne. L'intention probable est de créer une matrice Y de taille m lignes et 2n colonnes, puis d'insérer X dans une partie spécifique de Y, par exemple Y = a*ones(m, 2*n); Y(1:m, n+1:end) = X;.

function Y=insere(X,a)
[m,n] = size(X);
% Note: Si m > 1, l'initialisation de Y comme une matrice ligne (1, 2*n)
% et l'assignation subséquente à Y(2 : 1+m , n+1 : end) = X;
% provoqueront une erreur de dimension. L'initialisation devrait
% probablement être Y=a*ones(m,2*n); pour accueillir X.
Y=a*ones(1,2*n);
Y(2 : 1+m , n+1 : end) = X;
end

Exercice 2 : Résolution d'une Équation du Second Degré

Écrivez une fonction Matlab permettant de résoudre une équation du second degré de la forme ax² + bx + c = 0. La fonction doit prendre en entrée les coefficients a, b, c et renvoyer les solutions, qu'elles soient réelles ou complexes.

La résolution repose sur le calcul du discriminant Δ = b² - 4ac. Le signe de Δ détermine la nature des racines : deux racines réelles distinctes si Δ > 0, une racine réelle double si Δ = 0, et deux racines complexes conjuguées si Δ < 0.

Exercice 3 : Conversion de Coordonnées Cartésiennes en Polaires

Écrivez une fonction Matlab qui reçoit en entrée les coordonnées cartésiennes (x,y) d'un point et qui obtient en sortie ses coordonnées polaires : le rayon r et l'argument θ. Le rayon est calculé par la formule r = √(x² + y²) et l'argument par θ = atan2(y,x). L'utilisation de atan2(y,x) est recommandée car elle gère correctement les angles sur les quatre quadrants, contrairement à atan(y/x).

Exercice 4 : Calcul du Développement Limité du Sinus avec Précision

Écrivez une fonction Matlab permettant de calculer le développement limité de sin(x) avec une précision ε (epsilon), en utilisant une boucle while. La série de Taylor pour sin(x) est donnée par :

sin(x) = x - x³/3! + x⁵/5! - x⁷/7! + x⁹/9! + ...

Le calcul doit s'arrêter lorsque la valeur absolue du terme courant de la série devient inférieure à la précision ε spécifiée en paramètre.

Indication : Dans le cas de sin(x), quelle que soit la précision ε, il existe un entier n tel que le terme suivant de la série, |xⁿ⁺¹ / (n+1)!|, est inférieur à ε. Cette propriété garantit que la série converge et qu'une précision peut être atteinte.

Exercice 5 : Ajout de Zéros Spécifiques à une Matrice

Écrivez une fonction Matlab, Z = put0(X,Y), qui permet de modifier la matrice X en mettant à zéro les éléments aux positions spécifiées par la matrice Y. La matrice Y est une matrice à 2 lignes où chaque colonne (y₁ⱼ, y₂ⱼ) indique respectivement le numéro de ligne et de colonne de la matrice X à mettre à zéro. La fonction doit retourner la matrice X modifiée.

Exercice 6 : Mesure du Temps d'Exécution avec tic et toc

Les commandes Matlab tic et toc permettent de calculer le temps d'exécution des instructions qu'elles englobent. tic démarre un chronomètre et toc l'arrête, affichant la durée en secondes. Saisissez le script suivant pour observer leur fonctionnement.

tic % Démarrage du chronomètre
a = (1:5)' ;
D = [];
for i = 1:5
    D = [D, i*a];
end
disp(D) % Afficher la matrice D
plot(D,'-o') % Tracer la matrice D
toc % Arrêt du chronomètre

Ce script calcule et affiche une matrice D, la trace graphiquement, et mesure le temps total d'exécution de ces opérations.

Exercice 7 : Calcul du Factoriel par Différentes Méthodes et Comparaison des Performances

Écrivez un script Matlab où vous définissez le vecteur N = [1, 3, 5, ..., 11] (si on suit l'exemple dans le corrigé ci-dessous, N = [0, 2, ..., 12]). Ensuite, calculez la factorielle (le produit 1 × 2 × ... × k pour un entier k) de chacun des éléments de N à l'aide de trois méthodes distinctes :

  1. En utilisant la fonction intégrée factorial de Matlab.
  2. En utilisant une boucle for.
  3. En utilisant une boucle while.

À l'aide des fonctions tic et toc, calculez les temps d'exécution de chacune de ces méthodes pour chaque élément de N. Enfin, comparez ces temps dans un même graphique pour analyser l'efficacité relative des trois approches.

Exercice 8 : Manipulation de Chaînes de Caractères Avancée

Saisissez le script Matlab suivant, puis expliquez l'utilité de chaque commande de manipulation de chaînes de caractères utilisée. Cet exercice couvre des fonctions essentielles pour le traitement de texte en Matlab.

s = 'hello'
name = upper(s) % Convertit la chaîne de caractères 's' en majuscules.
fun = strrep('hahaha','a','i') % Remplace toutes les occurrences de la lettre 'a' par 'i' dans la chaîne.
greet = 'Welcome';
where = 'to Joan''s'; % Définition d'une chaîne avec une apostrophe échappée.
party = 'birthday party';
final = str2mat(greet, where, party) % Construit une matrice de chaînes de caractères où chaque variable devient une ligne.
text = 'Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday';
[day,rest] = strtok(text,',') % Extrait le premier "jeton" (mot) avant le délimiteur ',', et le reste de la chaîne.
[day2,rest] = strtok(rest,',') % Extrait le jeton suivant du reste de la chaîne précédente.

Ce script illustre des fonctions clés telles que upper pour la casse, strrep pour le remplacement, str2mat pour la structuration de chaînes, et strtok pour le découpage de chaînes.

Exercice 9 : Opérations Diagonales sur les Matrices avec diag

Cet exercice se concentre sur l'utilisation de la fonction diag de Matlab, qui permet soit d'extraire des diagonales d'une matrice, soit de construire une matrice diagonale à partir d'un vecteur.

Dans un premier script, data1.m, définissez la matrice A et le vecteur x suivants :

A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]
x = [-5 -10 -15]

Dans un autre script, trait1.m, commencez par appeler data1.m pour charger les variables A et x dans l'espace de travail. Ensuite, saisissez et exécutez les instructions Matlab suivantes :

D1 = diag(A) % Extrait la diagonale principale de la matrice A sous forme de vecteur colonne.
D2 = diag(diag(A)) % Crée une matrice diagonale à partir du vecteur extrait par diag(A).
DX = diag(x) % Crée une matrice diagonale dont les éléments de x sont sur la diagonale principale.
D3 = diag(A,2) % Extrait la diagonale située 2 positions au-dessus de la diagonale principale de A.
D4 = diag(diag(A,2)) % Crée une matrice diagonale à partir du vecteur D3.
D5 = diag(diag(A,2),2) % Crée une matrice diagonale en plaçant les éléments de D3 sur la 2ème diagonale supérieure.

Chaque instruction démontre une facette de la fonction diag, essentielle pour la manipulation de structures matricielles spécifiques.

Exercice 10 : Fonction de Lecture Pagée de Fichiers (afic)

Rédigez la fonction suivante dans l'éditeur de Matlab. Son utilité est d'afficher le contenu d'un fichier texte ligne par ligne, en marquant une pause toutes les nblignes pour permettre une lecture paginée.

Les commandes utilisées dans cette fonction sont cruciales pour la gestion des fichiers en Matlab :

  • nargin : permet de connaître le nombre d'arguments d'entrée avec lesquels la fonction a été appelée.
  • fopen(nomfic,'r') : ouvre le fichier spécifié par nomfic en mode lecture ('r'). Si l'ouverture échoue, elle retourne -1.
  • feof(fic_id) : retourne vrai (1) si la fin du fichier, identifié par fic_id, a été atteinte.
  • fgetl(fic_id) : lit une ligne entière du fichier et la retourne sous forme de chaîne de caractères, en excluant le caractère de fin de ligne.
  • rem(compt, nblignes) : calcule le reste de la division de compt (compteur de lignes) par nblignes. Cela sert à déterminer quand une pause doit être effectuée.
  • pause : suspend l'exécution du programme jusqu'à ce qu'une touche soit enfoncée, offrant un contrôle utilisateur sur la lecture.
  • disp(ligne) : affiche la chaîne de caractères ligne dans la fenêtre de commande Matlab.
  • fclose(fic_id) : ferme le fichier ouvert, libérant ainsi les ressources associées.
function afic(nomfic, nblignes)
if nargin == 1
    nblignes = 20; % Définit un nombre de lignes par défaut si non spécifié
end
fic_id = fopen(nomfic,'r');
if fic_id == -1 % Vérification de l'ouverture du fichier
    error('Impossible d''ouvrir le fichier %s', nomfic);
end
compt = 0;
while ~feof(fic_id)
    ligne = fgetl(fic_id);
    if ischar(ligne) % S'assurer que fgetl a bien retourné une ligne (pas -1 à la fin du fichier)
        compt = compt + 1 ;
        if rem(compt, nblignes) == 0
            disp(ligne); % Afficher la ligne avant la pause
            pause; % Attendre l'utilisateur pour continuer
        else
            disp(ligne);
        end
    end
end
fclose(fic_id)
end

Pour voir comment cette fonction opère, testez-la dans la fenêtre de commande de Matlab avec un fichier texte existant, par exemple : >> afic('afic.m', 3).

Corrigé de l'Exercice 7 : Calcul du Factoriel

Voici un script fact.m possible pour répondre à l'exercice 7, illustrant le calcul de la factorielle par trois méthodes différentes et comparant leurs temps d'exécution.

% Calcul du factoriel par 3 méthodes
N = 0 : 2 :12; % Définition du vecteur N (éléments pairs de 0 à 12)
n = size(N,2);
RES = zeros(3,n); % Matrice pour stocker les résultats des factorielles
TE = zeros(3,n); % Matrice pour stocker les temps d'exécution pour chaque méthode

% 1) À l'aide de la fonction built-in "factorial" de Matlab
for k = 1: n
    tic % Démarre le chronomètre
    RES(1,k) = factorial(N(k)); % Calcule la factorielle
    TE(1,k) = toc; % Arrête le chronomètre et enregistre le temps
end

% 2) À l'aide de la boucle for
for k = 1:n
    tic
    RES(2,k) = 1; % Initialisation pour la factorielle
    for i = 1 : N(k) % Boucle pour le calcul itératif
        RES(2,k) = RES(2,k) * i;
    end
    TE(2,k) = toc;
end

% 3) À l'aide de la boucle while
for k=1:n
    tic
    RES(3,k) = 1; % Initialisation pour la factorielle
    i = 2; % Commence à 2 car 1! = 1
    while i <= N(k) % Boucle tant que i est inférieur ou égal à N(k)
        RES(3,k) = RES(3,k) * i;
        i = i + 1;
    end
    TE(3,k) = toc;
end

format long % Affiche les nombres avec plus de décimales
disp('Résultats obtenus par les 3 méthodes : ')
disp(RES) % Affiche la matrice des résultats
disp('Comparaison des temps d''exécution :')
disp(TE) % Affiche la matrice des temps d'exécution

% Traçage des temps d'exécution
plot(N, TE') % Trace les temps en fonction des valeurs de N
title('Comparaison des temps d''exécution')
xlabel('Valeur de N')
ylabel('Temps d''exécution en seconde')
legend('factorial','for','while') % Légende pour identifier les méthodes
grid on % Ajoute une grille au graphique

Ce script démontre que la fonction intégrée factorial est significativement plus rapide que les implémentations manuelles via des boucles for ou while, surtout pour des valeurs de N plus élevées. Le graphique offre une visualisation claire de cette différence de performance.

Foire Aux Questions (FAQ)

Qu'est-ce qu'une fonction built-in (intégrée) dans Matlab et pourquoi est-elle souvent préférable ?

Une fonction built-in (ou intégrée) dans Matlab est une fonction précompilée qui fait partie du langage de base, optimisée pour des performances élevées. Ces fonctions sont généralement implémentées dans des langages de bas niveau (comme le C ou le Fortran), ce qui les rend beaucoup plus rapides que des fonctions écrites directement en code Matlab. Il est préférable de les utiliser chaque fois que possible pour des raisons d'efficacité, de fiabilité et de concision du code.

Pourquoi mesurer les temps d'exécution du code est-il important en programmation ?

Mesurer les temps d'exécution, un processus souvent appelé profilage, est crucial pour identifier les goulots d'étranglement de performance dans un programme. Cela permet aux développeurs de cibler et d'optimiser les sections de code qui consomment le plus de temps de calcul. Une meilleure performance est essentielle pour réduire les délais de traitement, améliorer la réactivité des applications, et permettre la gestion efficace de problèmes complexes ou de grands ensembles de données.

Comment la fonction atan2 est-elle différente de atan pour la conversion en coordonnées polaires ?

La fonction atan(y/x) calcule l'arctangente et renvoie un angle dans l'intervalle (-π/2, π/2). Elle ne peut pas distinguer les points dans les quadrants opposés (par exemple, (x,y) et (-x,-y)) car le rapport y/x serait le même. En revanche, atan2(y,x) prend les coordonnées y et x séparément et retourne un angle dans l'intervalle (-π, π]. Cette distinction est cruciale car atan2 gère correctement tous les quatre quadrants, assurant une détermination unique et correcte de l'angle quel que soit le positionnement du point dans le plan cartésien.

Cela peut vous intéresser :

Partagez vos remarques, questions , propositions d'amélioration ou d'autres cours à ajouter dans notre site

Enregistrer un commentaire (0)
Plus récente Plus ancienne