Académique Documents
Professionnel Documents
Culture Documents
Ces travaux pratiques (TP) s'adressent à des débutants ayant un minimum de connaissances scientifiques et en
informatique.
Il vous est demande de lire les 4 premières sections (jusqu'à "The Command Window" inclus) une par une,
et de faire les exercices ci-dessous correspondants avant de passer à la section suivante.
Matrices magiques
Créer une matrice magique de dimension 5, puis calculer la somme des éléments sur chaque ligne, chaque
colonne et sur les deux diagonales.
Expressions
Écrire dans un fichier que vous nommerez matrice.dat une matrice de votre choix.
en supposant que votre matrice s'appelle A. Enlever de cette matrice la dernière colonne et dernière ligne.
La fenêtre de commandes
Écrire la matrice de rotation
Les trois premiers TD consistent à suivre le tutorial propose par Matlab. On vous y introduit les bases de
Matlab, il est important de tout comprendre correctement.
Il vous est demande de lire de la section 5 jusqu'à la section 8 inclus ("More About Matrices and Arrays"),
une par une, et de faire les exercices ci-dessous correspondants avant de passer à la suivante.
Graphisme
Tracer les courbes suivantes
Indiquer les fonctions dont le mot <<polar>> se trouve dans le titre et celle dont le même mot se trouve dans
la documentation.
L'environnement de Matlab
Afficher l'ensemble des variables en mémoire. Sauvegarder celle qui occupe de plus de place puis l'effacer.
Verifier qu'elle n'est plus en mémoire puis la recharger.
Plus à propos des matrices et des tableaux
Entrer la matrice suivante
Résoudre le système avec b = [32, 23, 33, 31] et b=[32.1, 22.9, 33.1, 30.9].
Les trois premiers TD consistent à suivre le tutorial propose par Matlab. On vous y introduit les bases de
Matlab, il est important de tout comprendre correctement.
Il vous est demande de lire de la section 9 jusqu'à la fin dans l'ordre indiqué ci-dessous, et de faire les
exercices ci-dessous correspondants avant de passer à la suivante.
Commandes de contrôle
Créer une matrice dont la valeur des éléments est la somme de la ligne et de la colonne (Aij=i+j) en
utilisant un boucle for.
Scripts et fonctions
Écrire un programme qui trouve les zéros réels d'un polynôme. On utilisera la commande switch suivant le
degré du polynôme (4 cas, degré 0, degré 1, degré 2 et le reste).
Manipulations graphiques
Créer un graphe avec trois courbes de couleur différente et chacune numérotée, puis retirer du graphe la
deuxième courbe (cela ne veut pas dire <<refaire le graphe avec la première et troisième courbe>> !).
Outils pour l'ingénieur - TD 4
Calcul matriciel
soient inversibles. Alors il existe une matrice triangulaire inférieure L avec et une
matrice triangulaire supérieure U telles que
Créer une matrice A 7x7 aléatoire et vérifier qu'elle est inversible ainsi que ses 6 sous matrices .
Faire sa factorisation LU en récupérant la matrice de permutation P telle que (voir la
commande lu).
Calculer le plus simplement possible la valeur absolue du déterminant de A sans utiliser la matrice A
ni la commande det.
Soit b=[1,2,3,4,5,6,7], écrire un programme pour résoudre en n'utilisant que des boucles
for et la décomposition LU.
Les valeurs propres (eigenvalues) d'une matrice A d'ordre n sont les n racines réelles ou complexes,
distinctes ou confondues, du polynôme caractéristique
de la matrice A (où det est le déterminant et Id la matrice identité de la même dimension que A).
A toute valeur propres d'une matrice A est associé (au moins) un vecteur vi tel que
Étant donné une matrice A d'ordre n, il existe une matrice unitaire Q ( , avec Q* la matrice
De plus, on peut s'arranger pour que les éléments diagonaux de la matrice R soit tous . Si la matrice A
est inversible, la factorisation correspondante est alors unique.
Si la matrice A est réelle, les matrices Q et R le sont aussi et donc la matrice Q est orthogonale.
L'analyse en composante principale permet d'extraire d'un échantillonnage de donnée les tendances
principales. Plusieurs cas peuvent être envisagés : reconstitution d'une photo satellite à partir d'images prise à
différentes fréquences, analyse chimique ou physique d'un produit en fonction de différents tests, étude des
caractéristiques d'une population...
Dans tout ces cas, on travaille sur un ensemble de données, où pour chaque élément, on a différentes valeurs.
On stocke sous forme de matrice ces données, avec dans chaque colonne les valeurs de l'éléments
correspondant à la colonne. Par exemple, pour chaque individu d'une population, on a sa taille et son poids
ce qui donne :
où .
L'analyse en composante principale consiste à extraire de l'ensemble des caractéristiques une caractéristique
principale. Dans le cas de photos prises à différentes fréquences, la caractéristique principale est l'objet
photographié. Une analyse en composante principale peut permettre de mieux retrouver cet objet en
combinant les différentes photos avec des poids variant suivant les photos prises. On aura ainsi, par exemple,
que la couleur des points de l'image <<parfaite>> doit être ci = 0.54 ph1i + 0.63 ph2i + 0.56 ph3i avec phKi la
couleur de ce même point sur la photo K.
Pour choisir les coefficients de la combinaison linéaire ci-dessus, on choisit le vecteur propre correspondant
à la valeur propre la plus importante de la matrice de covariance.
170 166 167 182 189 172 177 169 179 191 181 175 176 175 161
66 65 75 80 101 74 79 66 73 87 86 80 65 59 54
Tracer le graphe correspondant à ces valeurs avec une croix pour chaque couple (avec le poids en
abscisse et la taille en ordonnée).
Calculer la taille moyenne et le poids moyen.
Tracer une ligne horizontale et une ligne verticale passant pas le couple moyen (commande line).
Calculer la matrice de covariance S.
Calculer les valeurs propres et vecteurs propres de cette matrice S.
Calculer la composante principale de nos données, qui correspond à la corpulence.
Introduire la corpulence dans une matrice avec la taille et le poids (mettre la corpulence en première
ligne).
Trier les individus par ordre de corpulence (cd commande sortrows).
Second exemple
Il s'agit de reprendre l'exemple précédant mais avec un echantillonnage plus important et un paramètre de
plus.
Ecrire la fonction glaw (Gauss Law) qui donne une distribution normale à partir de valeurs aléatoire
distribuées uniformément. On utilisera la loi suivante
(1)
Il est conseillé de regarder les commandes interp2, polyfit, polyval, semilogy, std.
Approximation polynomiale
Le fichier census.dat de matlab contient l'évolution de la population américaine de 1790 à 1990. Pour le
charger tapez load census.
Pour des raisons de conditionnement de la matrice de Vandermonde (matrice utilisée pour calculer les
coefficients du polynôme d'approximation), il est préférable de normaliser les valeurs en abscisse, dans notre
cas les dates. Cela revient à soustraire à ces valeurs, leur moyenne et à diviser le tout par l'écart type e :
(1)
1.
Normaliser les dates (on utilisera en autres la commande std).
2.
Tracer sur un même graphe les points donnés (avec une croix) et la courbe d'approximation
polynomiale d'ordre 1.
3.
Tracer l'erreur entre l'approximation et les données.
4.
Recommencer les étapes 2 et 3 avec une approximation d'ordre 2.
5.
Recommencer les étapes 2 et 3 avec une approximation d'ordre 4.
6.
Quelles remarques pouvez vous faire.
Approximation exponentielle
On cherche à approcher les données par une courbe exponentielle du type
(2)
1.
Passer les données sur la population (pop) en log base 10.
2.
Calculer la courbe d'approximation telle qu'elle est définie ci-dessus avec la partie polynomiale
d'ordre 1.
3.
Tracer en échelle logarithmique suivant abscisse les données et la courbe d'approximation.
4.
Tracer l'erreur.
5.
Recommencer les étapes 2 à 4 avec une approximation d'ordre 2.
6.
Quelles remarques pouvez vous faire par rapport aux approximations polynomiales.
Interpolation polynomiale en 3D
On parle d'interpolation lorsqu'on cherche à définir ce qui se passe entre les valeurs données, tout en passant
par ces valeurs données.
Le compilateur mex est rangé dans le répertoire /home/matlab-v5/bin/, vous pouvez l'appeler directement
en tapant $MATLAB/bin/mex
Faire un fichier MEX en langage C qui permet cela et le tester avec le vecteur [-1 0.67 1 0 3].
On utilisera la commande mexPrintf similaire à printf, et l'on s'inspirera de l'exemple proposé à la section
suivante.
[yp] = yprime(t, y)
*/
#include <math.h>
#include "mex.h"
/* Input Arguments */
/* Output Arguments */
#if !defined(max)
#define max(A, B) ((A) > (B) ? (A) : (B))
#endif
#if !defined(min)
#define min(A, B) ((A) < (B) ? (A) : (B))
#endif
#define pi 3.14159265
r1 = sqrt((y[0]+mu)*(y[0]+mu) + y[2]*y[2]);
r2 = sqrt((y[0]-mus)*(y[0]-mus) + y[2]*y[2]);
yp[0] = y[1];
yp[1] = 2*y[3]+y[0]-mus*(y[0]+mu)/(r1*r1*r1)-mu*(y[0]-mus)/(r2*r2*r2);
yp[2] = y[3];
yp[3] = -2*y[1] + y[2] - mus*y[2]/(r1*r1*r1) - mu*y[2]/(r2*r2*r2);
return;
}
void mexFunction(
int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[]
)
{
double *yp;
double *t,*y;
unsigned int m,n;
if (nrhs != 2) {
mexErrMsgTxt("YPRIME requires two input arguments.");
} else if (nlhs > 1) {
mexErrMsgTxt("YPRIME requires one output argument.");
}
m = mxGetM(Y_IN);
n = mxGetN(Y_IN);
if (!mxIsNumeric(Y_IN) || mxIsComplex(Y_IN) ||
mxIsSparse(Y_IN) || !mxIsDouble(Y_IN) ||
(max(m,n) != 4) || (min(m,n) != 1)) {
mexErrMsgTxt("YPRIME requires that Y be a 4 x 1 vector.");
}
yp = mxGetPr(YP_OUT);
t = mxGetPr(T_IN);
y = mxGetPr(Y_IN);
yprime(yp,t,y);
return;
}
Outils pour l'ingénieur - TD 8
Programmation - Le moteur MATLAB
On construira un programme en C pour calculer le polynôme de meilleur approximation d'un
échantillonnage. On utilisera le moteur MATLAB et ce qui à été fait lors du TD 6.
La commande pour compiler un programme C utilisant le moteur MATLAB est si le fichier C s'appelle
engdemo.c :
void main()
{
Engine *ep;
mxArray *T = NULL, *result = NULL;
char buffer[256], str[256];
double time[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
/*
* Start the MATLAB engine locally by executing the string
* "matlab"
*
* To start the session on a remote host, use the name of
* the host as the string rather than \0
*
* For more complicated cases, use any string with whitespace,
* and that string will be executed literally to start MATLAB
*/
if (!(ep = engOpen("\0"))) {
fprintf(stderr, "\nCan't start MATLAB engine\n");
exit(-1);
}
/*
* PART I
*
* For the first half of this demonstration, we will send data
* to MATLAB, analyze the data, and plot the result.
*/
/*
* Create a variable from our data
*/
T = mxCreateDoubleMatrix(1, 10, mxREAL);
mxSetName(T, "T");
memcpy((char *) mxGetPr(T), (char *) time, 10*sizeof(double));
/*
* Place the variable T into the MATLAB workspace
*/
engPutArray(ep, T);
/*
* Evaluate a function of time, distance = (1/2)g.*t.^2
* (g is the acceleration due to gravity)
*/
engEvalString(ep, "D = .5.*(-9.8).*T.^2;");
/*
* Plot the result
*/
engEvalString(ep, "plot(T,D);");
engEvalString(ep, "title('Position vs. Time for a falling object');");
engEvalString(ep, "xlabel('Time (seconds)');");
engEvalString(ep, "ylabel('Position (meters)');");
/*
* use fgetc() to make sure that we pause long enough to be
* able to see the plot
*/
printf("Hit return to continue\n\n");
fgetc(stdin);
engEvalString(ep, "close;");
/*
* PART II
*
* For the second half of this demonstration, we will request
* a MATLAB string, which should define a variable X. MATLAB
* will evaluate the string and create the variable. We
* will then recover the variable, and determine its type.
*/
/*
* Use engOutputBuffer to capture MATLAB output, so we can
* echo it back.
*/
engOutputBuffer(ep, buffer, 256);
/*
* Evaluate input with engEvalString
*/
engEvalString(ep, str);
/*
* Echo the output from the command. First two characters are
* always the double prompt (>>).
*/
printf("%s", buffer+2);
/*
* Get result of computation
*/
printf("\nRetrieving X...\n");
if ((result = engGetArray(ep,"X")) == NULL)
printf("Oops! You didn't create a variable X.\n\n");
else {
mxClassID category;
category = mxGetClassID(result);
switch(category) {
case mxCELL_CLASS :
printf("X is a cell array (class mxCELL_CLASS).\n");
break;
case mxSTRUCT_CLASS :
printf("X is a structure array (class mxSTRUCT_CLASS).\n");
break;
case mxOBJECT_CLASS :
printf("X is an object array (class mxOBJECT_CLASS).\n");
break;
case mxCHAR_CLASS :
printf("X is a character array (class mxCHAR_CLASS).\n");
break;
case mxSPARSE_CLASS :
printf("X is a sparse matrix (class mxSPARSE_CLASS).\n");
break;
case mxDOUBLE_CLASS :
printf("X is a double array (class mxDOUBLE_CLASS).\n");
break;
}
}
}
/*
* We're done! Free memory, close MATLAB engine and exit.
*/
printf("Done!\n");
mxDestroyArray(T);
mxDestroyArray(result);
engClose(ep);
exit(0);
}
Ce TD est pour les étudiants des options Calcul Scientifique et Informatique. Les autres peuvent aussi
le faire s'ils le désirent.
Pour ce TD, vous devez recopier les classes matrice et vecteur que vous avez écrites pour le PERS, pour les
enrichir de nouvelles méthodes (fonctions).
FILE = pers1
OBJS = pers1.o matrice.o vector.o
LIBS = -lm -leng -lmx -lmi -lut
CHEMLIB = -L/home/matlab-v5/extern/lib/lnx86
CHEMINC = -I/home/matlab-v5/extern/include
# Partie generique :
all: $(FILE)
$(FILE): $(OBJS)
$(CC) $(CHEMINC) -o $(FILE) $(OBJS) $(CHEMLIB) $(LIBS)
# Dependences:
Les Matrices
Écrire les fonctions suivantes dans votre structure matrice en utilisant le moteur MATLAB :
Écrire un programme utilisant toutes ces fonctions avec des matrices de grande taille (supérieur à 10).
Vérifier vos calculs à l'aide de MATLAB.
Outils pour l'ingénieur - TD 9
Cycles
Un système d'équations différentielles d'ordre 1 peut être vu comme la définition du vecteur vitesse
(direction) en tout point de l'espace :
(1)
On peut voir sur un graphe représentant les vecteurs vitesse si les trajectoires <<tendent>> vers un point ou
une courbe limite.
Cette représentation en point/vitesse est un artifice qui permet d'imaginer ce qui se passe, il faut bien avoir a
l'esprit que généralement on ne travaille pas avec ces variables. Dans le cas de la lutte pour la vie, les
variables représentent la population de chaque espèce, dans le cas d'une équation différentielle du second
Un cas d'école
Soit le système
(2)
résoudre sur l'intervale t=[0;15] le système ci-dessus avec les conditions initiales suivantes (ça fait
deux problèmes) :
(3)
tracer dans un repère orthonormé les courbes correspondant à chacune des solutions (on trace x2 en
fonction de x1).
dessiner à l'aide de la fonction quiver (regardez l'exemple proposé dans l'aide help quiver) le
.
superposer à ce graphe, les courbes tracées précédemment.
avec et des constantes que l'on fixe à 1 et v la vitesse du tapis roulant que l'on fixe à 2.
écrire le système d'équations différentielles d'ordre 1 équivalent à l'équation ci-dessus (on prend x1=x
et ).
calculer les courbes sur l'intervale [0 20] pour les conditions initiales
(4)
tracer dans un repère orthonormé les courbes correspondant à chacune des solutions (on trace x2 en
fonction de x1).
dessiner à l'aide de la fonction quiver le champs vectoriel correspondant à la fonction
sur le carré .
superposer à ce graphe, les courbes tracées précédemment.