A3PAL - Algèbre linéaire - TP3 : Applications linéaires/matrices en dimension arbitraire

Objectif

Liste des compétences à acquérir pendant le TP:

- Programmer une classe Matrice de taille arbitraire pour :

1- représenter des applications linéaires d'un espace euclidien de dimension m dans un espace euclidien de dimension n, quels que soient les entiers naturels m et n ; et
2 - trouver l'image d'un vecteur par une telle application linéaire.

Ce programme sera ré-utilisé tout au long de l'unité A3PAL.

0 - Travail préliminaire

Terminez le TP2.

Créez une copie de votre répertoire TP2, et renommez cette copie TP3. Sous blueJ, ouvrez le projet intitulé TP3 correspondant à la copie du TP2 que vous venez de créer.

1 - Création de la classe Matrice

a. Créez dans votre projet une nouvelle classe Matrice (bouton 'New Class' sous Bluej). Cette classe devra permettre d'instancier une matrice de taille m x n arbitraire, c'est-à-dire, une matrice correspondant à une application linéaire d'un espace euclidien de dimension m dans un espace euclidien de dimension n où les dimensions m et n sont choisies au moment de la création de la matrice. En termes de programmation, cela signifie que l'on passera au constructeur de la classe (dont la programmation sera abordée à la question 1.d) deux paramètres indiquant les nombres m et n de lignes et de colonnes de la matrice ; cette matrice comprendra donc m x n coefficients et chaque coefficient sera indexé par un couple d'entiers dont le premier élément est compris entre 0 et m-1 et le second est compris entre 0 et n-1. Inspectez le code de la classe Matrice créé par BlueJ ? Que contient-il ? Cela correspond-il à une matrice de taille arbitraire ? Supprimer les attributs et méthodes qui ne sont pas nécessaires. En utilisant uniquement les types de données vus en cours jusqu'à présent, est-il possible de déclarer les attributs correspondant à une matrice en dimension arbitraire ? Pourquoi ?

b. Afin de pouvoir définir les attributs d'une classe pour représenter une matrice en dimension arbitraire, il est possible d'utiliser un tableau à deux dimensions. Après avoir lu cette ressource sur les tableaux à deux dimensions, déclarez dans la classe Matrice un attribut pour représenter une matrice de taille arbitraire. Nous rappelons que les coefficients des matrices sont des nombres réels et que le type double est utilisé pour représenter ces nombres réels.

c. Déclarez dans la classe Matrice deux attributs correspondant respectivement au nombre de lignes et au nombre de colonnes de l'instance courante de la classe Matrice.

d. Ajoutez à la classe Matrice un constructeur à deux paramètres de type int spécifiant les nombres de lignes et de colonnes de la matrice et créant une instance de la matrice nulle. La signature de ce constructeur est donc :

public Matrice(final int pm, final int pn)

e. Ajoutez à la classe Matrice un accesseur à deux paramètres de type int spécifiant le couple d'indices (i,j) du coefficient à retourner. La signature de cet accesseur est donc :

public double getCoefficient(final int pi, final int pj)

f. Ajoutez à la classe Matrice deux accesseurs sans paramètre retournant respectivement le nombre de lignes et le nombre de colonnes de la matrice. Les signatures de ces accesseurs sont donc :

public int getNbColonnes()
public int getNbLignes()

g. Ajoutez à la classe Matrice un modificateur à trois paramètres permettant d'affecter une valeur à l'un des coefficients de l'instance courante de la classe Matrice. Les deux premiers paramètres, de type int, spécifient le couple d'indices du coefficient à modifier et le troisième, de type double, spécifie la valeur à affecter à ce coefficient. La signature de ce modificateur est donc :

public void setCoefficient(final int pi, final int pj, final double pCoefficient)

h. Afin de tester votre classe, créez une matrice de taille 3 x 3 et une matrice de taille 3 x 4. Invoquez les méthodes getNbColonnes et getNbLignes sur ces deux matrices et vérifiez qu'elles retournent des valeurs conformes aux définitions. Modifiez ensuite la première matrice afin qu'elle représente l'application linéaire identité de l'espace euclidien de dimension 3. Finalement, vérifiez grâce à la méthode getCoefficient que les modifications effectuées sont conformes à ce qui est souhaité. Que se passe-t-il lorsque vous invoquez getCoefficient(3,4) sur les deux matrices que vous avez créées ? Expliquez ?

2- Image d'un vecteur par une application linéaire / multiplication d'une matrice par un vecteur

Afin de calculer l'image d'un vecteur par une application linéaire, il est suffisant de savoir multiplier à droite une matrice par un vecteur. L'objectif de cet exercice est d'implémenter cette opération. Pour cela, on s'appuiera sur la décomposition de la matrice en vecteurs lignes et sur des calculs de produits scalaires.

a. Ajoutez à la classe Matrice une méthode getVecteurLigne à un paramètre, de type int, retournant un Vecteur ayant pour coordonnées les coefficients de l'instance courante de la classe Matrice dont le premier indice est égal au paramètre de la méthode. En d'autres termes, le vecteur retourné correspond à la ligne indicée par l'entier passé en paramètre.

b. Après avoir consulté les éléments d'aide présentés ci-après, ajoutez à la classe Matrice une méthode mutiplicationVectorielle à un paramètre, de type Vecteur, retournant un Vecteur qui est le produit (à droite) de l'instance courante la classe Matrice par le Vecteur passé en paramètre de la méthode. En d'autres termes, cette méthode retourne l'image du Vecteur paramètre par l'application linéaire associée à l'instance courante de la classe Matrice.

Aide 1. Soit une matrice M de taille m x n et soit u un vecteur de l'espace euclidien de dimension n. Pour toute valeur entière i comprise entre 0 et m-1, la i-ème coordonnée du produit (à droite) de M par u est le produit scalaire du i-ème vecteur ligne de M par u.

c. Testez votre méthode avec la matrice

0 -1 -2
1 0 1
et le vecteur u = (1 ; 2 ; 1)T. Visualisez à l'aide de la classe Plan le vecteur u et le résultat de la multiplication.

3 - Applications remarquables

a. (Identité) Ajoutez à la classe Matrice une nouvelle procédure setIdentite sans paramètre qui modifie l'instance courante de la classe Matrice afin que celle ci corresponde à l'application identité. On supposera que cette méthode est invoquée uniquement sur des matrices carrées (ayant le même nombre de lignes et de colonnes).

b. En utilisant la représentation graphique des vecteurs obtenue grâce à la classe Plan, vérifiez, pour la dimension 2, que la méthode setIdentite, programmée à la question a., produit une matrice qui ne modifie pas les vecteurs en dimension 2 par multiplication à droite.

c. (Homothétie) Ajoutez à la classe Matrice une nouvelle procédure setHomothetie à un paramètre k, de type double, qui modifie l'instance courante de la classe Matrice afin que celle ci corresponde à l'homothétie (de centre O) de facteur k. On supposera que cette méthode est invoquée uniquement sur des matrices carrées (ayant le même nombre de lignes et de colonnes).

d. En utilisant la représentation graphique des vecteurs obtenue grâce à la classe Plan, vérifiez, pour la dimension 2, que la méthode setHomothetie conduit bien à une matrice qui correspond à l'application linéaire homothétie. Testez également cette méthode sur des vecteurs en dimension 3.

e. (Symétrie centrale) Ajoutez à la classe Matrice une nouvelle procédure setSymetrieCentrale sans paramètre qui modifie l'instance courante de la classe Matrice afin que celle-ci corresponde à une symétrie centrale (de centre O). On supposera que cette méthode est invoquée uniquement sur des matrices carrées (ayant le même nombre de lignes et de colonnes).

f. En utilisant la représentation graphique des vecteurs obtenue grâce à la classe Plan, vérifiez, pour la dimension 2, que la méthode setSymetrieCentrale conduit bien à une matrice qui correspond à l'application linéaire symétrie centrale. Testez également cette méthode sur des vecteurs en dimension 3.

g. (Réflexion 2D) Ajoutez à la classe Matrice une nouvelle procédure setReflexionOx sans paramètre qui modifie l'instance courante de la classe Matrice afin que celle-ci corresponde à la réflexion dont l'axe est défini par le vecteur (1 ; 0). On supposera que cette méthode est invoquée uniquement sur des matrices carrées à 2 lignes et 2 colonnes.

h. En utilisant la représentation graphique des vecteurs obtenue grâce à la classe Plan, vérifiez que la méthode setReflexionOx conduit bien à une matrice qui correspond à l'application linéaire de réflexion par rapport à l'axe Ox.

i. (Réflexion 3D) Ajoutez à la classe Matrice une nouvelle procédure setReflexionOxOy sans paramètre qui modifie l'instance courante de la classe Matrice afin que celle-ci corresponde à la réflexion par rapport au plan défini par les vecteurs (1 ; 0 ; 0) et (0 ; 1 ; 0) . On supposera que cette méthode est invoquée uniquement sur des matrices carrées à 3 lignes et 3 colonnes.

j. En utilisant la représentation graphique des vecteurs obtenue grâce à la classe Plan, vérifiez que la méthode setReflexionOxOy conduit bien à une matrice qui correspond à l'application linéaire de réflexion par rapport au plan défini par les vecteurs (1 ; 0 ; 0) et (0 ; 1 ; 0).

k. (Rotation 2D) Ajoutez à la classe Matrice une nouvelle procédure setRotation2d à un paramètre alpha, de type double, qui modifie l'instance courante de la classe Matrice afin que celle-ci corresponde à une rotation de alpha radian (de centre O). On supposera que cette méthode est invoquée uniquement sur des matrices carrées à 2 lignes et 2 colonnes.

l. En utilisant la représentation graphique des vecteurs obtenue grâce à la classe Plan, vérifiez que la méthode setRotation2d conduit bien à une matrice qui correspond à l'application linéaire de rotation.

m. (Rotation 3D) Ajoutez à la classe Matrice une nouvelle procédure setRotation3dOxà un paramètre alpha, de type double, qui modifie l'instance courante de la classe Matrice afin que celle-ci corresponde à la rotation d'angle alpha autour de l'axe défini par le vecteur (1 ; 0 ; 0). On supposera que cette méthode est invoquée uniquement sur des matrices carrées à 3 lignes et 3 colonnes.

n. En utilisant la représentation graphique des vecteurs obtenue grâce à la classe Plan, vérifiez que la méthode setRotation3dOx conduit bien à une matrice qui correspond à l'application linéaire de rotation autour de l'axe x.

4 - Tracé géométrique en 2D

a. Créez un Plan et un vecteur (non nul) en dimension 2. Invoquez ensuite la méthode dessinerPointEn2d de ce Plan en lui passant le Vecteur créé comme paramètre. Dans la suite de cet exercice, l'objectif est de tracer des suites de points situés sur des droites et des cercles du Plan.

b. Ajoutez à la classe Matrice une procédure publique statique tracerDroite à un paramètre de type Vecteur.

- La signature de cette méthode est donc : public static void tracerDroite(final Vecteur pu).

- Cette méthode devra créer un Plan et tracer dans ce Plan la droite de coefficient directeur pu.

c. Ajoutez à la classe Matrice une procédure publique statique tracerCercle à un paramètre de type double.

- La signature de cette méthode est donc : public static void tracerCercle(final double prayon)

- Cette méthode devra créer un Plan et tracer dans ce Plan le cercle de centre O et de rayon prayon.

Sujet rédigé par Jean Cousty, Benjamin Perret et Leïla Reille pour l'unité A3PAL à ESIEE Paris.