Tracé de courbes et de surfaces avec Python et matplotlib. Appel de Python depuis le C



Documents pareils
pyensae StockPrices September 1, Manipulation de séries financières avec la classe StockPrices

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Calcul Scientifique avec 3

Cours 7 : Utilisation de modules sous python

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Gnuplot. Chapitre Lancer Gnuplot. 3.2 Options des graphes

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

MATLAB : COMMANDES DE BASE. Note : lorsqu applicable, l équivalent en langage C est indiqué entre les délimiteurs /* */.

1.6- Génération de nombres aléatoires

INFO-F-105 Language de programmation I Séance VI

Introduction au pricing d option en finance

Programme Compte bancaire (code)

Du bon usage de gnuplot

Introduction à l héritage en C++

Cours d initiation à la programmation en C++ Johann Cuenin

Calcul Formel et Numérique, Partie I

Informatique I. Sciences et Technologies du Vivant (Semestre 1)

et Programmation Objet

Corrigé des exercices sur les références

Optimisation, traitement d image et éclipse de Soleil

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

TP: Représentation des signaux binaires. 1 Simulation d un message binaire - Codage en ligne

Représentation d un entier en base b

Scilab pour les vrais débutants

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Programmation stochastique

Aide - mémoire gnuplot 4.0

Introduction à la présentation graphique avec xmgrace

Cours d Algorithmique et de Langage C v 3.0

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

ETUDE DE CAS en UML : GESTION DES COMMANDES DE PIECES FABRIQUEES PAR LA SOCIETE C

Programmation C++ (débutant)/instructions for, while et do...while

Génie Logiciel I. Cours VI - Typage statique / dynamique, fonctions virtuelles et classes abstraites, flots d entrées / sorties, et string

Introduction à MATLAB R

Annexe commune aux séries ES, L et S : boîtes et quantiles

Alfstore workflow framework Spécification technique

FONCTIONS DE PLUSIEURS VARIABLES (Outils Mathématiques 4)

Géométrie dans l espace Produit scalaire et équations

Examen d informatique première session 2004

TP1. Outils Java Eléments de correction

Cours d Analyse. Fonctions de plusieurs variables

Cours Fonctions de deux variables

TP 0 : INTRODUCTION À MATLAB

L informatique en BCPST

Cours 1: Java et les objets

Solutions du chapitre 4

2015 kmeans. September 3, 2015

Fonctions de plusieurs variables

Rappels sur les suites - Algorithme

Calcul Formel et Numérique, Partie I

3.2. Matlab/Simulink Généralités

Temps et thermodynamique quantique

URECA Initiation Matlab 2 Laurent Ott. Initiation Matlab 2

Cours 1 : La compilation

Plan Pédagogique du cours

L effet régulateur des moteurs de recherche. MICHEL Laurent

CHAPITRE V. Recherche et tri

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

Approche Contract First

Projet de programmation (IK3) : TP n 1 Correction

Python - introduction à la programmation et calcul scientifique

Introduction à l algorithmique et à la programmation M1102 CM n 3

Initiation à l algorithmique

Découverte de Python

Chapitre 3. Les distributions à deux variables

Le théorème de Perron-Frobenius, les chaines de Markov et un célèbre moteur de recherche

INF8007 Langages de script

Exercices Alternatifs. Quelqu un aurait-il vu passer un polynôme?

Exercices Alternatifs. Quelqu un aurait-il vu passer un polynôme?

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Fonction inverse Fonctions homographiques

Génération de code binaire pour application multimedia : une approche au vol

Programmation Orientée Objet Java

Programmation par les Objets en Java

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Conception et mise en œuvre d une interface de visualisation des résultats de simulation d une plate-forme de simulation individus-centrée

Exercices du Cours de la programmation linéaire donné par le Dr. Ali DERBALA

Apache Camel. Entreprise Integration Patterns. Raphaël Delaporte BreizhJUG

1 Représentation d une image

Outils pour les réseaux de neurones et contenu du CD-Rom

Java Licence Professionnelle CISII,

Bases Java - Eclipse / Netbeans

Baccalauréat ES Pondichéry 7 avril 2014 Corrigé

Présentation du langage et premières fonctions

Introduction à Matlab

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Introduction à MATLAB et SIMULINK

Manipulateurs Pleinement Parallèles

Chapitre 2 Le problème de l unicité des solutions

Gestion distribuée (par sockets) de banque en Java

PHY2723 Hiver Champs magnétiques statiques. Notes partielles accompagnant le cours.

Un ordonnanceur stupide

1 Définition et Appel d une fonction. V. Phan Luong. Cours 4 : Fonctions

Le prototype de la fonction main()

6 Equations du première ordre

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Université Paris-Dauphine DUMI2E 1ère année, Applications

Transcription:

L3 Mag1 Phys. fond. Notice matplotlib 215-9-29 9::34 page 1 Tracé de courbes et de surfaces avec Python et matplotlib Appel de Python depuis le C Ni le C ni le C++ ne possèdent d instructions graphiques permettant de tracer des courbes et des surfaces. Le but de cette notice est de montrer comment utiliser les possibilités graphiques de Python et de matplotlib à partir du C ou du C++. 1 Trois façons de tracer une courbe On veut tracer la courbe y = x 2 +3x+1 entre x = 3 et x = 1. 1.1 Avec l interpréteur de commandes Python Dans ce qui suit $ représente l invite de commande Linux et In [.] l invite de commande de l interpréteur Python. On lance l interpréteur de commandes ipython dans un terminal Linux : $ ipython pylab puis on écrit les commandes dans l interpréteur en appuyant sur la touche Entrée après chaque ligne : In [.] x=linspace(-3.,1.,1) # on demande 1 points équirépartis de -3 à 1 compris In [.] y=x**2+3*x+1 In [.] plot(x,y) ce qui donne la figure : 5 4 3 2 1 1 3..5. 1.5 1..5..5 1. Figure 1 On sort de l interpréteur par quit ou Ctrl d. Ce mode d utilisation, analogue à celui d une calculatrice, est adapté aux tracés les plus simples. 1.2 En écrivant les instructions Python dans un fichier On écrit les instructions Python précédentes dans un fichier nommé par exemple courbe 1 a.py. On ouvre le fichier à l aide d un éditeur de texte : $ emacs courbe 1 a.py & puis on y écrit les instructions : 1

L3 Mag1 Phys. fond. Notice matplotlib 215-9-29 9 : :34 page 2 from numpy import * from matplotlib.pyplot import * x=linspace(-3.,1.,1) y=x**2+3*x+1 plot(x,y) show() et on fait exécuter le programme Python écrit dans le fichier courbe 1 a.py par la commande : $ ipython courbe 1 a.py Ce mode d utilisation est adapté dès que le nombre d instructions et supérieur à deux ou trois ou quand on veut conserver ces instructions pour les réutiliser en les modifiant ou complétant si nécessaire. Ici il faut appeler explicitement les modules numpy et matplotlib.pyplot et ajouter l instruction show() alors que ce n était pas nécessaire avec l interpréteur grâce à l option pylab. Pour éviter d avoir à réécrire à chaque fois les lignes : et : from numpy import * from matplotlib.pyplot import * show() il existe une commande propre au Magistère nommée ipy qui les introduit automatiquement. Si le fichier courbe 1 b.py ne contient que les lignes : x=linspace(-3.,1.,1) y=x**2+3*x+1 plot(x,y) il suffit d écrire la commande : au lieu de : $ ipy courbe 1 b.py $ ipython courbe 1 b.py 1.3 En écrivant les instructions Python à partir d un programme C 1.3.1 Méthode brute On peut écrire et exécuter le programme Python à partir d un programme C comme celui-ci : #include<python.h> #include<iostream> #include<sstream> using namespace std; int main() { ostringstream ostpy; ostpy << "from numpy import *\n" << "from matplotlib.pyplot import *\n" << "x=linspace(-3.,1.,1)\n" << "y=x**2+3*x+1\n" << "plot(x,y)\n" << "show()" ; Py_Initialize(); PyRun_SimpleString(ostpy.str().c_str()); Py_Finalize(); return ; } 2

L3 Mag1 Phys. fond. Notice matplotlib 215-9-29 9::34 page 3 Les instructions Python sont écritesdans une chaînede caractères 1 nomméeici ostpypuis exécutéesparl instruction C : PyRun_SimpleString(ostpy.str().c_str()); Ce mode d utilisation permet de bénéficier des possibilités graphiques de Python dans un programme C. 1.3.2 En utilisant une fonction On peut transformer en une fonction (nommée ici make plot py) la partie du programme précédent qui est toujours la même : #include<python.h> #include<iostream> #include<sstream> using namespace std; void make_plot_py(ostringstream &ss) { ostringstream run_py; run_py << "from numpy import *\n" << "from matplotlib.pyplot import *\n" << "from mpl_toolkits.mplot3d import Axes3D\n" << ss.str() << "show()" ; // cout << run_py.str() << endl; Py_Initialize(); PyRun_SimpleString(run_py.str().c_str()); Py_Finalize(); } int main() { ostringstream pyth; pyth << "x=linspace(-3.,1.,1)\n" << "y=x**2+3*x+1\n" << "plot(x,y)\n" ; make_plot_py(pyth); return ; } 1.3.3 En utilisant la fonction mise dans la bibliothèque du Magistère La fonction make plot py étant incluse dans la bibliothèque du Magistère on aura juste à écrire : #include<python.h> #include<bibli_fonctions.h> int main() { ostringstream pyth; pyth << "x=linspace(-3.,1.,1)\n" << "y=x**2+3*x+1\n" << "plot(x,y)\n" ; 1. On utilise ici une chaîne de type ostringstream et non du type courant string pour des raisons qui apparaissent à la section 2. Le couple de caractères \n indique un passage à la ligne dans la chaîne. 3

L3 Mag1 Phys. fond. Notice matplotlib 215-9-29 9 : :34 page 4 } make_plot_py(pyth); return ; 2 Passage de paramètres du C à Python Supposons qu on veuille tracer non plus la courbe y = x 2 +3x+1 mais y = x 2 +ax+1 où a est une variable définie dans le programme C. Il suffit d ajouter, dans le main du programme précédent, les instructions qui déclarent et attribuent une valeur à la variable a : int main() { double a;... a=... // calcul quelconque... return ; } et de remplacer la ligne : par : << "y=x**2+3*x+1\n" << "y=x**2+" << a << "*x+1\n" À partir d ici, dans ces notes, on n écrit plus que les instructions Python proprement dites, l appel à partir du C comme à la sous-section 1.3.3 étant sous-entendu. Par exemple dans un cas comme celui du programme de la sous-section 1.3.3, on écrira seulement dans ces notes : x=linspace(-3.,1.,1) y=x**2+3*x+1 plot(x,y) 3 Tracer plusieurs courbes sur le même graphe x=linspace(-2.34,2.73,47) y1=(2+x)**2 y2=(1-x)**3 y3=y1+y2 plot(x,y1) plot(x,y2) plot(x,y3) ce qui donne la figure : 4

L3 Mag1 Phys. fond. Notice matplotlib 215-9-29 9 : :34 page 5 4 3 2 1 1 3 1 1 2 3 Figure 2 4 Tracer des courbes à partir de points écrits dans un fichier 4.1 Une seule courbe On veut tracer une courbe définie non plus par une expression mathématique mais par une liste de points dont les coordonnées x et y sont écrites dans un fichier. Ces coordonnées peuvent par exemple être le résultat d un calcul effectué par un programme C/C++ ou des valeurs expérimentales. Sur chaque ligne du fichier figure un couple x y comme sur l exemple suivant : 1.82776e+8 1.38477e+8 1.82777e+8 1.36734e+8 1.82778e+8 1.34974e+8... Les instructions Python sont : l=loadtxt( courbe_6.dat ) x=l[:,] y=l[:,1] plot(x,y) où courbe 6.dat est le nom du fichier contenant les coordonnées des points. Cela donne la figure : 5

L3 Mag1 Phys. fond. Notice matplotlib 215-9-29 9 : :34 page 6 8 1e8 7 6 5 4 3 2 1..5 1. 1.5 2. 1e8 Figure 3 4.2 Plusieurs courbes On a deux courbes définies respectivement par deux listes de couples de points (x i,y i ) et (x i,y i1 ). Le fichier doit écrit de la façon suivante : x y y 1 x 1 y 1 y 11 x 2 y 2 y 21... x p 1 y p 1, y p 1,1 Par exemple :.5.833325.42871 1.833298.425152 1.5.833253.429512... 6

L3 Mag1 Phys. fond. Notice matplotlib 215-9-29 9 : :34 page 7 4.2.1 Tracé brut A=loadtxt( courbe_7.dat ) plot(a[:,],a[:,1]) plot(a[:,],a[:,2]) ylim(-3,3) 3 2 1 1 3 1 2 3 4 5 Figure 4 7

L3 Mag1 Phys. fond. Notice matplotlib 215-9-29 9 : :34 page 8 4.2.2 Tracé habillé A=loadtxt( courbe_7.dat ) plot(a[:,],a[:,1],label= y(u) ) plot(a[:,],a[:,2],label= grandissement *1 ) plot(a[:,],*ones(a.shape[]),label= ) plot(a[:,],2*ones(a.shape[]),label= 2 ) ylim(-3,3) xlabel( u ) legend(loc=9) 3 2 y(u) grandissement *1 2 1 1 3 1 2 3 4 5 u Figure 5 On peut facilement généraliser à un nombre quelconque q de courbes. Le fichier est écrit de la façon suivante : x y, y,1... y,j... y,q 1 x 1 y 1, y 1,1... y 1,j... y 1,q 1... x i y i, y i,1... y i,j... y i,q 1... x p 1 y p 1, y p 1,1... y p 1,j... y p 1,q 1 et le tracé est fait par une boucle en Python : A=loadtxt( courbe_8.dat ) for i in range(1,12) : plot(a[:,],a[:,i]) 8

L3 Mag1 Phys. fond. Notice matplotlib 215-9-29 9 : :34 page 9 14 12 1 8 6 4 2..2.4.6.8 1. Figure 6 5 Tracer une courbe dans l espace 5.1 Courbe dans l espace définie par une expression mathématique 5.1.1 Tracé brut theta=linspace(-16*pi,16*pi,8) z=linspace(-2,2,8) r=z*z+1 x=r*sin(theta) y=r*cos(theta) gca(projection= 3d ).plot(x,y,z) 9

L3 Mag1 Phys. fond. Notice matplotlib 215-9-29 9 : :34 page 1 2. 1.5 1..5..5 1. 1.5. 4 2 4 4 2 4 Figure 7 5.1.2 Tracé habillé rcparams[ legend.fontsize ]=1 ax=figure().gca(projection= 3d ) theta=linspace(-16*pi,16*pi,8) z=linspace(-2,2,8) r=z*z+1 x=r*sin(theta) y=r*cos(theta) ax.plot(x,y,z,label= Courbe en parametrique ) ax.legend() 1

L3 Mag1 Phys. fond. Notice matplotlib 215-9-29 9 : :34 page 11 Courbe en parametrique 2. 1.5 1..5..5 1. 1.5. 4 2 4 4 2 4 Figure 8 5.2 Courbe dans l espace définie par des points Les points sont définis par des triplets de coordonnées x, y, z qui sont écrits dans le fichier de données de la façon suivante : x y z x 1 y 1 z 1 x 2 y 2 z 2... Par exemple : 1.982287.187381.3.929776.368125.6... 5.2.1 Tracé brut l=loadtxt( courbe_1.dat ) x=l[:,] y=l[:,1] z=l[:,2] gca(projection= 3d ).plot(x,y,z) 11

L3 Mag1 Phys. fond. Notice matplotlib 215-9-29 9 : :34 page 12 3. 2.5 1..5..5..5 1. 1..5 2. 1.5 1..5 1.. Figure 9 6 Tracer une surface 6.1 Surface définie par une expression mathématique 6.1.1 Tracé brut X=linspace(-5,5,4) Y=linspace(-5,5,4) X,Y=meshgrid(X,Y) Z=sin(sqrt(X**2+Y**2)) gca(projection= 3d ).plot_surface(x,y,z,rstride=1,cstride=1, cmap=cm.spectral_r,linewidth=,antialiased=false) 12

L3 Mag1 Phys. fond. Notice matplotlib 215-9-29 9 : :34 page 13.5..5 4 2 4 4 2 4 Figure 1 13

L3 Mag1 Phys. fond. Notice matplotlib 215-9-29 9 : :34 page 14 6.1.2 Tracé habillé X=linspace(-5,5,4) Y=linspace(-5,5,4) X,Y=meshgrid(X,Y) Z=sin(sqrt(X**2+Y**2)) surf=gca(projection= 3d ).plot_surface(x,y,z,rstride=1,cstride=1, cmap=cm.spectral_r, linewidth=,antialiased=false) gca().set_zlim(-1.5,1.5) colorbar(surf,shrink=.5,aspect=5) 4 2 4 4 1.1.79.56.34.11 -.11 -.34 -.56 -.79-1.1 2 4.8.6.4.2..2.4.6.8 Figure 11 14

L3 Mag1 Phys. fond. Notice matplotlib 215-9-29 9 : :34 page 15 6.2 Surface définie par des points Les valeurs de x et y doivent constituer un réseau régulier. Dans le fichier chaque ligne contient les valeurs de z pour un x donné et toutes les valeurs de y. 6.2.1 Tracé brut Z=loadtxt( surface_2.res ) X=arange(Z.shape[]) Y=arange(Z.shape[1]) X,Y=meshgrid(X,Y) gca(projection= 3d ).plot_surface(x,y,z.t,rstride=1,cstride=1,linewidth=, cmap=cm.spectral_r,antialiased=false) 1 8 6 4 2 2 4 6 8 1 3 2 1 6 5 4 Figure 12 15

L3 Mag1 Phys. fond. Notice matplotlib 215-9-29 9 : :34 page 16 6.2.2 Tracé habillé figure(1,figsize=(16,6)) subplot(1,2,1,projection= 3d ) Z=loadtxt( surface_2.res ) X=arange(Z.shape[]) Y=arange(Z.shape[1]) X,Y=meshgrid(X,Y) gca().plot_surface(x,y,z.t,rstride=1,cstride=1,linewidth=,cmap=cm.spectral_r,antialiased=false) xlabel( y ) ylabel( x ) title( Potentiel electrostatique ) subplot(1,2,2) cont=contour(z,arange(,11)*1.,cmap=cm.spectral_r) clabel(cont,fmt= %d ) xlabel( x ) ylabel( y ) title( Courbes de niveau ) Potentiel electrostatique 6 Courbes de niveau 1 5 8 6 4 3 9 8 7 2 4 2 x 3 5 6 4 2 4 y 6 8 1 6 3 45 x 12 2 1 9 1 2 4 6 8 1 y Figure 13 16