11. Exercicesđ
Note
Les exercices sont de difficultĂ© variable, de â (simple) Ă â â â (complexe).
11.1. Introductionđ
11.1.1. IntĂ©gration: mĂ©thode des rectangles â đ
La méthode des rectangles permet
dâapproximer numĂ©riquement lâintĂ©grale dâune fonction f
:
On définit la fonction sq
renvoyant le carrĂ© dâun nombre par
(cf. Fonctions):
def sq(x) :
return x**2
Ăcrire un programme calculant lâintĂ©grale de cette fonction entre a=0 et b=1, en utilisant une subdivision en n=100 pas dans un premier temps. Quelle est la prĂ©cision de la mĂ©thode, et comment dĂ©pend-elle du nombre de pas?
11.1.2. Fizz Buzz â đ
Ăcrire un programme jouant au Fizz Buzz jusquâĂ 99:
1 2 Fizz! 4 Buzz! Fizz! 7 8 Fizz! Buzz! 11 Fizz! 13 14 Fizz Buzz! 16...
11.1.3. PGCD: algorithme dâEuclide â â đ
Ăcrire un programme calculant le PGCD de deux nombres (p.ex. 756 et 306) par lâalgorithme dâEuclide.
11.1.4. Tables de multiplication â đ
Ăcrire un programme affichant les tables de multiplication:
1 x 1 = 1
1 x 2 = 2
...
9 x 9 = 81
11.2. Manipulation de listesđ
11.2.1. Crible dâĂratosthĂšne â đ
ImplĂ©menter le crible dâĂratosthĂšne pour afficher les nombres premiers compris entre 1 et un entier fixe, p.ex.:
Liste des entiers premiers <= 41
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41]
11.2.2. CarrĂ© magique â â đ
Un carrĂ© magique dâordre n est un tableau carrĂ© n Ă n dans lequel on Ă©crit une et une seule fois les nombres entiers de 1 Ă nÂČ, de sorte que la somme des n nombres de chaque ligne, colonne ou diagonale principale soit constante. P.ex. le carrĂ© magique dâordre 5, oĂč toutes les sommes sont Ă©gales Ă 65:
11 |
18 |
25 |
2 |
9 |
10 |
12 |
19 |
21 |
3 |
4 |
6 |
13 |
20 |
22 |
23 |
5 |
7 |
14 |
16 |
17 |
24 |
1 |
8 |
15 |
Pour les carrĂ©s magiques dâordre impair, on dispose de lâalgorithme suivant â (i,j) dĂ©signant la case de la ligne i, colonne j du carrĂ©; on se place en outre dans une indexation « naturelle » commençant Ă 1:
la case (n,(n+1)/2) contient 1 ;
si la case (i,j) contient la valeur k, alors on place la valeur k+1 dans la case (i+1,j+1) si cette case est vide, ou dans la case (i-1,j) sinon. On respecte la rÚgle selon laquelle un indice supérieur à n est ramené à 1.
Programmer cet algorithme pour pouvoir construire un carrĂ© magique dâordre impair quelconque.
11.3. Programmationđ
11.3.1. Suite de Syracuse (fonction) â đ
Ăcrire une fonction suite_syracuse(n)
retournant la (partie
non-triviale de la) suite de Syracuse pour un entier
n. Ăcrire une fonction temps_syracuse(n, altitude=False)
retournant le temps de vol (Ă©ventuellement en altitude) correspondant
Ă lâentier n. Tester ces fonctions sur n=15:
>>> suite_syracuse(15)
[15, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1]
>>> temps_syracuse(15)
17
>>> temps_syracuse(15, altitude=True)
10
11.3.2. Flocon de Koch (programmation rĂ©cursive) â â â đ
En utilisant les commandes left
, right
et forward
de la
bibliothĂšque graphique standard turtle
dans une fonction
rĂ©cursive, gĂ©nĂ©rer Ă lâĂ©cran un flocon de Koch dâordre arbitraire.
11.3.3. Jeu du plus ou moins (exceptions) â đ
Ăcrire un jeu de « plus ou moins »:
Vous devez deviner un nombre entre 1 et 100.
Votre proposition: 27
C'est plus.
[...]
Vous avez trouvé en 6 coups!
La solution sera générée aléatoirement par la fonction
random.randint()
. Le programme devra ĂȘtre robuste aux entrĂ©es
invalides (« toto », 120, etc.), et aux lùches abandons par
interruption (KeyboardInterrupt
).
11.3.4. Animaux (POO/TDD) â đ
Téléchargez le fichier animaux.py
et exécutez les tests prédéfinis
(dans la seconde partie du fichier) via la ligne de commande (Ă Ă©xecuter dans
un terminal systĂšme):
$ py.test animaux.py
Dans un premier temps, les tests Ă©chouent, puisque le proto-code (dans la
premiĂšre partie du fichier) nâest pas encore correct. Lâexercice consiste donc
Ă modifier progressivement les classes Animal
et Chien
pour quâelles passent
avec succĂšs tous les tests. Câest le principe du Test Driven Development
(voir Développement piloté par les tests).
11.3.5. Jeu de la vie (POO) â â đ
On se propose de programmer lâautomate cellulaire le plus cĂ©lĂšbre, le Jeu de la vie.
Pour cela, vous créerez une classe Life
qui contiendra la grille du
jeu ainsi que les méthodes qui permettront son évolution. Vous
initialiserez la grille alĂ©atoirement Ă lâaide de la fonction
random.choice()
, et vous afficherez lâĂ©volution de lâautomate
dans la sortie standard du terminal, p.ex.:
...#..#.....##.......
.....###.............
#........#...........
.....#...#...........
................##...
.....#.#......##..#..
..............##.##..
..............##.##..
................#....
Astuce
Pour que lâaffichage soit agrĂ©able Ă lâoeil, vous marquerez
des pauses entre lâaffichage de chaque itĂ©ration grĂące Ă la
fonction time.sleep()
.
11.4. Manipulation de tableaux (arrays
)đ
11.4.1. Inversion de matrice â đ
Créer un tableau carré réel \(\mathsf{r}\) aléatoire
(numpy.random.randn()
), calculer la matrice hermitienne \(\mathsf{m}
= \mathsf{r} \cdot \mathsf{r}^T\) (numpy.dot()
), lâinverser
(numpy.linalg.inv()
), et vérifier que \(\mathsf{m} \cdot
\mathsf{m}^{-1} = \mathsf{m}^{-1} \cdot \mathsf{m} = \mathsf{1}\)
(numpy.eye()
) à la précision numérique prÚs (numpy.allclose()
).
11.4.2. Median Absolute Deviation â đ
En statistique, le Median Absolute Deviation (MAD) est un estimateur robuste
de la dispersion dâun Ă©chantillon 1D: MAD = median(| x - median(x) |)
.
Ă lâaide des fonctions numpy.median()
et numpy.abs()
,
Ă©crire une fonction mad(x, axis=None)
calculant le MAD dâun tableau,
Ă©ventuellement le long dâun ou plusieurs de ses axes.
11.4.3. Distribution du pull â â â đ
Le pull est une quantitĂ© statistique permettant dâĂ©valuer la conformitĂ© des erreurs par rapport Ă une distribution de valeurs (typiquement les rĂ©sidus dâun ajustement). Pour un Ă©chantillon \(\mathbf{x} = [x_i]\) et les erreurs associĂ©es \(\mathrm{d}\mathbf{x} = [\sigma_i]\), le pull est dĂ©fini par:
moyenne optimale (pondérée par la variance): \(E = (\sum_{i} x_i/\sigma_i^2)/(\sum_i 1/\sigma_i^2)\);
erreur sur la moyenne pondérée: \(\sigma_E^2 = 1/\sum(1/\sigma_i^2)\);
dĂ©finition du pull: \(p_i = (x_i - E_i)/(\sigma_{E_i}^2 + \sigma_i^2)^{1/2}\), oĂč \(E_i\) et \(\sigma_{E_i}\) sont calculĂ©es sans le point i.
Si les erreurs \(\sigma_i\) sont correctes, la distribution du pull est centrée sur 0 avec une déviation standard de 1.
Ăcrire une fonction pull(x, dx)
calculant le pull de tableaux 1D.
11.5. MĂ©thodes numĂ©riquesđ
11.5.1. Quadrature et zĂ©ro dâune fonction â đ
Ă lâaide des algorithmes disponibles dans scipy
:
calculer numĂ©riquement lâintĂ©grale \(\int_0^\infty \frac{x^3}{e^x-1}\mathrm{d}x = \pi^4/15\);
rĂ©soudre numĂ©riquement lâĂ©quation \(x\,e^x = 5(e^x - 1)\).
11.5.2. SchĂ©ma de Romberg â â đ
Ăcrire une fonction integ_romberg(f, a, b, epsilon=1e-6)
permettant de
calculer lâintĂ©grale numĂ©rique de la fonction f entre les bornes a et b
avec une précision epsilon selon la méthode de Romberg.
Tester sur des solutions analytiques et en comparant Ă
scipy.integrate.romberg()
.
11.5.3. MĂ©thode de Runge-Kutta â â đ
DĂ©velopper un algorithme permettant dâintĂ©grer numĂ©riquement une Ă©quation diffĂ©rentielle du 1er ordre en utilisant la mĂ©thode de Runge-Kutta dâordre quatre.
Tester sur des solutions analytiques et en comparant Ă
scipy.integrate.odeint()
.
11.6. Visualisation (matplotlib)đ
11.6.1. Quartet dâAnscombe â đ
AprÚs chargement des données, calculer et afficher les propriétés
statistiques des quatres jeux de données du Quartet
d'Anscombe
:
moyenne et variance des x et des y (
numpy.mean()
etnumpy.var()
);corrélation entre les x et les y (
scipy.stats.pearsonr()
);équation de la droite de régression linéaire y = ax + b (
scipy.stats.linregress()
).
I |
II |
III |
IV |
||||
---|---|---|---|---|---|---|---|
x |
y |
x |
y |
x |
y |
x |
y |
10.0 |
8.04 |
10.0 |
9.14 |
10.0 |
7.46 |
8.0 |
6.58 |
8.0 |
6.95 |
8.0 |
8.14 |
8.0 |
6.77 |
8.0 |
5.76 |
13.0 |
7.58 |
13.0 |
8.74 |
13.0 |
12.74 |
8.0 |
7.71 |
9.0 |
8.81 |
9.0 |
8.77 |
9.0 |
7.11 |
8.0 |
8.84 |
11.0 |
8.33 |
11.0 |
9.26 |
11.0 |
7.81 |
8.0 |
8.47 |
14.0 |
9.96 |
14.0 |
8.10 |
14.0 |
8.84 |
8.0 |
7.04 |
6.0 |
7.24 |
6.0 |
6.13 |
6.0 |
6.08 |
8.0 |
5.25 |
4.0 |
4.26 |
4.0 |
3.10 |
4.0 |
5.39 |
19.0 |
12.50 |
12.0 |
10.84 |
12.0 |
9.13 |
12.0 |
8.15 |
8.0 |
5.56 |
7.0 |
4.82 |
7.0 |
7.26 |
7.0 |
6.42 |
8.0 |
7.91 |
5.0 |
5.68 |
5.0 |
4.74 |
5.0 |
5.73 |
8.0 |
6.89 |
Pour chacun des jeux de données, tracer y en fonction de x, ainsi que la droite de régression linéaire.
11.6.2. Diagramme de bifurcation: la suite logistique â â đ
Ăcrivez une fonction qui calcule la valeur dâĂ©quilibre de la suite logistique pour un \(x_0\) (nĂ©cessairement compris entre 0 et 1) et un paramĂštre \(r\) (parfois notĂ© \(\mu\)) donnĂ©.
GĂ©nĂ©rez lâensemble de ces points dâĂ©quilibre pour des valeurs de \(r\) comprises entre 0 et 4:
N.B. Vous utiliserez la bibliothÚque Matplotlib pour tracer vos résultats.
11.6.3. Ensemble de Julia â â đ
ReprĂ©sentez lâensemble de Julia pour la constante complexe \(c = 0.284 + 0.0122j\):
On utilisera la fonction numpy.meshgrid()
pour construire le plan
complexe, et lâon affichera le rĂ©sultat grĂące Ă la fonction
matplotlib.pyplot.imshow()
.
Voir Ă©galement: Superposition dâensembles de Julia
11.7. Mise en oeuvre de lâensemble des connaissances acquisesđ
11.7.1. Ăquation diffĂ©rentielle â đ
Ă lâaide de la fonction scipy.integrate.odeint()
, intégrer les
Ă©quations du mouvement dâun boulet de canon soumis Ă des forces de
frottement « turbulentes » (en \(v^2\)):
Utiliser les valeurs numériques pour un boulet de canon de 36 livres:
g = 9.81 # Pesanteur [m/s2]
cx = 0.45 # Coefficient de frottement d'une sphĂšre
rhoAir = 1.2 # Masse volumique de l'air [kg/m3]
rad = 0.1748/2 # Rayon du boulet [m]
rho = 6.23e3 # Masse volumique du boulet [kg/m3]
mass = 4./3.*N.pi*rad**3 * rho # Masse du boulet [kg]
alpha = 0.5*cx*rhoAir*N.pi*rad**2 / mass # Coeff. de frottement / masse
v0 = 450. # Vitesse initiale [m/s]
alt = 45. # Inclinaison du canon [deg]
Voir Ă©galement: Ăquations de prĂ©dation de Lotka-Volterra
11.7.2. Ăquation dâĂ©tat de lâeau Ă partir de la dynamique molĂ©culaire â â â đ
Afin de modĂ©liser les planĂštes de type Jupiter, Saturne, ou mĂȘme des exo-planĂštes trĂšs massives (dites « super-Jupiters »), la connaissance de lâĂ©quation dâĂ©tat des composants est nĂ©cessaire. Ces Ă©quations dâĂ©tat doivent ĂȘtre valables jusquâĂ plusieurs centaines de mĂ©ga-bar ; autrement dit, celles-ci ne sont en aucun cas accessibles expĂ©rimentalement. On peut cependant obtenir une Ă©quation dâĂ©tat numĂ©riquement Ă partir dâune dynamique molĂ©culaire.
Le principe est le suivant : on place dans une boite un certain nombre de particules rĂ©gies par les Ă©quations microscopiques (Newton par exemple, ou mĂȘme par des Ă©quations prenant en considĂ©ration la mĂ©canique quantique) puis on laisse celles-ci Ă©voluer dans la boite ; on calcule Ă chaque pas de temps lâĂ©nergie interne Ă partir des intĂ©ractions Ă©lectrostatiques et la pression Ă partir du tenseur des contraintes. On obtient en sortie lâĂ©volution du systĂšme pour une densitĂ© fixĂ©e (par le choix de taille de la boite) et une tempĂ©rature fixĂ©e (par un algorithme de thermostat que nous ne dĂ©taillerons pas ici).
On se propose dâanalyser quelques fichiers de sortie de tels calculs pour
lâĂ©quation dâĂ©tat de lâeau Ă trĂšs haute pression. Les fichiers de sortie sont
disponibles ici
; leur nom indique les
conditions thermodynamiques correspondant au fichier, p.ex. 6000K_30gcc.out
pour \(T = 6000\) K et \(\rho = 30\) gcc. Le but est, pour chaque
condition tempĂ©rature-densitĂ©, dâextraire lâĂ©volution de lâĂ©nergie et de la
pression au cours du temps, puis dâen extraire la valeur moyenne ainsi que les
fluctuations. Il arrive souvent que lâĂ©tat initial choisi pour le systĂšme ne
corresponde pas Ă son Ă©tat dâĂ©quilibre, et quâil faille donc « jeter » les
quelques pas de temps en début de simulation qui correspondent à cette
relaxation du systĂšme. Pour savoir combien de temps prend cette relaxation, il
sera utile de tracer lâĂ©volution au cours du temps de la pression et lâĂ©nergie
pour quelques simulations. Une fois lâĂ©quation dâĂ©tat \(P(\rho,T)\) et
\(E(\rho,T)\) extraite, on pourra tracer le rĂ©seau dâisothermes.
Indication
Vous Ă©crirez une classe Simulation
qui permet de charger
un fichier de dynamique molĂ©culaire, puis de tracer lâĂ©volution de
a tempĂ©rature et de la densitĂ©, et enfin dâen extraire la valeur
moyenne et les fluctuations. Ă partir de cette classe, vous
construirez les tableaux contenant lâĂ©quation dâĂ©tat.
11.8. Exercices en vracđ
11.8.1. Points matĂ©riels et ions (POO/TDD)đ
Pour une simulation dâun problĂšme physique, on peut construire des classes qui connaissent elles-mĂȘmes leurs propriĂ©tĂ©s physiques et leurs lois dâĂ©volution.
La structure des classes est proposée dans ce squelette
. Vous devrez compléter les définitions des classes
Vector
, Particle
et Ion
afin quâelles passent toutes les tests
lancés automatiquement par le programme principal main
. Ă
lâexĂ©cution, la sortie du terminal doit ĂȘtre:
***************** Test functions *****************
Testing Vector class... ok
Testing Particle class... ok
Testing Ion class... ok
******************** Test end ********************
************* Physical computations **************
** Gravitationnal computation of central-force motion for a Particle with mass 1.00, position (1.00,0.00,0.00) and speed (0.00,1.00,0.00)
=> Final system : Particle with mass 1.00, position (-1.00,-0.00,0.00) and speed (0.00,-1.00,0.00)
** Electrostatic computation of central-force motion for a Ion with mass 1.00, charge 4, position (0.00,0.00,1.00) and speed (0.00,0.00,-1.00)
=> Final system : Ion with mass 1.00, charge 4, position (0.00,0.00,7.69) and speed (0.00,0.00,2.82)
*********** Physical computations end ************
11.8.2. Protein Data Bankđ
On chercher a réaliser un script qui analyse un fichier de données de type Protein Data Bank.
La banque de données Worldwide Protein Data Bank regroupe les structures obtenues par diffraction aux rayons X ou par RMN. Le format est parfaitement defini et conventionnel (documentation).
On propose dâassurer une lecture de ce fichier pour calculer notamment :
le barycentre de la biomolécule
le nombre dâacides aminĂ©s ou nuclĂ©obases
le nombre dâatomes
la masse moléculaire
les dimensions maximales de la protéine
etc.
On propose de considerer par exemple la structure resolue pour la GFP (Green Fluorescent Protein, Prix Nobel 2008) (Fichier PDB)