Ce document, destiné aux étudiants de 2ème année LMD Sciences et Technologie de l'Université de Skikda, constitue un guide pratique pour les travaux dirigés (TP) d'Analyse numérique. Il vise à familiariser les apprenants avec les fonctionnalités essentielles de MATLAB pour la résolution de problèmes mathématiques.
Il couvre les notions suivantes :
- La création et la manipulation des fonctions.
- Les opérations fondamentales sur les fonctions, incluant leur évaluation et leur traçage.
- La gestion des polynômes (évaluation, racines, dérivées, intégrales).
- La résolution de systèmes d'équations linéaires.
TP Analyse numérique - Université de Skikda
Niveau : 2ème année LMD Sciences et Technologie
Les fonctions
En informatique, une fonction est une routine (un sous-programme) qui accepte des arguments (des paramètres) et qui renvoie des résultats. En mathématiques, une fonction f est une application qui attribue à chaque valeur x au plus une seule valeur f(x).
1. Création d’une fonction (un sous-programme) dans un M-file
Nous avons vu que Matlab contient un grand nombre de fonctions pré-implémentées comme sin, cos, sqrt, sum, etc. Il est possible de créer nos propres fonctions en programmant leurs comportements dans des fichiers M-files en respectant la syntaxe suivante :
function [r1, r2, ..., rn] = nom_fonction (arg1, arg2, ..., argn) % le corps de la fonction ... r1 = ... % la valeur retournée pour r1 r2 = ... % la valeur retournée pour r2 ... rn = ... % la valeur retournée pour rn end
Les éléments r1 à rn sont les valeurs retournées, et arg1 à argn sont les arguments. Le mot-clé end est facultatif mais recommandé pour une meilleure lisibilité et gestion du code, surtout dans des scripts plus complexes.
Exemple : Calcul de la racine carrée par la méthode de Newton
Écrivez une fonction qui calcule la racine carrée d’un nombre par la méthode de Newton.
Solution :
>> edit
Créez un fichier nommé racine.m avec le contenu suivant :
function [r]=racine(nombre)
r = nombre/2;
for i = 1:10
r = (r + nombre / r) / 2;
end
Ensuite, dans la fenêtre de commande Matlab :
>> x = racine(9)
x =
3
>> x = racine(196)
x =
14
2. Création de fonctions courtes (pour les fonctions mathématiques)
Pour définir une fonction courte, il est possible d’utiliser les fonctions inline et les fonctions anonymes.
Fonctions Inline
La création d’une fonction inline suit la syntaxe suivante :
nom_fonction = inline ('expression mathématique de la fonction')
Ou avec précision des arguments :
nom = inline('expression mathématique de la fonction', 'arg1', 'arg2')
Par exemple, pour définir la fonction : f(x) = 2x³ - 4x² + x - 3, on écrit :
>> f = inline ('2*x^3-4*x^2+x-3','x')
Ou :
>> f = inline ('2*x^3-4*x^2+x-3')
Pour calculer f(3), on écrit :
>> f(3)
ans =
18
Fonctions Anonymes
La création d’une fonction anonyme suit la syntaxe suivante :
nom_fonction = @ (arg1, arg2, ..., argn) expression_de_la_fonction
Par exemple, pour définir la fonction précédente :
>> f = @(x) 2*x^3-4*x^2+x-3;
Pour calculer f(3), on écrit :
>> f(3)
ans =
18
3. Opérations sur les fonctions
Tracé de fonctions avec fplot
La commande fplot(fun, lims) trace le graphe d’une fonction fun (définie par une chaîne de caractères, une fonction inline ou une fonction anonyme) sur l’intervalle [lims(1), lims(2)].
Par exemple, pour représenter f(x) = 1/(1 + x²) sur [-5, 5], on procède ainsi :
>> fun ='1/(1+x^2)'; lims=[-5,5]; fplot(fun,lims);
Ou, plus directement :
>> fplot('1/(1+x^2)',[-5 5]);
Évaluation de fonctions avec feval
Pour évaluer une fonction fun au point x, ou sur un ensemble de points stockés dans le vecteur x, on peut utiliser la commande feval.
Voici un tableau récapitulatif des définitions, évaluations et tracés possibles :
| Définition | Évaluation (Directe) | Tracé (fplot) |
Évaluation (feval) |
|---|---|---|---|
fun=inline('1/(1+x^2)') |
y=fun(x) |
fplot(fun,[-2,2]) |
y=feval(fun,x) |
fun=@(x)[1/(1+x^2)] |
y=fun(x) |
fplot(fun,[-2,2]) |
y=feval(fun,x) |
function y=fun(x) |
y=fun(x) |
fplot('fun',[-2,2]) |
y=feval(@fun,x) |
Calcul des zéros de fonction avec fzero
On peut utiliser la commande fzero(fun, x0) pour calculer un zéro d’une fonction fun au voisinage d’une valeur donnée x0. Le résultat est une valeur approchée du zéro.
En utilisant la commande fzero(fun, [x0 x1]), un zéro est cherché dans l’intervalle d’extrémités x0 et x1, à condition que fun change de signe entre x0 et x1 (théorème des valeurs intermédiaires).
Considérons par exemple la fonction f(x) = x² - 1 + e^x. En regardant son graphe, on voit qu’elle a deux zéros dans [-1, 1]. Pour les calculer, on exécute les commandes suivantes :
>> fun=inline('x^2-1+exp(x)','x') % Définir la fonction fun
>> fplot(fun, [-1 1]) % Dessiner la courbe de la fonction
>> grid % Activer la grille
>> fzero(fun, [-0.8 -0.4]) % On a choisi l’intervalle [-0.8, -0.4]
ans =
-0.7146
Ou bien :
>> fzero(fun, [-0.4 0.2]) % On a choisi l’intervalle [-0.4, 0.2] ans = -1.3473e-017
4. Les polynômes
Les polynômes sont des fonctions de la forme : pn(x) = a0 + a1x + a2x² + ... + anxn.
Évaluation de polynômes avec polyval
La commande polyval permet d’évaluer un polynôme en un ou plusieurs points. Ses arguments en entrée sont un vecteur p et un vecteur x, où les composantes de p sont les coefficients du polynôme rangés en ordre des degrés décroissants, de an à a0, et les composantes de x sont les points où le polynôme est évalué. Le résultat peut être stocké dans un vecteur y en écrivant :
>> y = polyval(p,x)
Par exemple, les valeurs de p(x) = x7 + 3x² - 1, aux points -0.5, 0, 0.5, 1 peuvent être obtenues en procédant ainsi :
>> p = [1 0 0 0 0 3 0 -1]; x = [-0.5:0.5:1]; >> y = polyval(p,x) y = -0.2578 -1.0000 -0.2422 3.0000
On pourrait aussi utiliser la commande fplot. Néanmoins dans ce cas, il faudrait fournir l’expression analytique complète du polynôme dans une chaîne de caractères, et pas simplement ses coefficients.
Calcul des racines de polynômes avec roots
La commande roots donne une approximation des racines d’un polynôme et ne nécessite que le vecteur p en entrée.
Par exemple, on peut calculer les zéros de p(x) = x³ - 6x² + 11x - 6 en écrivant :
>> p = [1 -6 11 -6];
>> roots(p)
ans =
3.0000
2.0000
1.0000
Récapitulatif des commandes pour les polynômes :
| Commandes | Résultats |
|---|---|
y=polyval(p,x) |
y = valeurs de P(x) |
z=roots(p) |
z = racines de P (i.e. telles que P(z) = 0) |
y=polyder(p) |
y = coefficients de P'(x) (dérivée) |
y=polyint(p) |
y = coefficients de l'intégrale de P(x) |
5. Résolution d’un système d’équations linéaires en Matlab
Le problème consiste à trouver la solution du système d’équations linéaires suivant :
a11x1 + a12x2 + ... + a1nxn = b1 a21x1 + a22x2 + ... + a2nxn = b2 ... an1x1 + an2x2 + ... + annxn = bn
En notation matricielle, ce système s’écrit : Ax = b.
En Matlab, on peut résoudre ce système en utilisant l’expression :
>> x=A\b
Où l'on a utilisé l’opération \ (la division matricielle inverse à gauche).
On peut aussi utiliser les expressions suivantes :
>> x = A^(-1)*b
Ou bien :
>> x = inv(A)*b
Exemple : Résoudre un système linéaire
Trouver la solution du système d’équations suivant :
2x1 - x2 + x3 = 0 3x1 + 2x2 - 5x3 = 1 x1 + 3x2 - 2x3 = 4
La solution :
>> A=[2,-1,1;3,2,-5;1,3,-2];
>> b=[0;1;4]
b =
0
1
4
>> x=A\b
x =
0.4643
1.6786
0.7500
Les autres méthodes donneront les mêmes résultats :
>> x=A^(-1)*b >> x=inv(A)*b
Foire aux questions (FAQ)
Q1 : Quelle est la différence entre une fonction inline et une fonction anonyme en Matlab ?
Les fonctions inline et les fonctions anonymes sont toutes deux des moyens de définir des fonctions courtes directement dans l'environnement Matlab. Cependant, les fonctions anonymes sont généralement préférées car elles sont plus performantes, surtout pour des opérations répétées, et plus flexibles. Les fonctions inline sont considérées comme une fonctionnalité héritée.
Q2 : Comment Matlab représente-t-il les polynômes ?
Matlab représente les polynômes comme des vecteurs ligne contenant les coefficients du polynôme, rangés par ordre décroissant des puissances. Par exemple, le polynôme x³ - 6x² + 11x - 6 est représenté par le vecteur [1 -6 11 -6].
Q3 : Quand doit-on utiliser la commande fzero plutôt que roots ?
La commande fzero est utilisée pour trouver un zéro d'une fonction générale (qui n'est pas nécessairement un polynôme) dans un intervalle donné ou près d'un point initial. Elle utilise des méthodes numériques itératives. La commande roots, quant à elle, est spécifiquement conçue pour trouver toutes les racines d'un polynôme et nécessite que les coefficients du polynôme soient fournis sous forme de vecteur.