Stanislas
DS n°02 Correction
Devoir Surveillé
2h
MPSI / PCSI 21 mars 2015
Solution de l’exercice 1.
1 . a) Coder l'intensité d'une couleur nécessite 1 octet. Coder un pixel nécessite de coder un triplet de couleurs, soit 3 octets. Lorsque l'image contient 1024 pixels en largeur et 1024 en hauteur, elle contient 1024
2pixels. Ainsi, le nombre d'octets nécessaires pour la stocker est 3 · 1024
2. Finalement, le stockage de cette image nécessite
3 · 2
20octets . b) Le codage d'une image monochrome nécessite de coder :
• la couleur, soit 3 octets.
• la valeur de la largeur, ici 256 = 2
8soit 1 octet.
• la valeur de la hauteur, ici 1024 = 2
10soit 2 octets.
Ainsi, le nombre minimal d'octets nécessaire est de 6 octets . 2 . a) Eectuons des divisions euclidiennes :
191 = 11 · 16 + 15
= (BF )
16, 48 = 3 · 16
= (30)
16. Ainsi, le code HEXA de la couleur fraise est
#BF3030 . b) Comme,
(21)
16= 2 · 16 + 1
= 33, (17)
16= 16 + 7
= 23, (7D)
16= 7 · 16 + 13
= 125, alors le codage RGB du bleu Klein est
(33, 23, 125).
c) On utilise les primitives proposées dans l'énoncé. Si l'entier est inférieur à 9 , il est codé par lui-même, sinon on utilise les lettres de l'alphabet.
1
def s e i z e (n ) :
2
i f n < 10 :
3
return str (n)
4
else :
5
return chr (n−10+65)
Stanislas MPSI / PCSI
d) On calcule le reste et le quotient de la division euclidienne de l'argument par 16 puis on utilise la fonction précédente.
1
def dec_to_hex (n ) :
2
a , b = n//16 , n%16
3
return s e i z e ( a ) + s e i z e (b)
e) On parcourt le triplet RGB et on concatène les écritures en base 16 pour obtenir le code HEXA.
1
def rgb_dec_to_hex ( couleur ) :
2
s = '#'
3
for p in couleur :
4
s = s + dec_to_hex (p)
5
return s
3 . a) D'une part, comme M et m sont deux entiers compris entre 0 et 255 , leur moyenne l'est également. Ainsi,
` ∈ [0, 1].
Comme M et m sont des entiers positifs, alors
MM+m−m∈ [0, 1] . De plus, si ` > 1/2 , alors M + m ∈ [255, 510] et 510 − M − m ∈ [0, 255] et s ∈ [0, 1] . Finalement,
s ∈ [0, 1].
Si M = r et v > b , alors M − m = r − b > v − b > 0 . Ainsi, t ∈ [0, 60] . Si M = r et v < b , alors (v − b)/C ∈ ] − 1, 0] et t ∈ [300, 360[ . Dans les autres cas, le rapport est compris strictement entre
− 1 et 1 et, nalement,
t ∈ [0, 360[.
Le triplet (t, s, `) étant un triplet de ottants, chacun des éléments nécessite 64 bits de stockage soit 8 octets. Ainsi, le codage du triplet nécessite
24 octets .
b) Comme T ∈ J 0, 360 K, son stockage nécessite 2 octets. Comme S et L sont des entiers de l'intervalle J 0, 100 K, leur stockage nécessite 1 octet. Ainsi, le stockage du triplet nécessite
4 octets .
Solution de l’exercice 2.
1.
1
def f 1 ( alpha2 , gamma ) :
2
return ( a−L* cos ( alpha2)+ l * s i n (gamma))**2 \
3
+(L* s i n ( alpha2)+ l * cos (gamma))**2
−l **2
2.
1
def determine_gamma ( g , alpha2 , x1 , x2 ) :
2
i f g ( alpha2 , x1 )* g ( alpha2 , x2 ) >0:
3
print ( 'pas de zero' )
4
return 0
5
e l i f g ( alpha2 , x1 ) > 0 :
Stanislas MPSI / PCSI
6
x1 , x2=x2 , x1
7
while abs( x1−x2)>1e
−9:8
tmp = ( x1+x2 )/2
9
i f g ( alpha2 , tmp) > 0 :
10
x2 = tmp
11
else :
12
x1 = tmp
13
return ( x1+x2 )/2
3.
1
def f 2 ( alpha2 , lamb ) :
2
gamma = determine_gamma ( f1 , alpha2 ,
−20* pi /180 ,80* pi /180)3
return ( a+c* s i n ( alpha2)+ l * cos (gamma))**2 +\
4
(b−c* cos ( alpha2)− l * s i n (gamma))**2
−lamb**2
4.
1
def d e r i v e e ( f , x , y , h ) :
2
return ( f ( x , y+h)− f (x , y ) ) / h
5.
1
def determine_lambda ( g , alpha2 , lambda0 ) :
2
lambda = lambda0
3
h = 1e−5
4
while abs( g ( alpha2 ,lambda))>1e
−9:5
lambda = lambda
−g ( alpha2 , lambda) / d e r i v e e ( g , alpha2 , lambda , h)
6
return lambda
6.
1
alpha2 = l i n s p a c e (−10* pi /180 ,10* pi /180 ,50)
2
lambda1 = [ ]
3
for alpha in alpha2 :
4
lambda1 . append ( determine_lambda ( f2 , alpha , 1 0 0 0 ) )
5
6
p l o t ( alpha2 *180/ pi , array ( lambda1 ) )
7
x l a b e l ( 'Alpha 2 (degre)' )
8
y l a b e l ( 'Lambda (mm)' )
9
t i t l e ( 'Evolution de la longueur du verin en fonction de l\'angle alpha2' )
10
show ( )
Stanislas MPSI / PCSI