5+4
5-14
3*8
3.5*3.14
$e \times \hbar$
1.6e-19*6.6e-34
(1+3j)*(3+2j)
(1+3j)/(3+2j)
2/3
2./3
from __future__ import division
2/3
$x = a + j b^2$
a = 3
b = 6.5
x = a + 1j*(b**2)
print(x)
type(a), type(b), type(x)
import scipy
scipy.sin(0.1)
import scipy as sp
sp.sin(0.1)
from scipy import sin
sin(0.1)
from scipy import *
sin(0.1), cos(2), log(4)
L1 = [1,20,3.14,1+3j]
L2 = [2.5,"toto", L1]
print(L1,L2)
type(L1), type(L2)
from numpy import * # les tableaux appartiennent au module numpy
A = array([1,4,3.14])
L = [5,pi/2]
B = array(L)
print (A,L,B)
type(A),type(L),type(B)
L1 = [3,6,2]
L2 = [8,14,4]
L = L1+L2
print (L)
A1 = array(L1)
A2 = array(L2)
A = A1+A2
print (A)
L = range(4,15,3)
print (L)
Petite subtilité en Python 3.x
la fonction range
ne retourne pas une liste comme en Python 2.x
mais un objet de type range
.
Pour afficher la liste associée à un objet de type range
il faut rendre la liste explicite.
print (list(L))
Le comportement d'un objet de type range
est en revanche similaire à celui d'un objet liste
.
Ces deux fonctions appartiennent au module numpy
, elle ne retourne pas des listes mais des tableaux (array
).
A1 = arange(2,3,0.2)
print (A1)
A2 = linspace(0,10,6)
print (A2)
Afficher tout le tableau
x = linspace(2,12,6)
print (x)
N'afficher que certaines valeurs dont l'indice est connu
print (x[0], x[3])
Afficher l'ensemble des éléments à partir d'un indice donné
print(x[3:])
Afficher l'ensemble des éléments jusqu'à un indice donné
print (x[:3])
Un autre façon d'afficher tout le tableau
print (x[:])
Afficher depuis la fin du tableau (python est équipé d'une marche arrière...)
print (x[2:-1]) # affichage depuis l'élément d'indice 2
# jusqu'au dernier élément (non inclus)
# l'indice -1 est celui du dernier élément
# -2 l'avant dernier, etc...
MM = array([[1, 2, 3] , [10, 11, 12] , [20, 21, 22]]) # 3 lignes, 3 colonnes
print (MM[0,0])
Le premier indice pour les lignes
print (MM[2,0])
Le second pour les colonnes
print (MM[0,2])
Afficher tous les éléments d'une ligne...
print (MM[0,:]) # ligne "zéro"
...ou tous ceux d'une colonne
print (MM[:,1]) # colonne "un"
plot()
et show()
de la bibliothèque matplotlib)#!/usr/bin/env python
# -*- coding: utf-8 -*-
""" Programme minimal de tracé d’une fonction Python 3.x
"""
from scipy import *
from pylab import *
x = linspace(0, 10, 400) # on construit un tableau de 400 valeurs entre 0 et 10
y = sin(x)*exp(-x/5) # on construit le tableau des 400 valeurs de y correspondantes
plot(x,y, label=u"fonction $\sin(x)*\exp(-x/5)$")
legend()
show()
Quelques remarques
# -*- coding: utf-8 -*-
permet de pouvoir utiliser des caractères accentués dans les textes (attention pas dans les noms des variables)matplotlib
ne soit pas importé, en fait, il l'est mais dans pylab
(de même que numpy
).numpy
modifie les fonctions de base pour qu'elles soient capables d'effectuer, de manière transparente pour l'utilisateur, des calculs sur l'ensemble d'un tableau. (Ici la ligne donnant le tableau des y
)Prenons l’exemple d’une molécule diatomique. L’énergie potentielle qui traduit l’interaction entre les deux atomes est souvent modélisée par une fonction analytique appelée « potentiel de Morse » dont voici l’expression en fonction de la distance interatomique $R$ :
$$V(R)=D_e\left[1-exp(-\beta(R-R_{eq}))^2\right]$$
Les paramètres $R_{eq}$ , $D_e$ et $\beta$ définissent respectivement :
la distance interatomique à l’équilibre,
la profondeur du puits de potentiel (égal à la différence d’énergie entre la situation à l’équilibre $R =R_{eq}$, et la situation dissociée $R = +\infty$) et
la "largeur" du puits.
Reproduire la courbe de Morse pour la cas de la molécule $Cl_2$ ($R_{eq} = 0.198nm$, $D_e = 243 kJ.mol^{-1}$, $\beta = 20.0 nm^{-1}$ ).
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Potentiel de Morse Cl2
"""
from scipy import *
from pylab import *
req=1.98
de=243
beta=2.0
x = linspace(1, 6, 100)
y = de*(1-exp(-beta*(x-req)))**2
plot(x,y,'-o', label=u" $V \ (R)=D_e*(1-\exp(-\\beta*(R-R_{eq})))^2$")
title(u"Potentiel de Morse Cl$_2$", fontsize=16)
xlabel(u"$R \ (\AA)$", fontsize=16)
ylabel(u"$V \ (kJ.mol^{-1})$", fontsize=16)
text(4,100, u"$D_e=243 \ kJ.mol^{-1}$", fontsize=14,color='k')
text(4,70, u"$R_{eq}=1,98 \AA$", fontsize=14,color='k')
text(4,40, u"$\\beta=2 \AA^{-1}$", fontsize=14,color='k')
axis([1,6,0,400])
legend()
show()
Quelques remarques
\
sont à la fois partagés par LaTeX et par les régles de syntaxe des caractères de commande dans de nombreux langages (C, C++, python, java, processing,...).
Le caractère '\n'
(attention il faut voir cette syntaxe comme celle d'un caractère unique et pas celle de deux caractères '\'
et 'n'
) signfie passer à la ligne suivante
(LF
pour line feed). Le problème se pose alors lorsque vous voulez écrire une expression mathématique contenant par exemple les caractères $\nu$ ou $\nabla$ (nu
ou nabla
) dont la syntaxe est \nu
ou \nabla
. Le programme ne sait alors pas comment interpréter la chaîne ('\n'
puis 'u'
ou 'abla"
ou alors $\nu$ ou $\nabla$). La solution adoptée est alors de doubler le signe \
quand il y a ambiguïté pour obtenir $\nu$ ou $\nabla$, on écrira donc \\nu
ou \\nabla
. C'est ce qui se passe dans le plot précédent pour $\beta$ puisque \b
est aussi un caractère de contrôle.Tracer sur la figure précédente les courbes représentant le potentiel de Morse des molécules
$F_2$ et $I_2$ caractérisées par les paramètres suivants :
$F_2$ : ($R_{eq} = 0.142nm$, $D_e = 150 kJ.mol^{-1}$, $\beta = 23.9nm^{-1}$)
$I_2$ : ($R_{eq} = 0.267nm$, $D_e = 148 kJ.mol^{-1}$, $\beta = 15.0nm^{-1}$)
Quelques indications :
le nom des axes est fixé grâce aux fonctions xlabel()
et ylabel()
le titre est indiqué à l’aide de la fonction title()
les marqueurs de ligne sont donnés par : ’o’ pour les cercles, ’s’ pour les carrés (square), ’v’ pour les triangles pointe vers le bas et ’^’ pour les triangles pointes vers le haut
on peut fixer le domaine de représentation graphique à l’aide de la fonction axis([xmin,xmax,ymin,ymax])
.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Potentiel de Morse Cl2, F2 et I2
"""
from scipy import *
from pylab import *
#pour Cl2
req=1.98
de=243
beta=2.0
x = linspace(1, 6, 50)
y = de*(1-exp(-beta*(x-req)))**2
plot(x,y,'-o', label=u"$Cl_2$")
req=1.42
de=150
beta=2.39
y = de*(1-exp(-beta*(x-req)))**2
plot(x,y,'-s', label=u"$F_2$")
#pour I2
req=2.67
de=148
beta=1.50
y = de*(1-exp(-beta*(x-req)))**2
plot(x,y,'-v', label=u"$I_2$")
title(u"Potentiel de Morse $Cl_2$, $F_2$ et $I_2$", fontsize=16)
xlabel(u"$R \ (\AA)$", fontsize=16)
ylabel(u"$V \ (kJ.mol^{-1})$", fontsize=16)
#text(4,100, ur"$D_e=243 \ kJ.mol^{-1}$", fontsize=14,color='k')
#text(4,70, ur"$R_{eq}=1,98 \AA$", fontsize=14,color='k')
#text(4,40, ur"$\beta=2 \AA^{-1}$", fontsize=14,color='k')
axis([1,6,0,400])
legend()
show()