Vous êtes sur la page 1sur 5

Université de Tunis AU: 2021/2022

Institut Préparatoire aux Etudes d'Ingénieurs de Tunis

Examen Informatique N°2


Sections : SM & SP Documents non autorisés
Date : Mai 2022 Durée : 2h Nombre de Pages : 5

N.B : Les deux problèmes sont indépendants

Problème 1 : (10 points)


On se propose de développer une plateforme de gestion d'agences de location de
Logements. Un logement étant caractérisé par: un code (entier), une surface (réel), un prix
initial (réel) et un état de réservation (booléen renseignant si le logement est réservé ou non).

Un logement peut être, soit une maison, soit une chambre dans un hôtel. Une
chambre d'hôtel est un logement caractérisé en plus par son type (chaine de caractères,
exemple : 'Double', 'Single', 'Twin', …). Tandis qu'une maison est caractérisée en plus par le
nombre de ses chambres (entier).

Une agence de location de logements est caractérisée par un nom (chaine de


caractères) et une liste de logements pouvant être des maisons et des chambres d’hôtel.

Partie I :
Dans cette partie, on se propose de développer les classes : Logement, Maison,
ChambreHotel et Agence:

1- Développer la classe Logement comportant:


— les attributs nécessaires.
— un constructeur qui prend autant de paramètres que d'attributs.
— une méthode __repr__()
— une méthode estReserve() : qui teste si le logement est réservé ou non.
— une méthode reserver() : qui permet de réserver le logement.

2- Développer la classe ChambreHotel dérivant de la classe Logement. La classe


ChambreHotel comporte:
— le(s) attribut(s) nécessaire(s).
— un constructeur qui prend autant de paramètres que d'attributs.
— une méthode __repr__()
— la méthode prixTotal() qui calcule et retourne le prix de logement selon la formule :

prixInitial + (0.1 * surface)

1/5
3- Développer la classe Maison dérivant de la classe Logement. La classe Maison
comporte:
— le(s) attribut(s) nécessaire(s).
— un constructeur qui prend autant de paramètres que d'attributs.
— une méthode __repr__()
— la méthode prixTotal() qui calcule et retourne le prix de logement selon la formule:

prixInitial + (0.1 * nombrePièces * surface)


4- Développer la classe Agence comportant:
— le(s) attribut(s) nécessaire(s).
— un constructeur, la liste de logements de toute agence étant initialement vide.
— une méthode __repr__(). Représenter une agence revient à représenter chacun de ses
logements suivi par un saut de ligne.
En plus, la classe Agence doit définir les méthodes suivantes :
a. une méthode chercherLogement(x) qui permet de chercher et renvoyer le logement
de code x.
b. une méthode ajouterLogement(log) qui permet d'ajouter un logement à la liste des
logements de l'agence.
c. une méthode réserverLogement(x) qui permet de réserver le logement de code x s'il
n'est encore pas réservé. La méthode doit renvoyer un booléen indiquant si la
réservation s'est bien effectuée ou non.
d. une méthode afficherMaisonsLibres(prixMax) qui affiche les maisons non encore
réservées ayant un prix total de location inférieur à prixMax.
e. une méthode afficherChambresLibres(typeChambre) qui affiche les chambres
d'hôtel non encore réservées de type typeChambre.

Partie II:
Afin de tester les classes créées :

a. Créer la chambre d'hôtel ayant les caractéristiques suivantes :


Code = 100, surface = 30, prix initial = 80, non réservée et de type = 'Double'.
b. Créer la maison ayant les caractéristiques suivantes :
Code = 120, surface = 35, prix initial = 350, ayant 3 pièces et non réservée.
c. Créer la maison ayant les caractéristiques suivantes :
Code = 140, surface = 9, prix initial = 150, ayant 2 pièces et non réservée.
d. Créer la chambre d'hôtel ayant les caractéristiques suivantes :
Code = 160, surface = 25, prix initial = 100, non réservée et de type = 'Single'.
e. Réserver la chambre d'hôtel de code 100, et afficher un message indiquant si la
réservation s'est bien effectuée ou non.
f. Créer une agence. Lui attribuer les chambres d'hôtel et les maisons déjà construites,
puis l'afficher.
g. Afficher les maisons libres dont le prix total de location est inférieur à 250.
h. Afficher les chambres d'hôtel libres de type 'Single'.

2/5
Problème 2: (10 points)

Partie I:
En analyse numérique, la factorisation de Cholesky, consiste, pour une matrice symétrique
définie positive A d’ordre N, à déterminer une matrice triangulaire inférieure L telle
que : A=L.LT. La matrice L est en quelque sorte une « racine carrée » de A.
Une variante de cette factorisation, nommée décomposition de Cholesky alternative,
permet d'éviter l'utilisation des racines carrées au sein des sommes et consiste à écrire la
matrice A sous la forme A=L.D.LT, que nous notons A=L.D.Lt, où D est une matrice
diagonale, L une matrice triangulaire inférieure avec des 1 sur sa diagonale et Lt sa
transposée qui est une matrice triangulaire supérieure avec des 1 sur la diagonale. Les
matrices L, D et Lt sont des matrices carrées d’ordre N.

Dans toute la suite, on supposera que la matrice A est une matrice symétrique définie positive.

 Soient les notations suivantes :

𝒂𝟎𝟎 𝒂𝟎𝟏 … 𝒂𝟎𝒋 … 𝒂𝟎(𝒏−𝟏)


𝒂𝟏𝟎 𝒂𝟏𝟏 … 𝒂𝟏𝒋 … 𝒂𝟏(𝒏−𝟏)
… … … … … …
A= 𝒂𝒊𝟎 𝒂𝒊𝟏 … 𝒂𝒊𝒋 … 𝒂𝒊(𝒏−𝟏)
… … … … … …
[𝒂(𝒏−𝟏)𝟎 𝒂(𝒏−𝟏)𝟏 … 𝒂(𝒏−𝟏)𝒋 … 𝒂(𝒏−𝟏)(𝒏−𝟏) ]

𝟏 𝟎 … 𝟎 … 𝟎 𝒅𝟎𝟎 𝟎 … 𝟎 … 𝟎
𝒍𝟏𝟎 𝟏 𝟎 𝟎 … 𝟎 𝟎 𝒅𝟏𝟏 … 𝟎 … 𝟎
… … 𝟏 … … … … 𝟎 … … … …
L= 𝒍𝒊𝟎 𝒍𝒊𝟏 … 𝟏 𝟎 𝟎 D= 𝟎 𝟎 𝟎 𝒅𝒊𝒋 … 𝟎
… … … … 𝟏 𝟎 … … … 𝟎 … …
[𝒍(𝒏−𝟏)𝟎 𝒍(𝒏−𝟏)𝟏 … … 𝒍(𝒏−𝟏)(𝒏−𝟐) 𝟏] [ 𝟎 𝟎 … 𝟎 𝟎 𝒅(𝒏−𝟏)(𝒏−𝟏) ]

𝟏 𝒍𝟏𝟎 … 𝒍𝒊𝟎 … 𝒍(𝒏−𝟏)𝟎 𝟏 𝒍𝒕𝟎𝟏 … 𝒍𝒕𝟎𝒊 … 𝒍𝒕𝟎(𝒏−𝟏)


𝟎 𝟏 … 𝒍𝒊𝟏 … 𝒍(𝒏−𝟏)𝟏 𝟎 𝟏 … 𝒍𝒕𝟏𝒊 … 𝒍𝒕𝟏(𝒏−𝟏)
Lt= … … 𝟏 … … … = … … 𝟏 … … …
𝟎 𝟎 … 𝟏 … … 𝟎 𝟎 … 𝟏 … …
… … … … 𝟏 𝒍(𝒏−𝟏)(𝒏−𝟐) … … … … 𝟏 𝒍𝒕(𝒏−𝟐)(𝒏−𝟏)
[𝟎 𝟎 … … 𝟎 𝟏 ] [𝟎 𝟎 … … 𝟎 𝟏 ]

3/5
Les matrices L et D sont calculées par les formules de récurrences suivantes:
𝒋−𝟏

𝒅𝒋𝒋 = 𝒂𝒋𝒋 − ∑ 𝒍𝟐 𝒋𝒌 𝒅𝒌𝒌 𝒑𝒐𝒖𝒓 𝟎 ≤ 𝒋 ≤ 𝒏 − 𝟏


𝒌=𝟎

𝒋−𝟏
𝟏
𝒍𝒊𝒋 = ( 𝒂𝒊𝒋 − ∑ 𝒍𝒊𝒌 𝒍𝒋𝒌 𝒅𝒌𝒌 ) 𝒑𝒐𝒖𝒓 𝒋 ≤ 𝒊 ≤ 𝒏 − 𝟏
𝒅𝒋𝒋
𝒌=𝟎

Travail demandé :

Ecrire, en Python, les fonctions suivantes :

1. saisieMatrice(n) permettant de saisir et retourner une matrice A carrée symétrique


de réels et d’ordre n.
2. decompositionCholesky(A) permettant de calculer et retourner les matrices D et L
de décrites précédemment.
3. affichageCholesky(A) permettant de calculer et afficher le produit matriciel
L.D.Lt.

Partie II :
On se propose de développer un programme Python permettant la résolution d’un système
matriciel A.X=B où A et B sont deux matrices données.

La solution consiste à déterminer et à résoudre un système équivalent de la forme:

L.D.Lt . X = B

En posant :

 𝒁 = 𝐃. 𝑳𝒕. 𝐗 ; on obtient 𝐋. 𝐙 = 𝑩
 Y = 𝑳𝒕. 𝐗 ; on obtient 𝑫. 𝒀 = 𝒁

On résout alors successivement les trois systèmes suivants :

𝐋. 𝐙 = 𝑩
{ 𝑫. 𝒀 = 𝒁
𝑳𝒕. 𝐗 = 𝐘
Dans la suite, nous utiliserons les notations suivantes :

𝒙𝟎 𝒚𝟎 𝒛𝟎 𝒃𝟎
𝒙𝟏 𝒚𝟏 𝒛𝟏 𝒃𝟏
… … … …
X= 𝒙𝒊 Y= 𝒚𝒊 Z= 𝒛𝒊 B=
𝒃𝒊
… … … …
[𝒙(𝒏−𝟏) ] [𝒚(𝒏−𝟏) ] [𝒛(𝒏−𝟏) ] [𝒃(𝒏−𝟏) ]

4/5
Pour la résolution du système L.Z=B, on utilise les formules de récurrences suivantes :

𝒃𝟎
𝒛𝟎 =
𝒍𝟎𝟎

𝒊−𝟏
𝟏
𝒛𝒊 = (𝒃𝒊 − ∑ 𝒍𝒊𝒋 𝒛𝒋 ) 𝒊 ∊ {𝟏, 𝟐, … , 𝒏 − 𝟏}
𝒍𝒊𝒊
{ 𝒋=𝟎

Pour la résolution du système D.Y=Z , on utilise la formule de récurrence suivante :


𝒛𝒊
𝒚𝒊 = 𝒊 ∊ {𝟎, 𝟏, 𝟐, … , 𝒏 − 𝟏}
𝒅𝒊𝒊

Pour la résolution du système 𝐋𝐭. 𝐗 = 𝐘, on utilise les formules de récurrences suivantes :


𝒚𝒏−𝟏
𝒙𝒏−𝟏 =
𝒍𝒕(𝒏−𝟏)(𝒏−𝟏)
𝒏−𝟏
𝟏
𝒙𝒊 = (𝒚𝒊 − ∑ 𝒍𝒕𝒊𝒋 𝒙𝒋 ) 𝒊 ∊ {𝒏 − 𝟐, 𝒏 − 𝟑, … , 𝟎}
𝒍𝒕𝒊𝒊
{ 𝒋=𝒊+𝟏

Travail demandé :

Ecrire, en Python, les fonctions suivantes :

1. sommeL (L,Z,i) qui calcule et renvoie la somme suivante :


𝒊−𝟏

∑ 𝒍𝒊𝒋 𝒛𝒋
𝒋=𝟎

2. sommeLt (Lt,X,i,n) qui calcule et renvoie la somme suivante :


𝒏−𝟏

∑ 𝒍𝒕𝒊𝒋 𝒙𝒋
𝒋=𝒊+𝟏
3. saisieVecteur (n) qui permet de saisir une matrice B de réels ayant n lignes et une
colonne
4. calculerZ (L, B) qui permet de calculer et renvoyer le vecteur Z solution du système
L.Z = B.
5. calculerY (D, Z) qui permet de calculer et renvoyer le vecteur Y solution du système
D.Y = Z.
6. calculerX (Lt, Y) qui permet de calculer et renvoyer le vecteur X solution du
système 𝐋𝐭. 𝐗 = 𝐘.
7. resolutionCholesky(A,B) qui permet de résoudre le système A.X=B selon la
méthode de Cholesky puis d’afficher le vecteur X résultant ainsi que le vecteur XS
solution du même système par la fonction prédéfinie solve(A,B) du sous module
linalg du module numpy.

5/5

Vous aimerez peut-être aussi