TD1/TME1 : Matrices généralités

publicité
TD1/TME1 : Matrices généralités
P. Trébuchet
17 février 2010
Exercice 1 – Manipulations simples
Question 1
Donner la matrice R de la rotation de centre l’origine et d’angle 30 degrés relativement à la base canonique. Puis
donner la matrice R0 de ce même opérateur relativement à la base 2e1 , e2 .
Question 2
Écrire la matrice M donnant les coordonnées de e1 puis e2 dans la base {2e1 , e2 }. Donner
les coordonnées du vecteur
!
3
3e1 + 5e2 dans la base {2e1 , e2 }, comparer avec le produit matrice-vecteur M
. Que conjecturer alors quant à
5
M . Calculer alors la matrice M 0 des coordonnées de 2e1 , e2 dans la base e1 , e2 . Que vaut le produit M M 0 ?
Question 3
Calculer le produit M −1 R0 M et le comparer à R. R et R0 sont dites equivalentes.
Question 4
Dans le plan en deux dimensions, écrire la matrice de la rotation de centre l’origine et d’angle 30 degrés, en considérant
comme base de départ les vecteurs 2e1 , e2 et comme base d’arrivée les vecteurs e1 et e2 .
Question 5
En considérant l’espace à trois dimensions, écrire la matrice de la rotation autour de l’axe passant par l’origine, de
vecteur directeur (1, 1, 1) et d’angle 120 degrés relativement à la base canonique.
Exercice 2 – Espace projectif et représentation matricielle
Dans cet exercice nous allons étudier la représentation que l’on fait habituellement de l’espace en trois dimensions
dans tous les programmes de modélisation (et donc dans les jeux vidéos et plus particulièrement dans la bibliothèque
OpenGL).
Question 1
Expliquer à l’aide d’un exemple pourquoi la rotation autour de l’axe passant par le point (1, 0, 0) et d’axe de vecteur
directeur (0, 1, 0) n’est pas une application linéaire.
Indication : regarder l’image de (0, 0, 0) par cette application et rappeler la définition de linéarité.
Question 2
On représente les points de l’espace à trois dimensions (celui dans lequel on vit !) par leur trois coordonnées usuelles
et une quatrième posée à 1. En faisant une analogie avec la construction des vecteurs dans le plan à partir de points,
donner une définition d’un vecteur de l’espace dans cette représantation. Définir alors la translation d’un point P par
un vecteur v. Est-ce que cette translation est une application linéaire dans ce contexte ? Si oui, en donner la matrice.
1
UE Calcul Formel
Version enseignant (P. Trébuchet)
– page 2/??
Question 3
On appelle espace projectif l’espace défini plus haut. A quels point de l’espace affine correspondent les points projectifs (1, 1, 1, 1) et (2, 2, 2, 2) ?
Question 4
La représentation définie à la question 2 est communément appelée espace projectif. Dans cette représentation, donner
la matrice de la rotation d’angle 30 degrés autour d’un axe passant par l’origine de l’espace (i.e. le point (0, 0, 0, 1))
et parallèle à l’axe des abscisses.
Question 5
Montrer que dans la contexte de espaces projectifs la translation dans l’espace affine est une opération linéaire et
donnez la matrice d’une translation par rapport à un vecteur v.
Question 6
En déduire une construction de la matrice de rotation par rapport à un axe ne passant pas par l’origine.
Question 7
OpenGL utilise la notion de matrice de transformation pour creer ses objets ; les seules primitives de crétion d’objet
disponibles créent un objet centré en l’origine du repère en cours. Ce repère en cours est obtenu à partir du repère
canonique en multipliant l’identité pour une matrice de transformation. Expliquer ce que fait le code ci dessous.
GLfloat
GLfloat
GLfloat
GLfloat
rDG[]
rDD[]
rAG[]
rAD[]
=
=
=
=
{
{
{
{
1.0 - 1.0/4.0,
1.0 - 1.0/4.0,
-1.0 + 1.0/4.0,
-1.0 + 1.0/4.0,
-0.5,
-0.5,
-0.5,
-0.5,
-0.5 - 1.0/6.0 };
0.5 + 1.0/6.0 };
-0.5 - 1.0/6.0 };
0.5 + 1.0/6.0 };
void automobile (void) {
parallelepipede(2.0, 1.0, 1.0, orange);
glPushMatrix();
glTranslatefv(rDG);
roue(0.05, 1.0/3.0, violet);
glPopMatrix();
glPushMatrix();
glTranslatefv(rDD);
roue(0.05, 1.0/3.0, cyan);
glPopMatrix();
glPushMatrix();
glTranslatefv(rAG);
roue(0.05, 1.0/3.0, vert);
glPopMatrix();
}
Exercice 3 – algorithmique matricielle
Question 1
Ecrire l’algorithme du produit matriciel naif (trois boucles).
Solution:
Voila du code ecrire juste l’algo :
c
2006/2007
(by UPMC/LMD/CF)
17 février 2010
UE Calcul Formel
Version enseignant (P. Trébuchet)
– page 3/??
#include<stdio.h>
#include<stdlib.h>
#include<generateur.h>
//On supposera les matrices stockees column major
prodmat(double *res, double *a, double *b,int size)
{
int i,j,k;
for(i=0;i<size*size;i++)
res[i]=0;
for(i=0;i<size;i++)
for(j=0;j<size;j++)
for(k=0;k<size;k++)
res[i*size+j]+=a[k*size+i]*b[j*size+k];
}
int main(int argc, char** argv)
{
double *a,*b,*res;
int size=atol(argv[1]);
a=generate(size);
b=generate(size);
res=malloc(size*size*sizeof(double));
prodmat(res,a,b,size);
}
Question 2
Ecrire ensuite l’algorithme du produit matriciel par blocs dans le cas ou la taille des blocs divise la taille de la matrice.
Solution:
Voila du code ecrire juste l’algo :
#include<stdio.h>
#include<stdlib.h>
#include<generateur.h>
//#define SIZEBLOCK 10
//On supposera les matrices stockees column major
prodmat(double *res, double *a, double *b,int size)
{
int i,j,k;
for(i=0;i<size*size;i++)
res[i]=0;
for(i=0;i<size/SIZEBLOCK;i++)
for(j=0;j<size/SIZEBLOCK;j++)
for(k=0;k<size/SIZEBLOCK;k++)
{
int ii,jj,kk;
for(ii=0;ii<SIZEBLOCK;ii++)
for(jj=0;jj<SIZEBLOCK;jj++)
for(kk=0;kk<SIZEBLOCK;kk++)
res[(i*size+j)*SIZEBLOCK+ii*size+jj]+=
a[(k*size+i)*SIZEBLOCK+kk*size+ii]
*b[(j*size+k)*SIZEBLOCK+jj*size+kk];
c
2006/2007
(by UPMC/LMD/CF)
17 février 2010
UE Calcul Formel
Version enseignant (P. Trébuchet)
– page 4/??
}
}
int main(int argc, char** argv)
{
double *a,*b,*res;
int size=atol(argv[1]);
a=generate(size);
b=generate(size);
res=malloc(size*size*sizeof(double));
prodmat(res,a,b,size);
}
Question 3
Que rajouter pour gérer aussi les autres cas ?
Exercice 4 – Multiplication rapide de matrices
Question 1 – Données intuitives
Donner la complexité de l’algorithme d’addition de deux entiers à n chiffres, et celle de l’algorithme de multiplication
par l’algorithme naı̈f.
Question 2 – Un algorithme de Winograd
En développant le produit :
(ai,j + bj 0 ,k )(ai,j 0 + bj,k ),
en supposant n pair et en posant j 0 = n − j, donner un algorithme permettant de limiter le nombre de multiplications
coefficients/coefficients. Quelle est le nombre total de multiplications dans ce cas là ?
Question 3 – Algorithme de Strassen
En considérant deux matrices de taille 2 × 2, A =
a b
c d
!
et B =
α β
γ δ
!
, et en développant les produits :
– q1 = (a − b)δ
– q2 = (c − d)α
– q3 = d(α + γ)
– q4 = a(β + δ)
– q5 = (a + b)(δ − α)
– q6 = (a + c)(α + β)
– q7 = (b + d)(γ + δ)
Expliciter l’un des éléments suivants :
– q1 − q3 − q5 + q7
– q4 − q1
– q2 + q3
– −q2 − q4 + q5 + q6
Question 4 – Algorithme de Strassen, la suite
Compter le nombre de multiplications nécessaires pour effectuer un produit de matrices 2 × 2. Imaginer alors un
algorithme réccursif permettant de multiplier deux matrices de taille n = 2m .
Question 5
En appelant T (n) le coût de la multiplication par cet algorithme de matrices de taille n, donner une formule de
c
2006/2007
(by UPMC/LMD/CF)
17 février 2010
UE Calcul Formel
Version enseignant (P. Trébuchet)
– page 5/??
récurrence permettant de déduire la complexité de cet algorithme. Résoudre cette formule (log2 (7) est voisin de
2.81).
Exercice 5 – Notion de supplémentaire
Question 1
Soit E un espace vectoriel, et E 0 et E 00 deux sous espaces vectoriels de E. On définit l’addition de E 0 et E 00 comme
étant l’ensemble des vecteurs v tel que v s’écrive comme v = vE 0 + vE 00 , où vE 0 appartient à E 0 et vE 00 appartient à
E 00 . Montrer E 0 + E 00 est un espace vectoriel, et même un sous espace vectoriel de E.
Question 2
On dit que E 0 et E 00 sont en somme directe si E 0 ∩ E 00 = {0}. Montrer que dans ce cas on a unicité de l’écriture
v = vE 0 + vE 00 pour v ∈ E 0 + E 00 .
Question 3
On appelle projection une application linéaire φ telle que φoφ = φ, montrer que l’espace vectoriel des vecteurs v tels
que φ(v) = 0 est en somme directe avec l’espace vectoriel engendré par les vecteurs v tels que φ(v) 6= 0.
Question 4
En se plaçant dans l’espace, et en utilisant le produit vectoriel, déterminer une matrice de la projection sur le plan
{(1, 1, 0), (0, 0, 1)}, attention il faudra recourir à la représentation projective de l’espace.
En TP leur faire faire des manipulations en Maple la dessus avec animate pour que cela soit joli.
Exercice 6 – Implantation de la multiplication naı̈ve de matrices
Les matrices seront représentées dans nos programmes C par représentations un gros tableau de coefficients, où les
éléments seront stockés colonnes par colonne.
Question 1
Écrire en C une fonction prenant en entrée trois matrice stockées sous forme de gros tableau et calculant le produit
matrice-matrice des deux premières, de manière naı̈ve, et mettra le résultat dans le troisième paramètre (cf canevas
donné).
Question 2
En utilisant l’option -shared de gcc créer un bibliothèque dynamique contenant votre fonction de multiplication.
Question 3
Écrire un programme C prenant sur sa ligne de commande le nom d’une bibliothèque dynamique et un entier n,
utilisant les appels systèmes dlopen et dlsym pour trouver dans la bilbiothèque dynamaique le symbole mat mul,
générant deux matrices aléatoires de double de taille n par n et appelant la fonction de multiplication sur ces deux
matrices. attention la notion de pointeur sur fonction est utilisée ici !
Question 4
Ecrire une deuxième fonction de produit matriciel mais cette fois par bloc. Et créer une deuxième bibliothèque contenant ce produit.
Question 5
En faisant varier la taille des blocs et la taille des matrices faire des comparaisons de performance.
Exercice 7 – Interface avec Maple
c
2006/2007
(by UPMC/LMD/CF)
17 février 2010
UE Calcul Formel
Version enseignant (P. Trébuchet)
– page 6/??
Question 1
En utilisant l’aide de maple 10 sur le topic extern calling ecrire quelque ligne de maple qui vous permettent
d’appeler votre fonction de multiplication sur des objets maple. Si vous ne vous sentez pas à l’aise avec ces notion
une correction est disponible dasn le fichier codemaple.mpl.
Question 2
La méthode précédente est pratique pour travailler sur des objets à base de type matériel mais ne permet pas de traiter
des objets complexes de maple, e.g. des matrices de grands entiers. Pour ce faire on doit recourir à une interface plus
lourde où nous allons nous même coder le wrapper pour récupérer nos données.
– Écrire une fonction dont le prototype est ALGEB myfun(MKernelVector kv, ALGEB* args) qui appelle la fonction int MapleNumArgs(kv,(ALGEB)args) ; et qui affiche le nombre retourné.
– Écrire une fonction prenant en paramètre un objet de type RTable dont les coefficients sont des entiers potentiellement longs et qui crée une matrice de mpz t ayant les mêmes entrées.
– Écrire une fonction prenant en paramètre une matrice de mpz t et remplissant un RTable passée également en
paramètre avec les entrées de ma matrice.
Question 3
Écrire un algorithme naı̈f de multiplication de matrices de grands entiers et faire appeler sa routine dans maple. Il y
a ici un problème d’allocation de mémoire. En effet, maple est garbage collecté et maple a donc surchargé les
routines d’allocation de gmp par les siennes, or nous ne souhaitons pas que nos objets soient recuperes par maple en
cours de calcul. Il nous faut donc mettre les nôtres à la place, et comme les programmeurs de maple ont utilise une
version beta de gmp pour leur distribution, il manque une petite fonction pour parvenir à nos fins.
void
mp_get_memory_functions (void *(**alloc_func) (size_t),
void *(**realloc_func) (void *, size_t, size_t),
void (**free_func) (void *, size_t))
{
if (alloc_func != NULL)
*alloc_func = __gmp_allocate_func;
if (realloc_func != NULL)
*realloc_func = __gmp_reallocate_func;
if (free_func != NULL)
*free_func = __gmp_free_func;
}
Exercice 8 – Implantation d’algorithmes de multiplication
Implanter les algorithmes de multiplication rapide vus en TD pour pouvoir multiplier des matrices de grands entiers
et comparer les temps d’exécution avec la multiplication naı̈ve. Que dire alors de l’intérêt et de tels algorithmes.
c
2006/2007
(by UPMC/LMD/CF)
17 février 2010
Téléchargement