TP programmation python¶

base de programmation Python¶

In [1]:
%matplotlib inline
import sys,os
import numpy as np
import scipy as sp
import matplotlib
import matplotlib.pyplot as plt
from random import random
import importlib
# initialisation
from validation.validation import info_etudiant, check_function,liste_functions, info_function
from validation.valide_markdown import test_markdown, test_code, test_algorithme
from IPython.display import display, Markdown, Latex
def printmd(string):
    display(Markdown(string))
# test si numero étudiant spécifier
try: NUMERO_ETUDIANT
except NameError: NUMERO_ETUDIANT = None 
if type(NUMERO_ETUDIANT) is not int :
    printmd("## ERREUR: numéro d'étudiant non spécifié!!!")
    NOM, PRENOM, NUMERO_ETUDIANT = info_etudiant()
    #raise AssertionError("NUMERO_ETUDIANT non défini")
# parametres spécifiques
_uid_    = NUMERO_ETUDIANT
np.random.seed(_uid_)
printmd("**Etudiant** {} {}  id={}".format(NOM,PRENOM,NUMERO_ETUDIANT))

ERREUR: numéro d'étudiant non spécifié!!!¶

Etudiant NBGrader Course id=2592889824

Manipulation de variable¶

créer une variable x, qui contient successivement les valeurs suivantes

  • 1
  • 1.0
  • "1"
  • "1.0"
  • "un"

pour chaque cas, on affichera avec un print la valeur de la variable et son type (avec type)

In [1]:
x = None
## BEGIN SOLUTION
x = 1
print(x,type(x))
x = 1.0
print(x,type(x))
x = "1"
print(x,type(x))
x = "1.0"
print(x,type(x))
x = "un"
print(x,type(x))
## END SOLUTION
1 <class 'int'>
1.0 <class 'float'>
1 <class 'str'>
1.0 <class 'str'>
un <class 'str'>

Opération sur les variables¶

on veut ajouter 2 à la variable x précédente et mettre le résultat dans une nouvelle variable y. En reprenant les valeurs de x précédentes, choisissez la bonne instruction (pour avoir une valeur de y du même type que x)

  1. y = x + 2
  2. y = x + 2.0
  3. y = x + "2"
  4. y = x + "deux"
In [2]:
x = None
y = None
## BEGIN SOLUTION
x = 1
y = x + 2
print(y,type(y))
x = 1.0
y = x + 2  # c'est volontaire pour expliquer la conversion automatique ou bien x + 2.0 ? 
print(y,type(y))
x = "1"
y = x + "2"
print(y,type(y))
x = "un"
y = x + "deux"
print(y,type(y))
## END SOLUTION
3 <class 'int'>
3.0 <class 'float'>
12 <class 'str'>
undeux <class 'str'>

Expression mathématique¶

soit l'expression $$ C_i = \frac{x^{i+1}}{2i}$$

pour les valeurs de i et de x suivantes, calculer cette expression en Python et mettre le résultat dans une variable Ci et afficher sa valeur.

In [3]:
i = 4
x = -2.
Ci = None
## BEGIN SOLUTION
Ci = x**(i+1)/(2*i) 
print(Ci)
## END SOLUTION
-4.0

Liste¶

Créer une liste LC3 contenant les 3 premières valeurs de $C_i$ pour i=1,2,3 . On calculera d'abord les 3 valeurs dans C1, C2 et C3 en réutilisant les instructions précédentes, et on affichera la valeur de LC3

In [5]:
LC2 = None
## BEGIN SOLUTION
i = 1
C1 = x**(i+1)/(2*i) 
i = 2
C2 = x**(i+1)/(2*i) 
i = 3
C3 = x**(i+1)/(2*i) 
LC3 = [C1, C2, C3]
print(LC3)
## END SOLUTION
[2.0, -2.0, 2.6666666666666665]

Boucle sur des listes¶

On veut généraliser l'approche précédente pour créer une liste LC contenant les n premières valeurs de $C_i$ pour i=1 à n, où la valeur de n est stockée dans une variable. On commencera par choisir n=3 pour comparer avec le résultat précédent puis on l'appliquer pour n=10.

In [6]:
n = 3
LC = None
## BEGIN SOLUTION
LC = []
for i in range(1,n+1):
    LC.append(x**(i+1)/(2*i))
print(LC)
## END SOLUTION
[2.0, -2.0, 2.6666666666666665]

Tableaux¶

On veut faire la meme chose, mais au lieu d'utiliser une liste, on utilisera un tableau numpy Tab

In [7]:
import numpy as np
n = 3
Tab = None
## BEGIN SOLUTION
n = 10 # exercise suivant
Tab = np.zeros(n)
for i in range(1,n+1):
    Tab[i-1] = x**(i+1)/(2*i)
print(Tab)
## END SOLUTION
[   2.           -2.            2.66666667   -4.            6.4
  -10.66666667   18.28571429  -32.           56.88888889 -102.4       ]

Manipulation¶

Dans la cellule précédente, faites le calcul du tableau Tab pour n=10. On remarque que les valeurs de Tab alternent de signe car x est négatif.

En sélectionnant un élément sur deux, mettez tous les éléments positifs de Tab dans un nouveau tableau Tplus. Pour vérifier, affichez le tableau Tplus, sa valeur max, sa valeur min et sa valeur moyenne.

In [8]:
import numpy as np
Tplus = None
## BEGIN SOLUTION
Tplus = Tab[0::2]
print(Tplus,max(Tplus),min(Tplus),np.mean(Tplus))
## END SOLUTION
[ 2.          2.66666667  6.4        18.28571429 56.88888889] 56.888888888888886 2.0 17.24825396825397

Fonction¶

On veut étudier la fonction $f(x)=sin(\pi x) + 2 cos(\pi x)$.

Écrire une fonction Python F(x) qui calcule la valeur de cette fonction pour une valeur de x passée en argument.

Calculer la valeur de F(x) sur deux périodes et tracer la fonction sur cet intervalle. Pour calculer la valeur de F(x) en N=51 points équi-répartis sur l'intervalle en utilisant, en créant 2 tableaux X et Y.

  • la fonction np.linspace()
  • la fonction plt.plot(X,Y) pour tracer la fonction
In [9]:
# définition de la fontion F(x)
import numpy as np
import matplotlib.pyplot as plt
## BEGIN SOLUTION
def F(x):
    return np.sin(np.pi*x) + 2*np.cos(np.pi*x)
## END SOLUTION
# tracer
X = None
Y = None
## BEGIN SOLUTION
X = np.linspace(0,2*2,51)
Y = F(X)
plt.plot(X,Y,label="y=f(x)")
plt.xlabel('x')
plt.ylabel('y')
plt.title("Fonction périodique")
plt.legend()
## END SOLUTION
Out[9]:
<matplotlib.legend.Legend at 0x7fa2f135b7c0>

On souhaite généraliser, pour étudier les fonctions $g(x)=sin(\omega\,x) + a cos(\omega\,x)$.

Ecrire une fonction python G(x,A,periode) qui prend comme argument x, l'amplitude A et la période periode , et renvoie la valeur de g(x).

Calculer la valeur de G(x) sur deux périodes et tracer la fonction sur cet intervalle

In [10]:
# Fonction G(x,A,periode)
import numpy as np
import matplotlib.pyplot as plt
## BEGIN SOLUTION
def G(x,A,periode):
    omega = 2*np.pi/periode
    return np.sin(omega*x) + A*np.cos(omega*x)
## END SOLUTION
# tracer 
T = 2.0
a = 1.0
X = None
Y = None
## BEGIN SOLUTION
X = np.linspace(0,2*T,51)
Y = G(X,a,T)
plt.plot(X,Y,label="y=g(x)")
plt.xlabel('x')
plt.ylabel('y')
plt.title("Fonction périodique a={} T={}".format(a,T))
plt.legend()
## END SOLUTION
Out[10]:
<matplotlib.legend.Legend at 0x7fa2f124df40>

Erreurs sur les expressions¶

Conversion d'une vitesse de m/s en km/h.¶

Tester les instructions suivantes pour déterminer l'instruction correcte permettant de convertir la vitesse stockée dans la variable vit en km/h et stocker le résultat dans vitkmh

Pour cela on affichera la valeur et le type (avec type) de la variable vitkmh calculée

In [11]:
# valeur de la vitesse en m/s
import numpy as np
vit = 10.0
## afficher le type et la valeur des expressions suivantes
vitkmh = vit*3,6
## BEGIN SOLUTION
print(type(vitkmh),vitkmh)
## END SOLUTION
vitkmh = (vit*3,6)
## afficher le type et la valeur
## BEGIN SOLUTION
print(type(vitkmh),vitkmh)
## END SOLUTION
vitkmh = [vit*3,6]
## afficher le type et la valeur
## BEGIN SOLUTION
print(type(vitkmh),vitkmh)
## END SOLUTION
vitkmh = {vit*3,6}
## afficher le type et la valeur
## BEGIN SOLUTION
print(type(vitkmh),vitkmh)
## END SOLUTION
vitkmh = vit*3.6
## afficher le type et la valeur
## BEGIN SOLUTION
print(type(vitkmh),vitkmh)
## END SOLUTION
vitkmh = (vit*3.6)
## afficher le type et la valeur
## BEGIN SOLUTION
print(type(vitkmh),vitkmh)
## END SOLUTION
vitkmh = [vit*3.6]
## afficher le type et la valeur
## BEGIN SOLUTION
print(type(vitkmh),vitkmh)
## END SOLUTION
vitkmh = {vit*3.6}
## afficher le type et la valeur
## BEGIN SOLUTION
print(type(vitkmh),vitkmh)
## END SOLUTION
<class 'tuple'> (30.0, 6)
<class 'tuple'> (30.0, 6)
<class 'list'> [30.0, 6]
<class 'set'> {30.0, 6}
<class 'float'> 36.0
<class 'float'> 36.0
<class 'list'> [36.0]
<class 'set'> {36.0}

Conversion d'un tableau de vitesse de m/s en km/h.¶

idem mais vit est maintenant un tableau numpy contenant des valeurs de vitesse

In [12]:
import numpy as np
vit = np.array([10,20.,30.,40.])
## afficher le type et la valeur des expressions
vitkmh = vit*3,6
## BEGIN SOLUTION
print(type(vitkmh),vitkmh)
## END SOLUTION
vitkmh = (vit*3,6)
## afficher le type et la valeur
## BEGIN SOLUTION
print(type(vitkmh),vitkmh)
## END SOLUTION
vitkmh = [vit*3,6]
## afficher le type et la valeur
## BEGIN SOLUTION
print(type(vitkmh),vitkmh)
## END SOLUTION
vitkmh = vit*3.6
## afficher le type et la valeur
## BEGIN SOLUTION
print(type(vitkmh),vitkmh)
## END SOLUTION
vitkmh = (vit*3.6)
## afficher le type et la valeur
## BEGIN SOLUTION
print(type(vitkmh),vitkmh)
## END SOLUTION
vitkmh = [vit*3.6]
## afficher le type et la valeur
## BEGIN SOLUTION
print(type(vitkmh),vitkmh)
## END SOLUTION
vitkmh = np.array([vit*3.6])
## afficher le type et la valeur
## BEGIN SOLUTION
print(type(vitkmh),vitkmh)
## END SOLUTION
<class 'tuple'> (array([ 30.,  60.,  90., 120.]), 6)
<class 'tuple'> (array([ 30.,  60.,  90., 120.]), 6)
<class 'list'> [array([ 30.,  60.,  90., 120.]), 6]
<class 'numpy.ndarray'> [ 36.  72. 108. 144.]
<class 'numpy.ndarray'> [ 36.  72. 108. 144.]
<class 'list'> [array([ 36.,  72., 108., 144.])]
<class 'numpy.ndarray'> [[ 36.  72. 108. 144.]]

Calcul de somme¶

On souhaite utiliser python pour faire le calcul automatique de la somme suivante:

$$ S=1 -\frac{x^2}{2}+\frac{x^4}{4}-\frac{x^6}{6}+....\pm\frac{x^{2n}}{2n} = 1 + \sum_{i=1}^n (-1)^i \frac{x^{2i}}{2i}$$

pour des valeurs de x et n fixées et stockées dans les variables x et n suivantes. On mettra la valeur calculée dans la variable S.

Tester les instructions suivantes pour déterminer l'instruction correcte permettant de calculer cette somme dans S

Pour cela on affichera la valeur et le type (avec type) de la variable S calculée

In [13]:
import numpy as np

x = 0.1
n = 11
#
for i in range(1,n):
    S = 1 + ((-1)**i)*((x**(2*i))/(2*i))
## BEGIN SOLUTION
print(type(S),S)
## END SOLUTION
S = 1
for i in range(1,n):
    S = ((-1)**i)*((x**(2*i))/(2*i))
## BEGIN SOLUTION
print(type(S),S)
## END SOLUTION
S = 0.0
for i in range(1,n):
    S = S + ((-1)**i)*((x**(2*i))/(2*i))
## BEGIN SOLUTION
print(type(S),S)
## END SOLUTION
S = 1.0
for i in range(1,n):
    S = S + ((-1)**i)*((x**(2*i))/(2*i))
## BEGIN SOLUTION
print(type(S),S)
## END SOLUTION
for i in range(1,n):
    S += ((-1)**i)*((x**(2*i))/(2*i))
S = S + 1.0
## BEGIN SOLUTION
print(type(S),S)
## END SOLUTION
for i in range(1,n+1):
    S = S + ((-1)**i)*((x**(2*i))/(2*i))
## BEGIN SOLUTION
print(type(S),S)
## END SOLUTION
S = 1.0
for i in range(1,n+1):
    S = S + ((-1)**i)*((x**(2*i))/(2*i))
## BEGIN SOLUTION
print(type(S),S)
## END SOLUTION
<class 'float'> 1.0
<class 'float'> 5.000000000000006e-22
<class 'float'> -0.0049751654265840425
<class 'float'> 0.9950248345734161
<class 'float'> 1.9900496691468321
<class 'float'> 1.9850745037202482
<class 'float'> 0.9950248345734161

Somme d'un tableau¶

Créer un tableau $C=[C_i]$ (pour i de 1 à n) avec $$ C_i = (-1)^i \frac{x^{2i}}{2i}$$

On calcule la somme précédente en faisant la somme des éléments du tableau

Pour cela, on crée un tableau numpy C de n valeurs, on fait une boucle et on utilise avec la fonction python np.sum(C)

Tester les instructions suivantes pour déterminer l'instruction correcte permettant de calculer cette somme dans S

Pour cela on affichera la valeur et le type (avec type) de la variable S calculée et le type et la taille du tableau C.

In [14]:
import numpy as np
#
C = np.zeros(n)
for i in range(1,n):
    C[i] = ((-1)**i)*(x**(2*i))/(2*i)
S = np.sum(C)
## BEGIN SOLUTION
print(type(S),S,type(C),C.size)
## END SOLUTION
C = np.zeros(n)
for i in range(1,n):
    C[i-1] = ((-1)**i)*(x**(2*i))/(2*i)
S = 1 + np.sum(C)
## BEGIN SOLUTION
print(type(S),S,type(C),C.size)
## END SOLUTION
C = np.zeros(n)
for i in range(1,n+1):
    C[i-1] = ((-1)**i)*(x**(2*i))/(2*i)
S = np.sum(C)
## BEGIN SOLUTION
print(type(S),S,type(C),C.size)
## END SOLUTION
C = np.zeros(n)
for i in range(1,n+1):
    C[i-1] = ((-1)**i)*(x**(2*i))/(2*i)
S = 1 + np.sum(C)
## BEGIN SOLUTION
print(type(S),S,type(C),C.size)
## END SOLUTION
<class 'numpy.float64'> -0.0049751654265840425 <class 'numpy.ndarray'> 11
<class 'numpy.float64'> 0.995024834573416 <class 'numpy.ndarray'> 11
<class 'numpy.float64'> -0.0049751654265840425 <class 'numpy.ndarray'> 11
<class 'numpy.float64'> 0.995024834573416 <class 'numpy.ndarray'> 11

Trouvez les erreurs¶

Dans les cellules suivantes, copiez les instructions Python suivantes, trouvez les erreurs et les corriger pour calculer la somme des carrés des 4 premiers entiers strictement positifs

for i in range(4)
   somme = 0
      somme = somme + j**2
In [15]:
# copier et corriger le code précédent

Idem pour le code suivant pour calculer le produit des carrés des p premiers entiers strictement positifs avec p = 4

def produit(n)
    for i in range(n):
      prod = 0
        prod = prod*(i+1)**2
    print(prod)
#
Produit(p)
In [16]:
# copier et corriger le code précédent

FIN¶