Python pour le calcul scientifique
Exercices
Pierre Navaro - IRMAR
ENSAI le 25 mars 2016
1 Programmation Python
1.1 Une fonction pour calculer la norme
>>> def norme(a,b):
""" calcul de la norme """
... return sqrt(a*a+b*b)
>>> from math import *
>>> norme(3,4)
5.0
>>> help(norme)
Help on function norme in module __main__:
norme(a, b)
calcul de la norme
(END)
Récrire cette fonction avec en entrée une liste python de taille quelconque.
1.2 Ecrire et lire un fichier avec le module pickle
>>> import pickle
>>> l=["camembert","coulommiers","brie"]
>>> f=open("fromages","w")
>>> pickle.dump(l,f)
>>> f.close()
>>> f=open("fromages","r")
>>> lr=pickle.load(f)
>>> f.close()
>>> print lr
['camembert','coulommiers','brie']
Ajouter "munster" et "neuchatel" à la liste, trier la liste dans l’ordre alphabétique et
modifier le fichier "fromages".
1.3 Programmation Objet
Créer une classe Python nommée Vecteur, que l’on utilisera pour décrire un vec-
teur plan. Ces paramètres sont xet y. Implémenter l’addition __add__, la soustraction
1
__sub__, la multiplication __mul__ par un vecteur ou un scalaire et la représentation
__repr__. Ne pas oublier le constructeur __init__.
Attention votre multiplication n’est pas commutative par défaut, il faut implémenter
la méthode __rmul__.
Créer une classe nommée Particule, dont les paramètres sont les vecteurs position
et vitesse. Implémenter une méthode "deplace(dt)" pour calculer la nouvelle position
d’une particule après un pas de temps dt. Créer ensuite une classe Ion dérivant de
Particule avec un paramètre supplémentaire "masse".
>>> xp = Vecteur(3,4)
>>> vp = Vecteur(1,2)
>>> p = Particule(xp,vp)
>>> p
position (3 , 4); vitesse (1 , 2)
>>> p.deplace(1.)
>>> p
position (4.0 , 6.0); vitesse (1 , 2)
>>> i = Ion(xp,vp,1.)
>>> i.deplace(-1.)
>>> i
position (2.0 , 2.0); vitesse (1 , 2)
>>> i.energie
2.5
2 Numpy
2.1 Création d’un tableau numpy
Créer les tableaux suivants :
[100 101 102 103 104 105 106 107 108 109]
avec numpy.arange
[-2. -1.8 -1.6 -1.4 -1.2 -1. -0.8 -0.6 -0.4 -0.2 0.
0.2 0.4 0.6 0.8 1. 1.2 1.4 1.6 1.8]
avec numpy.linspace
[[ 0.001 0.00129155 0.0016681 0.00215443 0.00278256
0.003593810.00464159 0.00599484 0.00774264 0.01]
avec numpy.logspace
[[ 0. 0. -1. -1. -1.]
[ 0. 0. 0. -1. 1.]
[ 0. 0. 0. 0. -1.]
[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]]
2
avec numpy.tri, numpy.zeros, numpy.transpose
[[ 0. 1. 2. 3. 4.]
[-1. 0. 1. 2. 3.]
[-1. -1. 0. 1. 2.]
[-1. -1. -1. 0. 1.]
[-1. -1. -1. -1. 0.]]
avec numpy.ones, numpy.diag
2.2 Copie et référence
Exécuter les scripts python suivants, quel est le problème ? comment le résoudre ?
a = np.ones((4,3))
b = a.transpose()
b[0,1] = 10
print a
Script : https://perso.univ-rennes1.fr/pierre.navaro/python/numpy/ex6.py
a = np.arange(12)
b = a.reshape((4,3))
b[0,1] = 10
print a
Script : https://perso.univ-rennes1.fr/pierre.navaro/python/numpy/ex7.py
2.3 Lire des données issues de fichiers texte
Utiliser la fonction numpy.loadtxt pour charger les données contenues dans le fichier
https://perso.univ-rennes1.fr/pierre.navaro/python/numpy/data8.txt.
Script pour créer le fichier :
https://perso.univ-rennes1.fr/pierre.navaro/python/numpy/ex8_gen.py
Les donnees contenues dans :
https://perso.univ-rennes1.fr/pierre.navaro/python/numpy/data9.txt
ont été écrites de la manière suivante : La première ligne renseigne le nombre d’élé-
ments pour chaque direction et la deuxième ligne contient les données. Ecrire le pro-
gramme Python pour lire ces données et initialiser avec elles un tableau numpy 2D.
Script pour créer le fichier de données :
https://perso.univ-rennes1.fr/pierre.navaro/python/numpy/ex9_gen.py
2.4 Calculer une intégrale
Evaluer l’intégrale suivante :
I=Z
−∞
ev2
dv
Analytiquement avec sympy.
3
>>> from sympy import *
>>> v = symbols('v')
>>> integrate(exp(-v*v),(v,-oo,oo))
pi**(1/2)
numériquement avec v[10; 10] avec la méthode des trapèzes, écrire le code
et tester avec N=20.
comparer avec le résultat de la fonction numpy.trapz
3 Matplotlib
3.1 Mode interactif
Utiliser ipython -pylab pour exécuter les lignes suivantes :
x = linspace(0,4*pi,1000)
y = sin(x) + 0.2*sin(10*x)
plot(x,y)
xlabel(’x’)
clf()
plot(x,y,label=’hello’)
xlabel(’$x$’)
legend()
title(’\LaTeX fonts like $\mu$ are available’)
tics=arange(0,4*pi+0.1, step=pi/2)
xticks(tics)
tics_label=[’$0$’, ’$\pi/2$’]
xticks(tics,tics_label)
3.2 Mode non interactif
Reproduire le même graphique en insérant les lignes précédentes dans un fichier. Il
existe une variable In dans ipython qui contient toutes les commandes déjà tapées dans
Ipython. La commande "%hist -n" peut vous être utile également.
3.3 Tracer des données lues dans un fichier
Récupérer les données des fichiers :
https://perso.univ-rennes1.fr/pierre.navaro/python/matplotlib/foo_data.txt
https://perso.univ-rennes1.fr/pierre.navaro/python/matplotlib/foo_axis.txt
et tracer les données "data" en fonction des données "axis".
3.4 Tracer des données au format hdf5
Lire les données contenues dans le fichier
https://perso.univ-rennes1.fr/pierre.navaro/python/matplotlib/foo.h5
Tracer "data" en fonction de "axis".
4
import h5py
f = h5py.File(’foo.h5’, ’r’)
x = f[’axis’].value
y = f[’data’].value
f.close()
Script pour créer le fichier de données :
https://perso.univ-rennes1.fr/pierre.navaro/python/matplotlib/ex5_gendata.
py
3.5 Tracé 2D d’un champ scalaire
Tracer les données nommées "data2d" lue dans le fichier :
https://perso.univ-rennes1.fr/pierre.navaro/python/matplotlib/bar.h5
avec matplotlib.pyplot.contour et matplotlib.pyplot.imshow. Les coordonnées x
et ysont nommées "x_axis" et "y_axis" dans les données hdf5.
Script pour créer le fichier de données :
https://perso.univ-rennes1.fr/pierre.navaro/python/matplotlib/ex7_gendata.
py
4 Scipy
4.1 Interpolation
Prenez le fichier https://perso.univ-rennes1.fr/pierre.navaro/python/scipy/
ex1.py.
Comparer les courbes d’interpolations Krogh et Barycentric avec l’interpolation cu-
bique. Utiliser les deux séries de points (x, y1)et (x, y2)calculées par les lignes python
suivantes :
a=sp.random.rand(10)-0.5
x=sp.linspace(-1,1,num=10)
y1=(x-1.)*(x-0.5)*(x+0.5)
y2=(x-1.)*(x-0.5)*(x+0.5)+a
4.2 Laplacien en deux dimensions
On considère l’équation du laplacien :
u(x, y) = f(x, y),
Afin que le problème soit bien posé, on spécifie des conditions aux limites sur le bord
du domaine de type Dirichlet (u(x, y, t)connue sur le bord).
Discrétisation spatiale : on utilise des différences finies d’ordre 2 et un maillage
composé de Nx×Nyrectangles de taille x×y.
ui1,j 2uij +ui+1j
x2+ui,j12uij +uij+1
y2=fij
5
1 / 11 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 !