•Méthodes de développement •Python scientifique (suite)

publicité
Programmation
scientifique
•M é t h o d
•P y t h o n
Wednesday, March 24, 2010
e s d e d é v e l o p p e m e n t
s c i e n t i f i q u e ( s u i t e )
Méthodes de
développement
Wednesday, March 24, 2010
Conception d’un programme
Penser au problème en termes généraux d’étapes de
traitement et des types des données. Plusieurs
étapes:
• Un cahier des charges: que doit faire le
programme, quelles sont les valeurs, données
dont il a besoin; quelle est la nature du résultat.
• Un brouillon de votre programme en français,
cad en pseudo-code. Décrit, les étapes
successives du programme. Résume les
méthodes qu’il doit employer.
Wednesday, March 24, 2010
Conception d’un programme (2)
Formalisez votre description en un plan du
programme (organigramme) qui représente
l’enchainement des actions
Préparez des exemples tests simples. Ayez les idées
claires comment votre programme va traiter ces cas
tests. Simulez, dans la tête, sur le papier le programme.
Procédez par étapes: description générale à détaillée,
processus itératif.
Commencez à coder. Testez chaque partie
indépendante.
Wednesday, March 24, 2010
Etablir un organigramme
� !
� !
1
1
i(x sin "−n")
e
d" =
cos(x sin " − n")d"
Jn (x) =
2!
!
−!
0
et la propriété
d
d
Exemple:1.3simulation
expérience de diffraction de
Rappels de diffraction
la lumière
à l’infini au travers d’un trou dans un
On éclaire un plan percé d’un trou (Fig. 1) par un faisceau de lumière monochro
écran plan. On admet que loin de la pupille de diffraction, le champ électrique E sur
l’intégrale :
��
Calcul de l'amplitude
de la lumière de la
source
e−i(#X x+#Y y) dxdy
(X,Y)
S
Où l’intégrale est étendue à la surface S de la
pupille, #X et #ecran
S (x,y)
Y sont proportionn
du point d’observation sur l’écran. On peut également écrire cette intégrale explic
transformée de Fourier :
Calcul de l'amplitude
de la lumière à l'infini
��
==(X,
TS (r)e−i#.r dxdy avec σ #
(#XY, #)Y );r=(x,y)
r = (x, y)
F IG . 1 – Schéma de la diffraction par un trou
IR2
1.5 Diffraction
par un troude
ciculaire
facteur
deéclairée
transmission
de1l’écran
TS (r) étant le facteur
de transmission
la plaque
qui vaut
sur la pupille
Représentation de la
figure de diffraction
On suppose que la pupille est un trou ciculaire de rayon a. Montrez que le champ électrique est pr
à l’intégrale de la fonction de Bessel :
1.4 Transformée de Fourier d’une
� a fonction radiale
E ! 2"
#J0 ($r #)d# où $X x + $Y y = $r # cos %
On appelle fonction
radiale f (x, y) une fonction qui ne dépend que de la norme |X
Utilisez la propriété de la fonction de Bessel pour montrer que :
tranformée de Fourier.
0
J (t)
Wednesday, March 24, 2010
E ! a2 1�� avec t = $r a
t
−iK.X
˜
Ex. organigramme (2)
Calcul de la source
Indications sur le
type de source
choisie
Calcul de la forme
Amplitude de la
lumière dans la
source
Wednesday, March 24, 2010
Précisions
complémentaires
forme
Ex. organigramme (2)
Calcul de la source
Calcul de la diffraction
Indications sur le
type de source
choisie
Calcul de la forme
Amplitude de la
lumière dans la
source
Précisions
complémentaires
forme
Calcul de la
transformée de
Fourier
Amplitude de la
lumière dans la
source
Amplitude de la
lumière à l'inifi
Wednesday, March 24, 2010
Ex. organigramme (2)
Calcul de la source
Calcul de la diffraction
Indications sur le
type de source
choisie
Calcul de la forme
Amplitude de la
lumière dans la
source
Précisions
complémentaires
forme
Calcul de la
transformée de
Fourier
Amplitude de la
lumière dans la
source
Amplitude de la
lumière à l'inifi
Calcul de la
représentation
Amplitude de la
lumière à l'infini
Choix de la
représentation
Calcul de la
représentation
Affichage
Wednesday, March 24, 2010
Ex. organigramme (3)
Calcul de la diffraction
Amplitude de la
lumière dans la
source
Amplitude de la
lumière dans la
source
Calcul de la
transformée de
Fourier
Calcul de la TF selon
la 1re dimension
Bibliothèque: fonction
TF à une dimension
Calcul de la TF selon
la 2nd dimension
Amplitude de la
lumière à l'inifi
Amplitude de la
lumière à l'inifi
Wednesday, March 24, 2010
Indication sur
le type de
forme
Calcul de la
forme
Précisions
complémentaires
Amplitude de la
lumière dans la
source
Calcul de la TF
selon la 1re
dimension
Bibliothèque:
fonction TF à
une dimension
Calcul de la TF
selon la 2nd
dimension
Amplitude de la
lumière à l'infini
Calcul de la
représentation
Affichage
Wednesday, March 24, 2010
Choix de la
représentation
ORGANIGRAMME
Des conventions
Langage de modélisation
UML
Unified Modelling
Language
Nombreux types de
diagrammes structurés
pour représenter des
processus en vue de leur
programmation ou de la
planification de tâches
Exemple de diagramme
d’activités modélisant le
fonctionnement d’une borne
bancaire.
Wednesday, March 24, 2010
Pour des
physiciens...
Entrées sorties
utilisateur
Terminaisons
Procédés
Tests
suffisent...
Wednesday, March 24, 2010
Conseils de
programmation
i m p o rt a n t s
Wednesday, March 24, 2010
!
Une question de
style
Les programmes doivent être écrits pour être
lus par des gens et accidentellement exécutés
par les machines.
- Abelson & Sussman, Structure and
Interpretation of Computer Programs
Essayez de rendre vos programmes faciles à
lire et évidents.
Wednesday, March 24, 2010
Apprendre à se
documenter
Utiliser internet
Consulter les manuels en ligne
Chercher des exemples
Réutiliser du code existant
Réutiliser des fonctions existantes
(bibliothèques)
Wednesday, March 24, 2010
Pyhton: style de
programmation
4 espaces par niveau d'indentation.
Pas de tabs.
Ne jamais mixer des tabs et des espaces.
Un saut de ligne entre les fonctions.
Deux sauts de ligne entre les classes.
Wednesday, March 24, 2010
Comment nommer ?
Des noms de variable et de fonctions avec une
signification
joined_lower pour les fonctions, méthodes et
attributs
joined_lower ou ALL_CAPS pour les constantes
StudlyCaps pour les classes
camelCase seulement pour suivre des conventions
Wednesday, March 24, 2010
Commentaires
Commentaires
Tout ce qui sur une ligne suit un #
Commentaires de fonctions
def Distance_min(x, y):
"""Retourne la distance la plus courte"""
Wednesday, March 24, 2010
commentaires
Tout code doit être sérieusement commenté
Préambule
• Descriptif actions du programme, méthodes
employées, références, détails sur les
entrées/sortie. Date de version.
Commentaires/séparations pour:
•
Les fonction et les parties différentes des
fonctions
• Descriptif des variables
Wednesday, March 24, 2010
Astuces
Gestion des accents:
# -*- coding: iso-8859-1 -*-
Dans ipython : %logstart
Sauvegarde de la session de travail dans «ipython_log.py»
Sauvegardes: travailler dans une nouvelle copie du
répertoire de travail datée; après une session de travail
compresser le répertoire de la session et l’exporter
ailleurs.
>>>tar cvfz archive.tar.gz Nom_repertoire
(à partir du répertoire parent de celui de
votre session)
Wednesday, March 24, 2010
Corriger un programme: Débuguer
Corriger les erreurs de syntaxe
Dans Python exécuter en interactif les différentes
parties d’un programme qui posent problème.
Vérifier les espaces de noms de modules
Mettre des sorties (print) interédiaires
Les problèmes difficiles: quand le programme «tourne»
mais se bloque parfois; quand le programme tourne
mais ne fait pas ce qu’on attends de lui.
Wednesday, March 24, 2010
Debuggage
Propriétés des outils de débuggage
•!Analyse post mortem: analyse du programme quand une erreur
est survenue suite par exempla à une exception.
• Points d’arrêt (Breakpoints): définissent des points dans le
programme où l’exécution est arrêtée pour permettre l’inspection de
l’état du programme
• Pas à pas (Single-stepping) Exécution du programme une ligne à
la fois
• Watchpoints Définissent des conditions (typiquement
«changement de la variable x», ou «la variable i prend la valeur 5»
pour lesquelles l’exécution du programme est arrêtée pour permettre
l’inspection de son état.
En Python: module pdb
Wednesday, March 24, 2010
Debuggage Exemple
Programme simple: epdb1.py.
# epdb1.py
a = "aaa"
b = "bbb"
c = "ccc"
final = a + b + c
print final
# epdb1.py
import pdb
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = a + b + c
print final
Insérer la déclaration import pdb
A l’endroit où on veut suivre à la trace l’éxécution,
insérer pdb.set_trace()
Exécuter à partir de l’invite: python epdb1.py
Quand le programme rencontre pdb.set_trace()
il va commencer à tracer
Wednesday, March 24, 2010
Analyse post-mortem
Situation fréquent: le program s’interrompt en raison d’un exception et on veut
en comprendre la cause
Soit...
- exécuter un programme sous le contrôle d’un outil de débuggage et attendre
l’exception
Tourner sous contrôle du debugger pdb:
python -m pdb my_script.py
- en Python, faire tourner le programme en interactif (lancé dans iptyhon, ou
dans IDLE) et lancer le module pdb après l’exception:
import pdb
pdb.pm()
(exemple: lancer epdb2.py dans session interactive)
Wednesday, March 24, 2010
Debuggage en cours
Lancer le programme avec un debuggueur
- Placer un point d’interruption (pdb: b) avant l’endroit où l’erreur à lieu
>>> b numero_ligne
- Placer une condition >>>condition
id_breakpoint condition (variable>valeur)
- Lancer l’exécution jusqu’au point d’arrêt (pdb: c) et avancer pas à pas à
partir de là >>> b (continue)
Modes pas à pas
-pas individuel(pdb: s) arrêt à la prochaine instruction (on entre dans les
fonctions) >>> s (step)
- Step over (pdb: n) arrêt après la prochaine fonction ou instruction avec
exécution de toutes les étapes de la fonction (on entre pas dans la fonction)
>>> n (next)
Wednesday, March 24, 2010
Analyse des états
Localisation dans le code source:
- (w)here imprime une trace
- (l)ist montre 11 lignes de codes autour de la courante
- (u)p et (d)own monte et descend dans la trace
Visualisation des variables:
- (p)rint imprime la valeur d’une expression Python quelconque
http://pythonconquerstheuniverse.wordpress.com/category/the-python-debugger/
http://onlamp.com/pub/a/python/2005/09/01/debugger.html
Wednesday, March 24, 2010
Python
Scientifique
Références:
Apprendre à programmer en Python , Swinnen;
Transparents «Python Scientifique» K. Hinsen;
Fascicules «Python cours Informatique pour Physiciens
L2 Physique U. Diderot»
Wednesday, March 24, 2010
Librairies scientifiques
principales
NumPy
SciPy
Matplotlib
MayaVi2
Wednesday, March 24, 2010
NumPy
http://numpy.scipy.org
NumPy est le module scientifique fondamental
nécessaire pour du calcul avec Python. Il contient:
Un objet tableau à N dimension (array) puissant
Algèbre linéaire (LAPACK)
Transformées de Fourier (FFTPACK)
Fonctions nombres aléatoires avancées
Wednesday, March 24, 2010
NumPy en pratique
Documentation générale: http://www.scipy.org/
Références: http://docs.scipy.org/doc/numpy/
reference/
Exemples pour chaque fonction: http://
www.scipy.org/Numpy_Example_List_With_Doc
Livre de recettes: http://www.scipy.org/Cookbook
Wednesday, March 24, 2010
Numpy: exemples
>>>np.zeros(10) # Créer un vecteur contenant 10 fois 0
>>>np.zeros(10), dtype=float) # idem mais des réels
>>> np.ones(10) # Créer un vecteur contenant 10 fois 1
>>> np.array([1,2,3,4,5]) # Créer un vecteur à partir de la liste [1,2,3,4,5]
>>> np.arange(10) # Créer un vecteur [0, 10)
>>>np.arange(debut,fin,pas) # Créer un vecteur [debut, debut+pas,...fin]
Wednesday, March 24, 2010
NumPy: Exemples à traiter en direct
>>> x=np.array([1, 2, -3, 0.4, 10])
>>> x
>>> x *2
>>> [1,2,-3,0.4,10]*4 # Pour comparer avec des listes
>>> x + 1
>>> x -2+3j
>>> np.sin(x)
>>> y = np.ones(5)
>>> x + y
>>> 2*x + 3*y
Wednesday, March 24, 2010
NumPy: Exemples en direct
>>> x = np.array([10, 2, 2, 3, 4, 123, 3])
>>> x.sort() # Trier les éléments
>>> # x sera trié
>>> x.sum() # Trouver la somme des éléments
>>> x.var() # Trouver la variance des éléments
>>> x.std() # Trouver l’écart-type des éléments
>>> x.max() # Trouver la valeur maximale
>>> x.min() # Trouver la valeur minimale
Wednesday, March 24, 2010
Tableaux 2D
>>> A = np.array([ [123,1,13], [-5,7,900], [13,4,9] ])
>>> np.diag([1,2,3,4,5]) # Une matrice ayant [1,2,3,4,5] pour diagonale
principale
>>> np.identity(10) # Matrice d’identité de taille 10x10.
>>> A.shape # Les dimensions de la matrice (3, 3)
>>>A.reshape(n,m) #Change la forme de A en une matrice n*m
>>> np.transpose(A) # La matrice transposée de A
>>> np.trace(A) # La trace de la matrice A
>>> np.diag(A) # La diagonale principale de A
>>> B = np.linalg.inv(A) # La matrice inversé de A
>>> np.dot(A, B) # Produit des matrices A et B.
>>> np.linalg.det(A) # Le déterminant de A
Wednesday, March 24, 2010
>>> np.linalg.det(A)
# La déterminante de
de A A
>>> np.linalg.det(A)
# La déterminante
exemple
ouvons résoudre un système d’équations linéaires :
0
Ainsi, nous pouvons résoudre un système d’équations linéaire
x + 3y + 5z = 10
Ainsi, nous pouvons
résoudre
2x + 5y
+ z = 8 un système d’équations linéai
3
2x + 3y + 8z = 3
x
+
3y
+
5z
=
10
ut être
représenté
sous
la
forme
A
×
x
=
b,
où
Ce
dernier
peut
être




 représenté
 sousla forme A × x = b, où
5 2x + 5y + 10
z=8
1 3 5
10
 et+b 3y

A =  2 5 1  et b =  8 .
1 2x
8
=
.
+ 8z = 3
2 3 8
3
8
3
Alors,
nous pouvons
simplement
trouverA
la ×
réponse
du b,
systèm
Ce dernier
peut
être
représenté
sous
la
forme
x
=
où
 trouver la 
ouvons simplement
réponse du 
système
x = A−1 × b par
1 3 [1.0,3.0,5.0],
5 >>> A = np.array([
10 [1.0,3.0,5.0],
[2.0,5.0,1
>>> A = np.array([
[2.0,5.0,1.0],
[2.0,3.0,8.0]
])
b =
np.array([10.0,
8.0, 3.0])
 et
 8 . [2.0,3.0,8.0]
=  2 5 1 >>>
b=
array([A[1.0,3.0,5.0],
[2.0,5.0,1.0],
])
>>> b = np.array([10.0, 8.0, 3.0])
array([10.0,
8.0,
2 3 3.0])
8 >>> Ainv
3 de A
>>> Ainv = np.linalg.inv(A)
# L’inverse
= np.linalg.inv(A)
# L’inverse de
>>> xAlors,
= np.dot(Ainv,
b)
#
Et
voici
la
solution
!
nous pouvons
simplement
trouver
la
réponse
du
systè
>>> x = np.dot(Ainv,
b) # Et voici la soluti
np.linalg.inv(A)
#
L’inverse
de
A
>>> np.dot(A, x) # Voyons
>>> x si le résultat est correct !
>>>
= np.array([
[2.0,5.0,
>>>
x =Anp.linalg.solve(A,
b) [1.0,3.0,5.0],
# Et c’est tout !
dot(Ainv, b) # Et voici
la solution
!
>>> np.dot(A,
x) # Voyons
si le résultat est
>>> b = np.array([10.0, 8.0, 3.0])
>>> b # Et oui, en faisant la comparaison c’
>>>
Ainv =sinp.linalg.inv(A)
# L’inverse
de
A, x)
# Voyons
le résultat est correct
!
Wednesday, March 24, 2010
Indexage de Arrays
a = arange(6)
!
array([0, 1, 2, 3, 4, 5])
!! a[2]
!
!
2
!! a[2:4]
!
!
array([2, 3])
!! a[1:-1]
!
!
array([1, 2, 3, 4])
!! a[:4]
!
!
array([0, 1, 2, 3])
!! a[1:4:2]
!
!
array([1, 3])
!! a[::-1]
!
!
array([5, 4, 3, 2, 1, 0])
Wednesday, March 24, 2010
a = array([ [1, 2], [3, 4] ])
!
!
array([[1, 2],
[3, 4]])
!! a[1, 0]
!
!
3
!! a[1, :]! ! a[1]
!
!
array([3, 4])
!! a[:, 1]
!
!
array([2, 4])
!! a[:, :, newaxis]
!
!
!
!
!
!
!
!
array([[[1],
[2]],
[[3],
[4]]])
Matplotlib
Librairie Python 2D pour représentations
graphique de données pour production de figures
en qualité publication
Peut-être utilisé dans des scripts, ou en interactif,
ou comme application web
Traçage de graphes, histogrammes, spectres de
puissance, etc... personnalisation avancée
Wednesday, March 24, 2010
Matplotlib en
pratique
Information générale: http://matplotlib.sourceforge.net/
Exemples: http://matplotlib.sourceforge.net/examples/
index.html
Recettes: http://www.scipy.org/Cookbook/Matplotlib
Guide: http://matplotlib.sourceforge.net/users/index.html
Galerie: http://matplotlib.sourceforge.net/gallery.html
Wednesday, March 24, 2010
Matplotlib: afficher une fonction
>>>import pylab as plt
>>> x = np.arange(-np.pi, np.pi, 0.1) # Vecteur
# de -pi à pi avec un pas de 0.1 radians
>>> y = np.sin(x)
>>> plt.plot(x, y) # Générer la graphique
>>>plt.show() # Afficher le graphique
Wednesday, March 24, 2010
Matplotilib
>>> x = np.random.uniform(0, 1, 1000) # Générer aléatoirement 100 valeurs
# uniformément répartis dans [0, 1]
>>> y = np.random.uniform(0, 1, 1000) # Générer aléatoirement 100 valeurs
# uniformément répartis dans [0, 1]
>>> plt.scatter(x, y) # Afficher un nuage de points avec
# cordonnées données par (x, y)
>>> plt.show() # Afficher la graphique
>>> x1 = np.random.normal(0.5, 0.1, 1000) # Générer aléatoirement 100
# valeurs normalement répartis dans avec moyenne 0.5 et écart-type 0.1
>>> y1 = np.random.normal(0.5, 0.1, 1000) # Générer aléatoirement 100
# valeurs normalement répartis dans avec moyenne 0.5 et écart-type 0.1
>>> plt.scatter(x1, y1, color=’red’) # Afficher un nuage de points rouges avec
# cordonnées données par (x1, y1)
Wednesday, March 24, 2010
SciPy
SciPy environnement open-source de calcul
scientifique en Python pour les sciences et
l’inégiérie
Dépend de NumPy, utilise les tableau
numériques de NumPy
Nombreuses routines d’optimisation,
intégration, résolution d’équations
Wednesday, March 24, 2010
SciPy applications
• statistics
• optimization
• numerical integration
• linear algebra
• Fourier transforms
• signal processing
• image processing
• genetic algorithms
• ODE solvers
• special functions
Wednesday, March 24, 2010
SciPy en pratique
Informations généralesn: http://www.scipy.org
Références: http://docs.scipy.org/doc/scipy/reference/
Recettes: http://www.scipy.org/Cookbook
Wednesday, March 24, 2010
Scipy: fonctions spéciales
http://www.dakarlug.org/pat/scientifique/html/scipy.html
Exemple : fonctions de Bessel du premier type
>>> from scipy.special import jn
>>> index = 1
>>> x = np.linspace(0, 10, 200)
>>> y = jn(index, x)
Et bien d’autres fonctions : gamma, beta,
erf, airy, legendre, fonctions
elliptiques, etc.
Wednesday, March 24, 2010
Algèbre linéaire : scipy.linalg
Alternatives à celles déjà dans Numpy
>>> from scipy import linalg
>>> a = np.array([[1, 2], [3, 4]])
>>> a = scipy.mat(a) # la transformation tableau -->
>>> linalg.eigvals(a) # valeurs propres
array([-0.37228132+0.j, 5.37228132+0.j])
>>> linalg.det(a) # determinant
-2.0
>>> a.I # matrice inverse
matrix([[-2. , 1. ],
[ 1.5, -0.5]])
>>> linalg.inv(a) # autre ecriture possible
array([[-2. , 1. ],
[ 1.5, -0.5]])
Wednesday, March 24, 2010
matrice est tres simple
!
Intégration : scipy.integrate
Intégration de fonction
>>>from scipy.integrate import quad
>>> quad(np.sin, 0, np.pi/2) #Intégrale de sin(x) entre 0 et pi/2
>>> quad(lambda x: np.sin(x) + np.cos(x) ** 2, 0, 100)
# L’intégrale de f: x->sin(x)+cos(x) dans [0; 100]
Exemple : résolvons l’ODE dy/dt = -2y entre t=0..10,
pour y(t=0)=1.:
>>> from scipy.integrate import odeint
>>> def eqdif(y, t): # la fonction de l’equa diff.
return -2*y
>>> t = np.linspace(0, 10, 100) #la discrétisation de l’intervalle
>>> y = odeint(eqdif, 1, t) # solution sur tous les points de t
>>> plt.plot(t,y) # visualisation de la solution (import pylab as plt)
Wednesday, March 24, 2010
ntégration : scipy.integrate (2)
Exemple : oscillation amortie d’une masse au bout d’un ressort (ODE du 2è
ordre)
La position de la masse obéit à l’ODE y'' + nu y' + om^2 y = 0, que
l’on peut transformer en un système de deux équations différentielles du
premier ordre, en résolvant pour le vecteur Y=(y, y').
>>>def eqdif(y,t, om, nu):
return (y[1], -om**2*y[0] - nu*y[1])
>>>y = odeint(eqdif, (1, 0), t, args=(3, 1)) # args correspond à (om, nu)
>>>plot(t, y[:,0], lw=2, label="y")
>>>plot(t, y[:,1], lw=2, label="y'")
Wednesday, March 24, 2010
optimisation: leastsq
Exemple: fit pour
a1*exp(-k1*t) +
a2*exp(-k2*t)
from scipy.optimize import leastsq
def dbexpl(t,p): #fonction pour le fit
return(p[0]*exp(-p[1]*t) + p[2]*exp(-p[3]*t))
#Génération de données bruitées «à fitter»
a1,a2, k1,k2 = 1.0, 1.0, 0.05, 0.2
t=arange(0,100,0.1)
data = dbexpl(t,[a1,k1,a2,k2]) + 0.02*randn(len(t))
def residus(p,data,t): #fonction résidus pour le fit
err = data - dbexpl(t,p)
return err
p0 = [0.5,1,0.5,1] # paramètres estimés initiaux
fit = leastsq(residus,p0,args=(data,t),full_output=1)
fit_param = fit[0]
fit_cov = fit[1]
print 'best fit parameters ',fit_param,‘covariance’,fit_cov
fit_data = dbexpl(t,fit_param)
plot(t,data,'x',t,fit_data,'r',t)
Wednesday, March 24, 2010
Références du cours
L’informatique scientifique avec Python:
http://www.dakarlug.org/pat/scientifique/
html/index.html
J. Grosjean http://dpt-info.u-strasbg.fr/
~grosjean/l1psimpc/tp_python.pdf
K. Hinsen, Introduction to scientific
programming in Python, http://www.moodlecri.org/mod/resource/view.php?id=516
Wednesday, March 24, 2010
Téléchargement