Vous êtes sur la page 1sur 7

Institut d'Optique Graduate School – Palaiseau Cursus Ingénieur, 1ère année – Année 2018-2019

[6N-076-SCI]
Initiation au Calcul Scientifique (avec Matlab)
EXAMEN
13 mars 2019
Durée: 1h30
Documents interdits (excepté un dictionnaire papier pour les élèves non nativement francophones)
Calculette interdite
Ordinateur, tablette, téléphone, montre et tout dispositif connecté interdits

L'examen est constitué d'une partie Questionnaire à Choix Multiple (QCM) et d'une partie de questions à ‘réponses
libres’.
Vos réponses au QCM doivent être reportées sur la feuille de réponse séparée en suivant bien les indications
données sur celle-ci. (Indiquez bien vos nom et prénom sur cette feuille de réponse).
Les réponses en ‘format libre’ doivent être écrites sur une copie d'examen standard.

Barème indicatif: 11 questions du QCM sur ~11 points ; Questions à réponses libres sur ~9 points + ~2pts Bonus

⨳⨳⨳⨳⨳⨳⨳
QCM
⨳⨳⨳⨳⨳⨳⨳

Pour chaque sous-proposition d'une question Qx, déterminez si celle-ci est Vraie ou Fausse et reportez
votre réponse par V☒ F☐ ou V☐ F☒ sur la feuille de réponses prévue à cet effet.
Pour chaque sous-proposition, une réponse juste est comptée +1, une réponse inexacte est comptée –½, une
abstention ou absence de réponse est comptée 0. La note totale attribuée à une question Qx à sous-propositions
est (1/ ) × somme des points attribués aux sous-questions.

Q1: On souhaite créer un vecteur ligne x contenant 21 nombres régulièrement espacés entre 0 inclus et 7 inclus.
Indiquez, pour chacune des 4 instructions Matlab ci-dessous, si elle réalise effectivement cette opération :

1.Ⓕ x=0:(7/21):7 Donne un vecteur ligne de 22 éléments

2.Ⓥ x=0:(7/20):7 (La syntaxe de : est début:pas:fin et il y a un panneau grillagé de moins que de piquets, d'où le 7/20 et pas 7/21)

3.Ⓕ x=0:7:(7/21) Donne un vecteur ligne de 1 élément [0]

4.Ⓕ x=0:7:(7/20) Donne un vecteur ligne de 1 élément [0]

Q2: Soit x=[2.3 0 -1.5 7.2] . Indiquez, pour chacune des 4 instructions Matlab ci-dessous, si elle donne un
résultat sans provoquer d'erreur.

1.Ⓥ x+[1 2 3 4]

2.Ⓕ x*[1 2 3 4] Cette instruction provoque une erreur de dimension pour * la multiplication matricielle

3.Ⓥ 1./x (La présence d'un zéro dans le vecteur x n'est pas un problème ; il donnera juste une valeur Inf (∞) dans le vecteur résultat)

4. Ⓥ cos(x).^2

1/7
Q3: M est une matrice de 5 lignes × 3 colonnes, v=[1 2 3 4 5]. Indiquez, pour chacune des 4 instructions
Matlab ci-dessous, si elle donne un résultat sans provoquer d'erreur.

1.Ⓕ M*v Cette instruction provoque une erreur de dimension pour * la multiplication matricielle

2.Ⓥ M\v(:) Dans la mesure où v(:) donne un vecteur colonne de 5 éléments, les dimensions sont correctes pour la résolution du pb de MC

3.Ⓥ v*M Dans la mesure où v a 5 colonnes et M a 5 lignes, les dimensions sont correctes pour ce produit matricielle

4.Ⓕ M+v Cette instruction provoque une erreur de dimension (car v est un vecteur ligne ayant plus de colonnes que M)

Q4: On lance dans Matlab les commandes


x=linspace(0,pi,1001);
y1=exp(-2*x+3);
y2=x.*(pi-x)+1;
figure
puis la ou les commandes des propositions 1. ou 2. ou 3. ou 4. .
Indiquez si les propositions sont vraies ou fausses :

1.Ⓕ plot(x,y1,y2) trace sur un même graphique deux courbes en trait continu dans deux couleurs
différentes.

2.Ⓥ plot(x,y1)
hold on
plot(x,y2) trace sur un même graphique deux courbes en trait continu dans deux couleurs différentes.

3.Ⓕ plot(x,y1,'bo-') provoque une erreur car bo n'est pas une abréviation correcte d'un nom de couleur
en langue anglaise. Le o dans la chaîne de caractères est interprété comme la demande de marqueurs ○ ; cela donne donc un trait plein
bleu avec des marqueurs ○ sans provoquer d'erreur.

4.Ⓕ semilogv(x,y1) trace une courbe sur un graphique ayant une échelle horizontale linéaire et une échelle
verticale logarithmique. Le nom correct est semilogy .

Q5: La fonction MaFonction prend 3 arguments d'entrée et 2 arguments de sortie ; indiquez la ou les bonnes
syntaxe(s) Matlab pour l'en-tête de la fonction :

1.Ⓕ function (y1,y2) = MaFonction(x1,x2,x3);

2.Ⓕ function [y1,y2] = MaFonction[x1,x2,x3];

3.Ⓥ function [y1,y2] = MaFonction(x1,x2,x3);

4.Ⓕ function (y1,y2) = MaFonction[x1,x2,x3];

2/7
Q6: On souhaite réaliser dans un programme Matlab une boucle dans laquelle une variable k prendra
successivement les valeurs entières impaires de 1 à 7.
Indiquez lesquelles des propositions ci-dessous sont correctes:
1.Ⓕ for k in [1,3,5,7] (Syntaxe de Python mais pas de Matlab)
¤¤¤
end
2.Ⓥ for k=1:2:7
¤¤¤
end
3.Ⓕ for k=1:7:2 (La syntaxe de : est début:pas:fin. Donc la boucle for ne réalise ici qu'une seule itération avec k=1)
¤¤¤
end
4.Ⓕ for (k,1,7,2) (Erreur de syntaxe pour Matlab)
¤¤¤
end

Q7: Indiquez si les propositions suivantes sont vraies ou fausses :


1.Ⓕ Une erreur absolue est toujours positive. (Une erreur peut être par excès mais aussi par défaut)

2.Ⓕ Une incertitude relative peut être négative. (Une incertitude est toujours positive par définition)

3.Ⓕ Il est toujours nécessaire de connaître l'erreur absolue ou l'erreur relative d'un calcul réalisé. (Si on connaît
l'erreur d'un calcul, alors on connaît la valeur exacte que l'on aurait dû trouver. Il est donc impossible de connaître l'erreur sur un calcul dans le
cas général. C'est par contre une estimation de son incertitude qu'il est important de connaître pour qu'un calcul soit utilisable)

4.Ⓕ Un calcul en virgule flottante de la meilleure précision possible conduit à une incertitude absolue de l'ordre
de ε . (Ce serait vrai pour une incertitude relative mais pas pour une incertitude absolue! Une incertitude absolue a usuellement une dimension
[watt, mètre, ...] alors que ε est un nombre sans dimension ; ils NE peuvent donc PAS être comparés dans le cas général! Et puis, même
indépendamment des dimensions, calculer par exemple une grandeur proche de ℏ≈1.05×10–34 [J.s] avec une incertitude absolue (en double
précision) de ~2×10–16 [sans dimension] ne serait vraiment pas très précis.... Le codage en virgule flottante de nombres de l'ordre de 10–34 permet
d'avoir une incertitude relative de l'ordre de ε et donc une incertitude absolue de l'ordre de ε×10–34 sur ceux-ci).

Q8: On considère l'échantillonnage sur points ( entier pair) d'un signal temporel ( ) commençant en t = 0 et
ayant un pas = . Vous considérerez que les variables N, tau (représentant ) et T=N*tau ont été
préalablement définies dans Matlab.
Indiquez si les vecteurs d'abscisses de l'échantillonnage temporel t proposés ci-dessous sont corrects :
1.Ⓕ t=linspace(0,T,N) Le point à la valeur = × ne doit pas faire partie de l'échantillonnage

2.Ⓕ t=0:tau:T Idem

3.Ⓥ t=(0:N-1)*tau
4.Ⓥ t=linspace(0,T-tau,N)

Q9: On prend la Transformée de Fourier Discrète (TFD) du signal échantillonné s considéré à la question Q8
précédente par l'expression sTFD=fftshift(fft(s)) . Vous considérerez que les variables N ( entier
pair) et fe=1/tau ont été préalablement définies dans Matlab.
Indiquez si les vecteurs d'abscisses de l'échantillonnage fréquentiel f proposés ci-dessous sont correctement
adaptés au vecteur sTFD ainsi calculé :
1.Ⓕ f=linspace(0,fe,N) Ce n'est pas une représentation “centrée” avec la fréquence nulle “au milieu” adaptée au fftshift externe

2.Ⓕ f=(0:N-1)*fe/N Idem

3.Ⓥ f=(-N/2:N/2-1)*fe/N Bon échantillonnage “centré” pour N pair incluant –fe/2 mais pas +fe/2

4.Ⓕ f=linspace(-fe/2,fe/2,N) Contient indûment +fe/2

3/7
Q10: On souhaite trouver la courbe d’équation = + cos + cos 2 qui minimise
+
= ∑-
!" #$ %&' ( #) %&' ( *
./0 > 3) de mesure ., .
,+
à partir des points ( entachés d’une
incertitude 4. en y. Pour reformuler ce problème linéaire de moindres carrés sous la forme
= 5M 7 − 95 (où ‖ ‖ représente la norme euclidienne) avec 7 = ; <, quelles formes doivent prendre

la matrice M et le second membre 9 ?

⋮ ⋮ ⋮
0 %&'+ ( %&'+ (

1.Ⓕ M = =, + ,+ ,+
? et 9 = @ . ⁄4. B

⋮ ⋮ ⋮

⋮ ⋮ ⋮ ⋮
0 %&' ( %&' (
2.Ⓥ M = =, , ,
? et 9 = @ . ⁄4. B
⋮ ⋮ ⋮ ⋮

E⋯ ⋯I
0
,+
D H
M = D⋯ ⋯H et 9 = J⋯
%&'+ (
. ⁄4. ⋯K
D ,+
H
3.Ⓕ
D⋯ %&'+ (
⋯H
C ,+ G

E⋯ ⋯I
0
,
D H
M = D⋯ ⋯H et 9 = J⋯
%&' (
4.Ⓕ , . ⁄4. ⋯K
D H
C⋯ ⋯G
%&' (
,

Q11: Indiquez si les propositions suivantes sont vraies ou fausses :

1.Ⓕ Un problème est dit «mal conditionné» si sa solution change peu lorsque l'on change un peu les paramètres
du problème. C'est le contraire...

2.Ⓥ Le nombre de condition d'une matrice cond(M) est un nombre réel ≥ 1.

3.Ⓥ Si le nombre de condition d'une matrice rectangulaire plus haute que large, cond(M), vaut 1, alors le
problème de moindres carrés associé à cette matrice est très bien conditionné. Puisque cond(M) ≥ 1 et que le
conditionnement est d'autant meilleur que cond(M) est petit, on ne peut pas avoir un système mieux conditionné que pour cond(M) = 1 .

4.Ⓕ On souhaite résoudre un problème de moindre carré linéaire dont la matrice du problème à un nombre de
condition de cond(M)≈1000. Les données de départ (matrice du problème et vecteur second membre) sont
connues avec une incertitude relative de δrelatif ≈ 0.1%=0.001. On peut avoir une grande confiance dans le
résultat du calcul puisque cond(M)×δrelatif ≲ 1. C'est le contraire, l'incertitude relative sur le résultat est de l'ordre de 1=100%

4/7
⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳
Questions ‘à réponse libre’
⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳⨳
[Barème indicatif : ~9pts + ~2pts Bonus]

Veuillez écrire très lisiblement les codes Matlab.


Il ne doit y avoir aucune ambiguïté entre ( ) , [ ] , { } , entre . et , , entre : et ; , ou encore entre
0(zéro) et O(o majuscule), ou encore 1(un), I(i majuscule) et l(L minuscule), entre ' et ", etc...

Exercice n°1: [~2.5pts]


Donnez les lignes de commandes Matlab permettant de tracer sur un même graphique les courbes de
M( ) = cos(2 ) et N( ) = sin(3 ) sur l'intervalle [−Q, +Q], ainsi qu'afficher un titre et des labels pour l'axe
horizontal et l'axe vertical et une légende indiquant «cos(2x)» et «sin(3x)»

x=linspace(-pi,pi,1001); ½pt (vecteur de x par linspace ou : )


f=cos(2*x);
g=sin(3*x); ½pt (calculs vectorisés corrects de cos(2x) et sin(3x)
figure
plot(x,f,x,g) ½pt (tracé du graphique avec les 2 courbes. Usage alternatif de hold on OK )
title('Exercice n°1')
xlabel('x') ½pt (title et xlabel, ylabel)
ylabel('f et g')
legend('cos(2x)','sin(3x)') ½pt (usage correct de legend)

Exercice n°2: [~2pts +~1pt Bonus]


On souhaite calculer numériquement la fonction ℎ( ) = S ( − 1 par l'expression Matlab exp(x)-1 . On rappelle
que le développement limité de S ( pour au voisinage de 0 est 1 + + ⋯.
Le calcul en virgule flottante de exp(x) et de exp(x)-1 pour |x|< quelques ε a en fait une allure de fonction en
marches d'escalier à cause des arrondis de S ( au nombre représentable en virgule flottante le plus proche dans le
calcul de exp(x).
Dessinez à la main l'allure du calcul en virgule flottante de exp(x) pour x sur l'intervalle [0, +3ε] en indiquant
bien les valeurs des plateaux et la position des discontinuités. (Superposez la fonction mathématique N( ) = 1 +
sur ce graphique). [1pt]
Même question sur l'intervalle [−2ε, 0] ; justifiez pourquoi les marches n'ont pas la même amplitude que sur le
graphique précédent. [½pt pour bon plateau à 1–k.ε/2 et discontinuités aux nombres impairs de –ε/4]
En déduire (hors cas = 0) l'intervalle de sur lequel la valeur absolue de l'erreur relative sur le calcul de
exp(x)-1 est de 100% . [½pt]
Question Bonus [~+1pt]: Exprimez à l'aide d'un sinus hyperbolique la fonction ℎ( ) × S (⁄ . [Rappel: le sinus
hyperbolique est défini par sh( ) ≝ (S ( − S ( )⁄2 ]. En déduire une méthode numériquement stable de calcul
de ℎ( ) utilisant la fonction Matlab native sinh qui calcule le nombre en virgule flottant le plus proche du sinus
hyperbolique ‘mathématique’ pour tout argument réel.

5/7
■ Pour > 0 (et ≪ 1 , exp(x) (le calcul en virgule flottante de S ( Y 1 ) est compris dans l'intervalle [1, 2[ et
se code donc sous la forme +Z[ avec 1 \ ] 2.
Les valeurs représentables en virgule flottante très proches de 1 (et ≥1) sont donc 1, 1+ε, 1+2ε, 1+3ε, ... vu la
‘granularité’ de ε de la mantisse . Les plateaux de la fonction en marches d'escalier seront donc à ces valeurs.
+
L'arrondi de S ( ≅ 1 (le terme suivant du développement limité en
(
⋘ ε étant totalement négligeable) au nombre
représentable le plus proche conduit donc à des discontinuités aux nombres impairs de ε/2 (puisque dès que
s'éloigne de plus de ε/2 de `. ε ` ∈ b , le nombre représentable le plus proche de 1 est 1 c d . ε et
1 3 5
non plus 1 `. ε . Dès lors les discontinuités de la fonction en marche d'escalier sont en e2 . ε, e2 . ε, e2 . ε, …

■ Pour ] 0 (et | | ≪ 1 , exp(x) (le calcul en virgule flottante de S ( \ 1 ) est compris dans l'intervalle [0.5, 1[
(dès lors qu'il est différent de 1) et se code donc sous la forme Z d avec 1 \ ] 2.
Les valeurs représentables en virgule flottante très proches de 1 (et ≤1) sont donc 1, 1–ε/2, 1–2ε/2, 1–3ε/2, ... vu
la ‘granularité’ de Z d h des nombres réels représentables dans cette plage [0.5, 1[ . Les plateaux de la fonction
en marches d'escalier seront donc à ces valeurs, et donc séparés de ε/2 et non plus ε.
+
L'arrondi de S ( ≅ 1 (le terme suivant du développement limité en
(
⋘ ε étant totalement négligeable) au nombre
représentable le plus proche conduit donc dans cette plage à des discontinuités aux nombres impairs de ε/4
(puisque dès que s'éloigne de plus de –ε/4 de 8`. ε/2 ` ∈ b , le nombre représentable le plus proche de 1
est 1 8 c d . ε/2 et non plus 1 8 `. ε/2 . Dès lors les discontinuités de la fonction en marche d'escalier sont en
8 1e4 . ε, 8 3e4 . ε, 8 5e4 . ε, 8 7e4 . ε, …
k k
■ On voit donc que exp(x) donne exactement 1 sur l'intervalle K 8 l , J. Dès lors exp(x)-1 donnera
exactement 0 sur ce même intervalle au lieu de donner x, ce qui conduit à une erreur relative de ±100% hors l'unique
point valant exactement 0, où la valeur 0 obtenue est juste et où l'erreur relative ne pouvait de toute façon par être définie. (En fait, c'est
k k
même vrai pour l'intervalle fermé J8 , K, quel que soit le sens de l'arrondi lorsque l'on est exactement au milieu de deux valeurs codables).
l

6/7
Question Bonus:
ℎ S (⁄ = S ( − 1) × S (⁄ = !S #(/ − S (⁄ * = 2 × sh( ⁄2). Dès lors, on peut écrire
ℎ( ) = 2 × sh( ⁄2) × S #(/ . Si sh( ⁄2) est bien calculé numériquement pour | | ≪ 1 (très faible |erreur
relative|), le produit avec S #(/ , proche de 1 mais également très bien calculé avec une très faible erreur relative,
donnera un résultat entaché d'une très faible erreur numérique relative.
Donc le calcul Matlab 2*sinh(x/2).*exp(x/2) est une formulation numériquement stable pour le calcul de
ℎ( ) = S ( − 1 .

Exercice n°3: [~4.5pts +~1pt Bonus]


[en-tête 0.5pt ; en-tête étendu: 1pt ; erreur si sous-dét.: 0.5pt ; construction matrice et vecteur: 1.5pts ; résolution et retour résultats: 1pt]
Écrivez le code d'une function résolvant le problème de moindres carrés linéaire décrit à la question Q10 du QCM.
Celle-ci acceptera en arguments d'entrée trois vecteurs représentants . , . et 4. et retournera trois arguments de sortie, les
scalaires , et .
Cette fonction déclenchera une erreur (avec un message informatif clair) si le problème des moindres carrés est sous-
déterminé.
N'oubliez pas de rédiger l'en-tête étendu de cette fonction.
Question Bonus [~+1pt]: Cette fonction émettra un «warning» si le conditionnement du problème est tel que l'incertitude sur le

‖4. ‖⁄‖ . ‖, la norme euclidienne d'un vecteur pouvant être calculée par la fonction Matlab native norm .
résultat final n'est pas garantie inférieure ou de l'ordre de 1%, l'incertitude relative sur les données en entrée étant donnée par

function [a,b,c]=MC_1_cosx_cos2x(x,y,s)
% MC_1_cosx_cos2x - Approximation sur la base {1,cos(x),cos(2x)} en sens des Moindres Carrés
% USAGE: [a,b,c]=MC_1_cosx_cos2x(x,y,s)
% x,y,s: vecteurs réels de même longueur m (≥3) décrivant les abscisses x, les ordonnées y et les
% incertitudes s (σ) sur y d'un jeu de données expérimentales à ajuster sur la base des
% fonctions {1,cos(x),cos(2x)} au sens des Moindres Carrés (linéaires).
% Les éléments du vecteur s (σ) doivent tous être > 0.
% a,b,c: scalaires réels donnant les coefficients respectifs des fonctions 1,cos(x),cos(2x) de la
% meilleure approximation des données par a+b.cos(x)+c.cos(2x).
% Une erreur est déclenchée si m<3 (problème SOUS-déterminé).
% Un warning est déclenché si l'incertitude estimée sur le résultat, à partir du nombre de condition
% de la matrice du problème et de l'erreur relative sur y (estimée par norm(s)/norm(y)) est > 1%.

m=length(x);
if m<3
error('Problème SOUS-déterminé')
end
if length(y)~=m || length(s)~=m % FACULTATIF
error('Les longueurs des vecteurs x, y et s ne sont pas identiques entre-elles') % FACULTATIF
end % FACULTATIF

M=[1./s(:) cos(x(:))./s(:) cos(2*x(:))./s(:)];


Y=y(:)./s(:);
A=M\Y; % A=[a;b;c]
a=A(1);
b=A(2);
c=A(3);

% Question BONUS:
if cond(M)*norm(s)/norm(y) > 0.01
% Nota: l'incertitude estimée sur le résultat d'un pb de MC est
% ||ΔA||/||A||≲cond(M).||Δy||/||y|| avec ici ||Δy||=||σ||,
% d'où le test réalisé
warning('L''incertitude relative estimée sur [abc] n''est pas garantie <~1%')
fprintf('Pour information, cond(M)=%1.2e, Δy_relatif=%1.2e, Δabc_relatif_estimé=%1.2e\n',...% FACULTATIF…
cond(M),norm(s)/norm(y),cond(M)*norm(s)/norm(y)) % FACULTATIF…
end

end
⨳⨳⨳⨳⨳⨳⨳
7/7

Vous aimerez peut-être aussi