LyonHPC LyonHPC

4. Structures de contrôle

cloud
%matplotlib inline
import numpy as np
from IPython.display import HTML,display,IFrame,Video
from IPython.display import YouTubeVideo,Markdown
display(Markdown("**Video du cours: Introduction**"))
YouTubeVideo('iKoa5WBKOVA')

Video du cours: Introduction

Astuce

pour tester les programmes Python, vous pouvez vous connectez sur un serveur Jupyter, par exemple, pour les étudiants Lyon1 https://jupyter.mecanique.univ-lyon1.fr

4.1. Expression logique

vrai-faux

expression

notation algorithmique

syntaxe Python

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

!=

display(Markdown("**Video du cours: expression logique et test**"))
YouTubeVideo('5oCl0q6lQRw')

Video du cours: expression logique et test

Attention

Les vidéos utilisent un ancien interpréteur python 2.7, pour lequel print est un mot clé, soit print 'bonjour'. Avec Python 3, print est une fonction et il faut donc utiliser des parenthèses, soit print('bonjour')

4.1.1. Exemple en Python

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

4.2. Test conditionnel (branchement)

iftest

4.2.1. Organigramme: représentation graphique d’un algorithme

Algorithme

    si (test vrai) alors
       intruction(s) 1
    sinon
       intruction(s) 2
    fin si
    instruction(s) 3
from diagramme1 import trace_diagramme1
HTML(trace_diagramme1())

4.2.2. syntaxe Python

notation algorithmique

si (expression vrai) alors   
     execute intruction(s) 1  
sinon
     execute intruction(s) 2
fin si
execute instruction(s) 3

syntaxe Python (noter les :)

if expression :
    intruction1
else :
    intruction2
    
instruction3

4.2.3. indentation des structures de contrôle

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

4.2.4. tests imbriqués

si (condition1) alors
    instruction1
sinon si (condition2) alors
    instruction2
sinon
    instruction3
fin si
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

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

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-7-5162c46baa06>", line 4
else
    ^
SyntaxError: invalid syntax

4.2.6. 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

4.2.7. Programme Python

# 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.

4.3. 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

display(Markdown("**Video du cours: boucle itérative pour**"))
YouTubeVideo('2fv2KdqMr2o')

Video du cours: boucle itérative pour

Attention

Les vidéos utilisent un ancien interpréteur python 2.7, pour lequel print est un mot clé, soit print 'bonjour'. Avec Python 3, print est une fonction et il faut donc utiliser des parenthèses, soit print('bonjour')

4.3.1. Organigramme et algorithme

Algorithme

pour i de 0 a n-1
   execute intruction(s) 1
fin pour
execute instruction(s) 2
from diagramme2 import trace_diagramme2
HTML(trace_diagramme2())

4.3.2. syntaxe Python

Algorithmique

  • boucle par défaut (n itérations qui débute à 0 avec un incrément de 1)

      pour i de 0 a n-1
         instructions 1
      fin pour
      instructions 2
    
  • boucle générale (n-p)/q itérations qui débute à p avec un incrément q)

      pour i de p a n-1 pas q 
         instructions 1
      fin pour
      instruction2
    

Syntaxe Python

  • boucle par défaut noté l’utilisation de n (nbre d’itérations) et non n-1 (valeur max de i)

      for i in range(n):
             instruction1
      instruction2
    
  • boucle générale noté que la dernière valeur n est exclue pour que le nbre d’itérations soit égale à (n-p)/q

      for i in range(p, n, q):
         instruction1
      instruction2
    

4.3.3. Exemples en Python

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)

4.4. 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 \]

4.4.1. Organigramme: tableau des variables

Algorithme

1. S=0.
2. initialise n
3. pour i de 0 a n-1
4.   S = S + i
5. fin i
6. affiche S
from boucle1 import trace_boucle1
HTML(trace_boucle1())

4.4.2. Programme en Python

# 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

4.4.3. Visualisation de l’exécution du code Python

utilisation du site : http://pythontutor.com

vous pouvez copier l’exemple de code python sur le site pour l’exécuter

display(Markdown("**Visualisation de l'execution sur le site pythontutor**"))
Video("VIDEO_COURS/pythonlive_loop.mp4", embed=True,width=700, height=300)

Visualisation de l'execution sur le site pythontutor

4.5. Boucle tant que

while

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

notation algorithmique

Tantque (condition vrai)
    instruction(s) 1
Fin Tantque
instructions 2

Syntaxe python

while condition :
    instruction1
instruction2
display(Markdown("**Video du cours: boucle itérative tantque**"))
YouTubeVideo('i2qCuRP3uUk')

Video du cours: boucle itérative tantque

Attention

Les vidéos utilisent un ancien interpréteur python 2.7, pour lequel print est un mot clé, soit print 'bonjour'. Avec Python 3, print est une fonction et il faut donc utiliser des parenthèses, soit print('bonjour')

4.5.1. 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 \]

4.5.2. 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

4.5.3. Programme Python

# 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
# verification
print(np.exp(x))
2.718281828459045

4.5.4. questions

  • l’algorithme fonctionne-t-il pour x<0 ?

4.5.5. Visualisation de l’execution du code Python

utilisation du site : http://pythontutor.com

vous pouvez copier l’exemple de code python sur le site pour l’exécuter

display(Markdown("**Visualisation de l'execution sur le site pythontutor**"))
Video("VIDEO_COURS/pythonlive_pge.mp4", embed=True,width=700, height=300)

Visualisation de l'execution sur le site pythontutor

4.6. Erreurs courantes

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

4.6.1. Erreur: la condition n’est pas modifiée

exemple

condition=True
i=0
while condition :   
   i=i+1
print i
# tester le code

code Python corrigé

condition = True
i = 0
while condition:
    i = i + 1
    condition = i < 10
print(i)
10

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

exemple

x = 0.0
while (x != 1.0) :
   x = x + 0.1
print x
## test du code

solution introduire un compteur \(i\) et un test \(i>it_{max}\) avec un break

code python corrigé

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

4.7. Exemples

display(Markdown("**Video du cours: exemples et exercices d'application**"))
YouTubeVideo('uk4AwYc7NhY')

Video du cours: exemples et exercices d'application

Attention

Les vidéos utilisent un ancien interpréteur python 2.7, pour lequel print est un mot clé, soit print 'bonjour'. Avec Python 3, print est une fonction et il faut donc utiliser des parenthèses, soit print('bonjour')

4.7.1. 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

4.7.2. 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

4.7.3. programme Python

# 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.8993963697651604
a= 0.0 b= 20.0 t= 10.0 z= 0.9640275800758169
a= 0.0 b= 10.0 t= 5.0 z= 0.7615941559557649
a= 5.0 b= 10.0 t= 7.5 z= 0.9051482536448664
a= 5.0 b= 7.5 t= 6.25 z= 0.8482836399575129
a= 6.25 b= 7.5 t= 6.875 z= 0.8798266996519848
a= 6.875 b= 7.5 t= 7.1875 z= 0.8931933404003516
a= 7.1875 b= 7.5 t= 7.34375 z= 0.8993387348050462
a= 7.34375 b= 7.5 t= 7.421875 z= 0.9022844427556502
Temps  7.421875

4.8. Devoirs d’application

4.8.1. 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} \]

4.8.1.1. validation

\[ I=si(\pi)\approx 1.85193705198247\]

4.8.2. 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.

4.8.2.1. validation

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

4.9. Fin de la leçon

../_images/cloud_loop.png