Marc BUFFAT

Professeur au département de Mécanique, Lyon 1 e-mail

Blog scientifique et pédagogique utilisant des notebooks IPython et Linux

cours en ligne INPROS: chapitre 4


Ipython notebook : cours INPROS LyonHPC

Auteur: Marc BUFFAT, Pr dpt de Mécanique, UCB Lyon 1

Contributeurs: Violaine Louvet, Michel Kern, Loic Gouarin, Laurence Viry </h5>

Licence Creative Commons
Mise à disposition selon les termes de la Licence Creative Commons
Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 2.0 France
.
In [1]:
%matplotlib inline
%autosave 300
import numpy as np
from IPython.display import HTML,display
css_file = 'style.css'
try:
    display(HTML(open(css_file, "r").read()))
    print("using ",css_file)
except :
    print("using default css")
Autosaving every 300 seconds
using default css

LyonHPC LyonHPC
</div> cloud

Contenu de la leçonLyonHPC

  1. Expression logique
  2. Test conditionnel
  3. Boucle itérative **pour**
    1. Algorithme itératif
  4. Boucle **tant que**
    1. Exemple de boucle tant que
  5. Exercices
    1. Exemple: méthode de dichotomie
    2. Devoirs: méthode des trapèzes, suite de Syracuse

Expression logique

vrai-faux

AlgorithmiquePython
*valeur logique* Vrai , Faux **True** ($\neq 0$) , **False**($= 0$)
*opérateurs logiques* et , ou , non **and** , **or** , **not**
*comparaisons* supérieur, supérieur ou égale **>** , **>=**
inférieur, inférieur ou égale **<** , **<=**
égalité **==**
différence **!=**

Exemple en Python

In [6]:
print(type(True))
print(True and False)
print(False or True)
a = 4
print(a < 4, a <= 4, a >= 4, a > 4, a == 5, a != 5 , not (a == 5))
print(True + False)
<class 'bool'>
False
True
False True True False False True True
1

Organigramme: représentation graphique d’un algorithme

In [7]:
from diagramme1 import trace_diagramme1
HTML(trace_diagramme1())
Out[7]:
AlgorithmeDiagramme
si (test vrai) alors intruction(s) 1 sinon intruction(s) 2 fin si instruction(s) 3

syntaxe Python

AlgorithmePython
si (expression vrai) alors execute intruction(s) 1 sinon execute intruction(s) 2 fin si execute instruction(s) 3 if expression : intruction1 else : intruction2

instruction3

</code></td></tr>
</table>

indentation des structures de contrôle

print "bloc1"
if (condition1) :
   print "bloc2"
   if (condition2) :
       print "bloc3"
   print "bloc2 suite"
print "bloc1 suite"

tests imbriqués

si (condition1) alors
    instruction1
sinon si (condition2) alors
    instruction2
sinon
    instruction3
fin si
In [8]:
i=15
print("si i=",i)
if i%2 == 0 :
    print("i divisible par 2")
elif i%3 == 0 :
    print("i divisible par 3 mais pas par 2")
elif i%5 == 0 :
    print("i divisible par 5 mais pas par 2 ni 3")
else :
    print("i non divisible par 2,3 et 5")
si i= 15
i divisible par 3 mais pas par 2

erreur de syntaxe: attention à l’indentation et au symbol :

In [9]:
a = 4
if a > 5:
    print("a est plus grand que 5")
else
print("a est plus petit ou egal a 5")
  File "<ipython-input-9-5162c46baa06>", line 4
    else
        ^
SyntaxError: invalid syntax

Exemple d’application

Problème: étant donné un nombre entier positif p, est-il pair ou impair ?

ALGORITHME Parite
  Initialisez p
  si (p modulo 2) == 0 alors
     Affiche "p est pair"
  sinon
     Affiche "p est impair"
  fin si

Programme Python

In [10]:
# programme parite
p = 17
print("valeur p =", p)
if p%2 == 0:
    print("p est pair.")
else:
    print("p est impair.")
valeur p = 17
p est impair.

Boucle itérative

boucle

  • nombre d’itérations n connues
  • compteur de boucle i (variable)
  • attention en algorithmique on compte en général à partir de 0
  • premier élément d’une séquence i=0

Organigramme et algorithme

In [11]:
from diagramme2 import trace_diagramme2
HTML(trace_diagramme2())
Out[11]:
AlgorithmeDiagramme
pour i de 0 a n-1 execute intruction(s) 1 fin pour execute instruction(s) 2

syntaxe Python

</tr>

</tr> </table>

Exemples en Python

In [12]:
for i in range(4):
    print(i)
print(range(4))
for j in range(1, 4, 2):
    print(j)
print(range(1, 4, 2))
0
1
2
3
range(0, 4)
1
3
range(1, 4, 2)

Algorithme itératif

Itération: répétition d’instructions un nombre fini de fois

  • boucle itérative avec un compteur

      Pour i=0,1,..,n-1
          instruction
      Fin Pour

exemple: calcul de la somme $S$ des $n$ premiers entiers $i$ positifs ou nul: $$S=\sum_{i=0}^{n-1} i $$

Organigramme: tableau des variables

In [13]:
from boucle1 import trace_boucle1
HTML(trace_boucle1())
Out[13]:
Algorithmique Python
**boucle
par défaut**
pour i de 0 a n-1 instructions 1 fin pour instructions 2 for i in range(n): instruction1 instruction2
**boucle
générale**
pour i de p a n-1 pas q instructions 1 fin pour instruction2 for i in range(p, n, q): instruction1 instruction2
AlgorithmeTableau de variables
1. S=0. 2. initialise n 3. pour i de 0 a n-1 4. S = S + i 5. fin i 6. affiche S
In [14]:
# programme de calcul de la somme de n entiers
S = 0
n = 8
for i in range(n):
    S = S + i
    print(S, i)
print("Somme (des ", n, " premiers entiers >= 0)  S =", S)
0 0
1 1
3 2
6 3
10 4
15 5
21 6
28 7
Somme (des  8  premiers entiers >= 0)  S = 28
In [15]:
HTML('<iframe width="900" height="300" frameborder="0" src="http://pythontutor.com/iframe-embed.html#code=S%3D0%0An%3D5%0Afor+i+in+range(n)%3A%0A++++S+%3D+S+%2B+i%0ASomme+%3D+S&cumulative=false&heapPrimitives=false&drawParentPointers=false&textReferences=false&showOnlyOutputs=false&py=2&curInstr=14&codeDivWidth=350&codeDivHeight=400"> </iframe>')
Out[15]:

Boucle tant que

while Algorithme itératif dont le nombre d’itérations n’est pas connu à l’avance.

Algorithmique Python
Tantque (condition vrai) instruction(s) 1 Fin Tantque instructions 2 while condition: instruction1 instruction2

Exemple de boucle tant que

Calcul de la somme de la série $\frac{x^i}{i!}$ avec une précision $\epsilon$ fixée $$ S = \sum_i \frac{x^i}{i!} \mbox{ pour tout } i \mbox{ t.q.} \frac{x^i}{i!} > \epsilon $$

Algorithme

ALGORITHME somme
initialiser x,eps
S = 0.
i = 0
term = 1.
tant que (term > eps) repeter
    S = S + term
    i = i + 1
    term = term * x / i
afficher "Somme = ",S

In [16]:
# programme somme
x = 1.
eps = 1.0e-10
S = 0.
i = 0
term = 1.
while term > eps:
    S = S + term
    i = i + 1
    term = term * x / i
print("Somme S =", S, " avec ", i, " termes")
Somme S = 2.7182818284467594  avec  14  termes
In [18]:
# verification
print(np.exp(x))
2.71828182846

questions

  • l’algorithme fonctionne-t-il pour x<0 ?
In [19]:
HTML('<iframe width="800" height="350" frameborder="0" src="http://pythontutor.com/iframe-embed.html#code=%23+programme+somme%0Ax+%3D+2.%0Aeps+%3D+1.0e-5%0AS+%3D+0.%0Ai+%3D+0%0Aterm+%3D+1.%0Awhile+(term%3Eeps)+%3A%0A++++S+%3D+S+%2B+term%0A++++i+%3D+i+%2B+1%0A++++term+%3D+term+*+x+/+i%0Aprint+%22Somme+S%3D%22,+S,+%22+avec+%22,i,%22+termes%22&cumulative=false&heapPrimitives=false&drawParentPointers=false&textReferences=false&showOnlyOutputs=false&py=2&curInstr=55&codeDivWidth=350&codeDivHeight=400"> </iframe>')
Out[19]:

Erreurs courantes

la valeur de la condition ne devient jamais fausse => itération infinie

Erreur: la condition n’est pas modifiée

exemple

condition=True
i=0
while condition :   
   i=i+1
print i

code Python corrigé

In [21]:
condition = True
i = 0
while condition:
    i = i + 1
    condition = i < 10
print(i)
10

Erreur: la condition est trop contraignante (précision)

exemple

x = 0.0
while (x != 1.0) :
   x = x + 0.1
print x

solution introduire un compteur $i$ et un test $i>it_{max}$ avec un break code python corrigé

In [23]:
x = 0.0
i = 0
while x != 1.0:
    x = x + 0.1
    print(repr(x))
    i = i + 1
    if i > 10: break
print("x =", x, i)
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999
1.0999999999999999
x = 1.0999999999999999 11

méthode de dichotomie

On suppose que pendant son lancement, l’altitude $z(t)$ d’un satellite est donnée par: $$z(t) = H * tanh(\frac{t}{T}) \mbox{ avec } T = 5 h $$ Au bout de $20 h$ le satellite atteint son orbite.

Au bout de quel temps $t_1$ le satellite atteint-il son orbite à $1\%$ près i.e calculer $t_1$ tel que: $$ z(t_1)=0.99*z(20) $$ On déterminera la valeur de $t_1$ à 0.1h près en utilisant une méthode de dichotomie.

schéma schema1

Solution algorithme de dichotomie

ALGORITHME Dichotomie
a = 0.
b = 20.
z0 = 0.99*tanh(b/5.)
tant ((b-a)>0.1) repeter
    t = (a+b)/2.
    si tanh(t/5.) > z0 alors
        b = t
    sinon
        a = t
    fin si
 fin tant
 Affiche "Temps t =", t

programme Python

In [26]:
# programme dichotomie
import numpy as np
a = 0.
b = 20.
z0 = 0.9*np.tanh(b/5.)
print("z0 = ", z0)
while b - a > 0.1:
    t = (a+b) / 2.
    z = np.tanh(t/5.)
    print("a=", a, "b=", b, "t=", t, "z=", z)
    if z > z0:
        b = t
    else:
        a = t
print("Temps ", t)
z0 =  0.899396369765
a= 0.0 b= 20.0 t= 10.0 z= 0.964027580076
a= 0.0 b= 10.0 t= 5.0 z= 0.761594155956
a= 5.0 b= 10.0 t= 7.5 z= 0.905148253645
a= 5.0 b= 7.5 t= 6.25 z= 0.848283639958
a= 6.25 b= 7.5 t= 6.875 z= 0.879826699652
a= 6.875 b= 7.5 t= 7.1875 z= 0.8931933404
a= 7.1875 b= 7.5 t= 7.34375 z= 0.899338734805
a= 7.34375 b= 7.5 t= 7.421875 z= 0.902284442756
Temps  7.421875

Devoirs d’application

Méthode des trapèzes

calcul de la valeur approchée de l’intégrale $\int_a^b{f(x)dx}$

Methode des trapezes

$$ \int_a^b{f(x)dx} \approx \sum_{i=1}^n{h \frac{f(x_i)+f(x_{i-1})}{2}} \mbox{ avec } x_i=a+ih \ ,\ h=\frac{b-a}{n}$$

Ecrire un programme Python qui calcule une estimation de
$$ I=\int_0^\pi{\frac{sin(x)}{x}dx} $$

validation

$$ I=si(\pi)\approx 1.85193705198247$$

Calcul de la suite de Syracuse

Écrire un programme qui calcule la suite d’entiers définie par la règle suivante:

  • on part d’un nombre entier n plus grand que zéro; s’il est pair, on le divise par 2 ; s’il est impair, on le multiplie par 3 et on ajoute 1
  • on recommence et on s’arrête lorsque l’on arrive à 1

La conjecture de Collatz, énoncée en 1937, postule que cette suite de Syracuse s’arrête au bout d’un nombre fini d’itérations.

validation

Pour n=3, on obtient la suite suivante: 3, 10, 5, 16, 8, 4, 2, 1