Vous êtes sur la page 1sur 3

1 of 3

Analyse numérique (L2S4 / PSI)


Sujet de travaux pratiques no 1
Responsable : Christian Boily, Enseignant, Observatoire astronomique

Préambule. Vous devez sauvegarder vos codes Python 3 dans un chier texte
d’extension .py créé, soit à partir de Spyder ; soit par un éditeur de texte (tel que Emacs) ;
soit encore vous choisissez de travailler avec l’IDE jupyter-lab (interface Firefox). Dans
tous les cas, véri ez bien que vous utilisez la version Anaconda de python installée sur le
serveur de la Faculté de Physique (VMware Horizon).

Exo 1 : Les suites numériques, termes génériques


Soit une suite numérique { ai } que nous devons générer à partir d’une expression
mathématique. Il faudra recouvrer cette suite de N éléments non nuls, d’abord par
l’utilisation d’une boucle avec appel à fonction ; puis dans un second temps, par
l’utilisation de vecteurs numpy (Exo 2).

1
<latexit sha1_base64="7u5EQmMicloC+8DmJw8BgeX9zQM=">AAACKnicbZDNattAFIVHbtomTn/cdpnNbU3ApqrRGNuNFwGHbLoqDtSxwXLNaDyyB41+mBkVjNDzdNNXycaLBJNtHqQjxZS2yYWBj3Pu5c49XiK40o6ztSpP9p4+e75/UD188fLV69qbt5cqTiVlIxqLWE48opjgERtprgWbJJKR0BNs7AXnhT/+waTicfRNrxM2C8ky4j6nRBtpXjsj86wdfMQ5nAI0PuHm9yzIwfUloRnOs0bhNd/ntguB6XBswLZrgysWsVYGbPg6r9WdllMWPAS8gzra1XBe27iLmKYhizQVRKkpdhI9y4jUnAqWV91UsYTQgCzZ1GBEQqZmWXlqDsdGWYAfS/MiDaX690RGQqXWoWc6Q6JX6n+vEB/zpqn2T2YZj5JUs4jeL/JTATqGIjdYcMmoFmsDhEpu/gp0RUxM2qRbLUPoFIe2oQSMewb6/ZNur/8nhMt2C/da3YtOfeDs4thHR+gDaiCMPqMB+oKGaIQo+omu0DW6sX5ZG2tr3d63VqzdzDv0T1l3vwEC/qGh</latexit>

(1) a2k+1 = ( 1)k , k = 0, 1, . . . , N


(2k + 1)!

Dans cette expression, k et N sont des entiers, et pour des entiers, la factorielle k! =
1✕2✕3 … ✕k, y compris le cas particulier 0! = 1.

- Factorielle. Ecrivez une boucle itérative for .. pour calculer la factorielle d’un entier k ;
- Fonction. Insérez votre boucle itérative dans une fonction que l’on nommera fact_() et
qui acceptera un argument k ; cet argument prendra la valeur = 0 par défaut. La fonction
renverra le résultat sous forme d’un entier ;
- Importez la fonction factorial() du paquet math ;
- Comparez les résultats obtenus avec votre fonction fact_() à ceux rendus par
factorial() : est-il possible de poser l’identité stricte (au sens des prédicats v/f) entre les
résultats ? Essayez avec des valeurs de k allant jusqu’à 20 ou 30. Conclusion ?
- Construisez une suite numérique a comme celle qui apparait dans l’équation (1) en
xant N = 10. On voudra que type(a) soit list dans un premier temps ;

Exo 2 : Les suites numériques sous forme de vecteurs numpy


- Suite de zéros. Utilisez la fonction zeros() du paquet numpy pour initialiser une suite de
N+1 éléments sous forme d’un vecteur (= array) : on xera N = 20 comme exemple ;
- Paquet scipy. Importez la fonction factorial() du paquet scipy.special en lui donnant le
nom de sci_factorial (alias as ) ;
- En étudiant la relation (1), on découvre que seul les indices impairs sont importants,
puisque a[i] = 0 lorsque l’indice i est pair : créez un vecteur numpy nommé ik qui ne
contiendra que les chiffres impairs de 1, 3 … jusqu’à N (note : les éléments sont des entiers) ;
- A partir de la suite de zéros déjà créée, substituez les valeurs calculées de (1) pour les
indices impairs ik de la suite, a ;
- Af chez les valeurs de la suite et validez votre résultat par calcul direct.
fi
fi
fi
fi
fi
2 of 3
Exo 3 : Les énumérateurs imbriqués pour créer des vecteurs numpy
En python, il est souvent possible de déclarer des listes ou tableau avec une syntaxe
compacte. Cela est d’autant plus souvent rencontré lorsque les éléments (de la suite)
s’expriment par une relation algébrique. Par exemple : avec un énumérateur imbriqué, on
obtient la suite fk

(2) fk = [ k / 2 for k in numpy.linspace( 0, N, 100, dtype = oat ) ]


Ceci créera une liste fk de 100 éléments compris entre 0 et N, liste qui peut ensuite servir
à initialiser un vecteur numpy :

(3) a = numpy.array( fk )
et on remarquera que les équations (3) et (2) peuvent aisément se combiner pour n’en
faire qu’une seule.
En vous inspirant de cet exemple, obtenez une expression en Python qui vous permettra
d’obtenir la suite a de l’exercice 2 en une seule expression (une ligne de commande).
[Indice : pour un nombre i pair, i%2 = 0, sinon i%2 = 1 (qui est neutre pour la multiplication).]

Exo 4 : Jeu de vecteurs comme base orthogonale


On peut utiliser les coordonnées d’un espace cartésien pour créer des vecteurs : par
exemple, un vecteur numpy v1 de coordonnées (x,y,z) = (1,2,3) peut se mettre en place
par l’expression

(4) v1 = numpy.array( [1,2,3], dtype = oat )


avec méthodes associées, telle que le produit scalaire [dot()] .
- Utilisez la documentation (help) pour découvrir ce que fait la méthode dot(), ensuite
valider votre hypothèse en af chant le résultat de l’opération v1.dot(v1) ;
- Projection de deux vecteurs. On utilise le produit scalaire pour v2
projeter un vecteur v1 sur le vecteur v2 comme illustré ci-contre (en rouge)
v2
v 1●
- Utilisez la triangulation pour calculer le vecteur u1 parallèle à la courbe v1
en pointillés, puis démontrez que ce vecteur est orthogonal au vecteur
v2 ;
- Calculez la norme du vecteur v2 pour dé nir un vecteur unitaire u2 = v2 / ||v2 || où la
norme se calcule avec le produit scalaire (dot) ou selon l’exemple donné dans le
support de cours #2 ;
- Procédure de Gram-Schmidt. Si les vecteurs u1 et u2 sont tous les deux unitaires (de
norme = 1), complétez la base orthogonale de vecteurs en calculant par projection

(5) u3 = v3 - (v3 • u1 ) u1 - (v3 • u2 ) u2

Il faut ensuite normaliser le vecteur u3 tel que u3 • u3 = 1 pour compléter la triade.

Vecteurs de départ : v2 = (-1, 2, -2), v3 = ( 1, -2, 5 ), en plus de v1 déjà donné.


Remarque. En tri-dimension, il est possible de calculer le vecteur u3 par simple produit
vectoriel entre u1 et u2 .
fi
fl
fi
fl
3 of 3

Exo 5 : Itérations numériques et attracteurs

Soit une suite numérique { ui }, i = 0, 1, ... n, dont les termes sont donnés par la relation de
récurrence
ui+1 = ln |ui + 1| .

- Déterminez à l'aide d'un script python si la suite de termes est sensible à la précision
du point de départ. [Note : elle sera sensible si l’erreur relative devient de forte amplitude].

Exemple : construisez la suite à partir de u0 = 2 > 0 jusqu'à n ≈ 50, puis reprenez en posant u = 2 x (1 +
0

ε ) où ε ≠ 0 < 1 est l’incertitude relative de départ.

Portez en graphique la suite numérique {ui } sous forme d’un nuage de points ;
- A l'aide d'une analyse aux différences nies, démontrez qu'elle est la raison de cette
(in)sensibilité à la valeur de départ.
- Montrez ensuite à l'aide d'un développement de Taylor à l'ordre 2 que le point ui = 0
est un attracteur pour le schéma proposé : il s’agit d’un point stable pour les itérations.
- Généralisez votre analyse au cas de la relation ui+1 = ln |ui + β| . Existe-il une plage
de valeurs de β pour laquelle le schéma itératif est stable ? instable ? Concluez.
fi

Vous aimerez peut-être aussi