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é sousla 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