Mathématiques I, Python pour tous! TP Noté . Durée 1h30 np.linalg

Université de Rouen
L2 IBIOM
Année 2009-2010
Mathématiques I, Python pour tous!
TP Noté . Durée 1h30
Les documents Python, fiches de TD, fiches de TP sont autorisés. Il est interdit d’utiliser tout
logiciel de communication (navigateur, irc, mail, etc) pendant l’épreuve. Les programmes/mani-
pulations sont à inclure dans un fichier texte ou Python, les commentaires peuvent y être inclus
ou rendus sur feuille. Le nom du fichier sera nom_tpnote.{txt,py} nom est votre nom. À la
fin de l’épreuve, envoyez le par courrier électronique à [email protected]. Avant
de partir assurez-vous que le fichier a bien été reçu !
Exercice 1. Soit la matrice de taille 8
B=
10000001
10000001
10000001
10000001
10000001
10000001
10000001
11111111
.
Faire trois constructions différentes de cette matrice, dont une avec boucle(s) et une autre sans boucle et
sans entrer tous les coefficients un à un.
>>> import numpy as np
>>> b=np . ones ( ( 7 , 1 ) )
>>> a=np . concatenate ( ( b , np . zeros ( ( 7 , 6 ) ) ,b ) , axi s =1)
>>> b=np. concatenate ( ( a ,np. ones ( ( 1 , 8 ) ) ) )
>>> b # Ok !
>>> b=np . zeros ( ( 8 , 8 ) )
>>> for iin range (7) :
. . . b[ i ,0]=1
. . . b[ i ,7]=1
. . . b[7 , i ]=1
. . .
>>> b # Ok !
>>> b=np . zeros ( ( 8 , 8 ) )
>>> b[: ,0]=1
>>> b[: ,7]=1
>>> b[7 ,:]=1
>>> b # Ok e t de t r o i s !
Exercice 2. Nous allons étudier expérimentalement l’effet d’une petite variation sur les coefficients du
second membre sur la solution du système linéaire. Le but est qu’il faut toujours garder un œil critique sur
les calculs numériques. Pour cela nous aurons besoin du calcul des normes 2 (voir documentation). Si b
est un vecteur de Rn,b2ou la norme euclidienne de best la généralisation au cas de la dimension nde
la distance euclidienne (plan ou espace)
b2=b2
1+b2
2+ · · · + b2
n,
b1,...,bnsont les composantes du vecteur bdans la base canonique. Pour les curieux la norme 2 d’une
matrice Acarrée de taille n, notée A2, est le plus petit réel vérifiant pour tout xdans Rn
Ax2≤ ∥A2x2.
Dans les deux cas, Numpy calcule cette quantité via les commandes np.linalg.norm(b,2) et
np.linalg.norm(A,2).
Soient A(différente du TP réel) et bdéfinis par
A=
8 6 4 1
1 4 5 1
8 4 1 1
1 4 3 6
b=
19
11
14
14
.
(a) Calculer la solution de ce système linéaire (à l’aide de Python bien sûr).
(b) On perturbe ! Calculer la solution ydu système perturbé Ay =b+b
b=
0.01
0.05
0.07
0.05
On pose x=yx. Calculer le coefficient d’amplification d’erreur x2
x2
b2
b2. Qu’observez-vous ?
>>> a=np . array ( [ [ 8 . , 6. , 4 , 1] ,[1 , 4 , 5 , 1] ,[8 , 4 ,1 , 1 ] , [ 1 , 4 , 3 , 6 ] ] )
>>> b=np . array ( [ 1 9 . , 11 , 14 , 14] )
>>> x=np . l i n a l g . solve ( a , b )
>>> x
array ( [ 1. , 1. , 1. , 1 . ] )
>>> db=np. array ( [ 0 . 0 1 , 0.05 , 0.07 , 0.05])
>>> y=np . li n a lg . solve ( a , b+db)
>>> y
array ([ 2.34 , 9.745 , 4.85 , 1.34 ] )
>>> np. linalg .norm( yx , 2 ) /np. li n a lg .norm( x , 2 ) *np. l i n a l g .norm(b , 2 ) /np. l i n a l g .norm(db, 2 )
1667.9726140587538
# c o effic i ent d amplification de l ’ erreur important
Exercice 3. Gradient à pas fixe
Soient la matrice Aet le vecteur Fdéfinis par
A=
2100
1210
0121
0012
,F=
1
1
1
7
(a) Générer la matrice Aet le vecteur F.
(b) Résoudre (à l’aide de Python) le système linéaire AX =F.
(c) On définit une suite de vecteur de R4par
X0=
1
1
1
1
,Xn+1=Xn.5(AXnF) pour n0.
-i- Écrire une fonction en Python grafix(n) qui calcule Xn. Calculer en particulier X10,X50,X100
et X2000. (si vous n’avez pas réussi à écrire la fonction grafix faîtes au moins ces calculs à
l’aide de boucle)
-ii- Comparer les valeurs obtenues pour ngrand avec la solution du système linéaire calculée en à
la question (b).
-iii- Quel est (expérimentalement) le comportement de la suite Xn?
(d) On définit une suite de vecteur de R4par
X0=
1
1
1
1
,Xn+1=Xn5(AXnF) pour n0
-i- Écrire une fonction en Python grafix2(n) qui calcule Xn. Calculer en particulier X10,X50,
X100.
-ii- Le comportement est-il le même qu’à la question précédente? Quelle est la différence?
>>> import numpy as np
>>> a=np . array ( [ [ 2 , 1. , 0 , 0 ] , [ 1 , 2 , 1 , 0 ] , [0 ,1 ,2 ,1] ,[0 ,0 ,1 ,2] ] )
>>> f=np. array ([1 , 1 ,1 ,7])
>>> x=np. linal g . solve (a , f )
>>> x
array ( [ 0.4 , 0.2 , 1.8 , 4 . 4 ] )
>>> def graphix (n ) :
. . . import numpy as np
. . . z=np . copy ( x0 )
. . . for i in range (n ) :
. . . z=z .5*(np. dot (a , z)f )
. . . return z
>>> graphix (10)
array ( [ 0.5703125 , 0.08691406 , 1.52441406, 4.33007812])
>>> graphix (50)
array ([ 0.40003545, 0.19997646, 1.79994265, 4.39998545])
>>> graphix (100)
array ( [ 0.4 , 0.2 , 1.8 , 4 . 4 ] )
>>> graphix (2000)
array ( [ 0.4 , 0.2 , 1.8 , 4 . 4 ] )
# expérimentalement : convergence vers la solution
# valeurs tr ès proches , à la précision de la machine près
# de la solution exacte , par exemple , faisons la différence
>>> graphix(2000)x
array ( [ 2.77555756e16, 5.27355937e16, 6.66133815e16,
8.88178420e16])
>>> graphix(100)x
array ( [ 8.86035634e10, 5.88368826e10, 1.43363565e09,
3.63632680e10])
# maintenant grafix2 (n)
>>> def graphix2 (n ) :
. . . import numpy as np
. . . z=np . copy ( x0 )
. . . for i in range (n ) :
. . . z=z5*(np. dot ( a , z)f )
. . . return z
. . .
>>> graphix2 (10)
array ( [ 9.55172743e+11 , 1.47898278e+12, 1.39649941e+12 ,
8.21711843e+11])
>>> graphix2 (50)
array ( [ 1.81355484e+61, 2.93439324e+61 , 2.93439308e+61,
1.81355458e+61])
>>> graphix2 (100)
array ([ 7.86773509e+122, 1.27302628e+123, 1.27302628e+123,
7.86773509e+122])
>>> # expérimentalement : ça diverge !
1 / 4 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !