• Aucun résultat trouvé

Exercice 1 : Quelques manipulations sur les listes #%% question 1 : création de listes liste1

N/A
N/A
Protected

Academic year: 2022

Partager "Exercice 1 : Quelques manipulations sur les listes #%% question 1 : création de listes liste1"

Copied!
12
0
0

Texte intégral

(1)

Exercice 1 : Quelques manipulations sur les listes

#%% question 1 : création de listes liste1=[0,1,2,3,4]

liste2=[]

for i in range(5):

liste2.append(i) liste3=list(range(5))

liste4=[i for i in range(5)]#[f(i) for i in objet]

liste5=list() for i in range(5):

liste5.append(i)

print(liste1,liste2,liste3,liste4,liste5) liste6=list(liste1)

liste6[0]=5 print(liste1)

#%%question 2 : calcul de la somme des éléments d'une liste

"""avec une boucle for"""

def somme1_a(liste):

resultat=0

for i in range(len(liste)):

resultat=resultat+liste[i]

return resultat

print(somme1_a([0,1,2,3,4])) def somme1_b(liste):

resultat=0 for i in liste:

resultat=resultat+i return resultat

print(somme1_b([0,1,2,3,4]))

#cas particulier d'une boucle for qui ne se termine par :

#for i in liste :

#liste.append(i)

#mais en général, une boucle for ne pose pas de pb

#de terminaison : elle est bornée à sa création def somme2_a(liste):

resultat=0 N=len(liste) while N>0:

resultat=resultat+liste[N-1]

N=N-1

return resultat

print(somme2_a([0,1,2,3,4])) def somme2_b(liste):

resultat=0 i=0

while i<len(liste):

resultat=resultat+liste[i]

i=i+1

return resultat

print(somme2_b([0,1,2,3,4]))

(2)

#%%% question 3 : calcul du produit des éléments d'une liste def produit1_a(liste):

resultat=1

for i in range(1,len(liste),1):

resultat=resultat*liste[i]

return resultat

print(produit1_a([0,1,2,3,4])) def produit1_b(liste):

resultat=1

for i in liste[1:]:

resultat=resultat*i return resultat

print(produit1_b([0,1,2,3,4])) def produit2_a(liste):

resultat=1 i=1

while i<len(liste):

resultat*=liste[i]

i+=1

return resultat

print(produit2_a([0,1,2,3,4])) def produit2_b(liste):

resultat=1 N=len(liste) while N>1:

resultat*=liste[i]

N-=1

return resultat

print(produit2_a([0,1,2,3,4]))

#%% Question 4 : Nombre d'occurence d'un nombre dans une liste def occurence_a(liste,elt):

compt=0

for i in liste:

if i == elt:

compt+=1 else :

continue return compt

print(occurence_a([20,20,10],20)) def occurence_b(liste,elt):

compt=0

for i in range(len(liste)):

if liste[i] == elt:

compt+=1 else :

continue return compt

print(occurence_a([20,20,10],20))

(3)

#%% Question 5 : Calcul d'une suite def calcul_liste_a(N):

u_0=2

liste=[u_0]*N

for i in range(N-1):

liste[i+1]=liste[i]+2 return liste

print (calcul_liste_a(10)) def calcul_liste_b(N):

u_0=2

liste=[u_0]

for i in range(N-1):

liste.append(liste[i]+2) return liste

print (calcul_liste_b(10))

"""autre méthode"""

u_0=2

for i in range(10):

print(u_0) u_1=2+u_0 u_0=u_1

""" cas d'une suite avec u_n+2=u_n+1+u_n"""

def calcul_suite3(N):

u_0=0 u_1=2

liste=[u_0,u_1]

for i in range(N-2):

liste.append(liste[-1]+liste[-2]) return liste

print(calcul_suite3(10)) u_0=0

u_1=2

for i in range(10):

print(u_0) u_2=u_0+u_1 u_0=u_1 u_1=u_2

(4)

Exercice 2 :

#%%% question 1: calcul de la factorielle def factorielle1(n:int) -> int :

resultat=1 while n>0:

resultat=resultat*n n=n-1

return resultat print(factorielle1(5))

def factorielle2(n:int) -> int : resultat=1

for i in range(n,0,-1):

resultat=resultat*i return resultat

print(factorielle2(5)) def factorielle3(n):

if n ==1:

return 1 elif n ==0 : return 1 else :

return n*factorielle3(n-1) print(factorielle3(5))

#%% question 2 : Valeur moyenne d'une liste def moyenne1(liste):

somme =0 N=len(liste)

for i in range(N):

somme=somme+liste[i]

return somme/N

print(moyenne1([0,1,2,3,4]))

def moyenne2(liste):

somme =0 N=len(liste) for i in liste:

somme=somme+i return somme/N

print(moyenne2([0,1,2,3,4])) def moyenne3(liste):

somme =0 N=len(liste) while N>0:

somme=somme+liste[N-1]

N=N-1

return somme/(len(liste)) print(moyenne3([0,1,2,3,4]))

(5)

#%%question 3 calcul variance 𝑉 = 1

𝑁∑(𝐿𝑖− 𝐿𝑚𝑜𝑦)2= 1

𝑁∑(𝐿𝑖2+ 𝐿2𝑚𝑜𝑦− 2𝐿𝑖𝐿𝑚𝑜𝑦) =∑ 𝐿2𝑖

𝑁 +𝐿2𝑚𝑜𝑦− 2𝐿2𝑚𝑜𝑦

𝑁 =∑ 𝐿2𝑖 𝑁 −𝐿2𝑚𝑜𝑦

𝑁 =< ∑ 𝐿2𝑖 > −< 𝐿𝑖>2 def variance(liste):

s1=0 s2=0

for i in liste:

s1 = s1+i s2 = s2+i**2

return (s2/len(liste)-(s1/len(liste))**2) print(variance([0,1,2,3,4]))

#%% question 4 : méthode des rectangles à gauche def rectangle_gauche(N,a,b,f):

h=(b-a)/N integrale =0

for i in range(N):#la méthode range ne prend pas de pas décimaux x=a+i*h

integrale = integrale + h*f(x) return integrale

def f(x):

return 3*x**2

print(1000-rectangle_gauche(100,0,10,f)) print(1000-rectangle_gauche(1000,0,10,f)) def trapeze(N,a,b,f):

h=(b-a)/N integrale =0

for i in range(N):#la méthode range ne prend pas de pas décimaux x=a+i*h

integrale = integrale + 0.5*h*(f(x)+f(x+h)) return integrale

print(1000-trapeze(100,0,10,f)) print(1000-trapeze(1000,0,10,f))

Interpolation par morceaux de degré 0 Interpolation par morceaux de degré 1

Approximation de l’aire (rectangle à gauche):

∫ 𝑓(𝑥)𝑑𝑥 ≈ ∑ 𝑦𝑖

𝑛−1

𝑖=0 𝑏

𝑎

Approximation de l’aire :

∫ 𝑓(𝑥)𝑑𝑥 ≈ ∑(𝑦𝑖+ 𝑦𝑖+1) ℎ 2

𝑛−1

𝑖=0 𝑏

𝑎

Erreur quadratique :

∫ 𝑓(𝑥)𝑑𝑥

𝑎+ℎ

𝑎

= 𝐹(𝑎 + ℎ) − 𝐹(𝑎) Avec un DL à l’ordre 1 :

∫ 𝑓(𝑥)𝑑𝑥

𝑎+ℎ

𝑎

= 𝑓(𝑎)ℎ +𝑓(𝜉)ℎ2 2

Donc ∫ 𝑓(𝑥)𝑑𝑥𝑎𝑏 ≈ ∑𝑛−1𝑖=0𝑦𝑖ℎ si on néglige 𝑛2

2 𝑓(𝜉)𝑚𝑎𝑥 ≈ 𝑂(ℎ)

Erreur quadratique :

∫ 𝑓(𝑥)𝑑𝑥

𝑎+ℎ

𝑎

= 𝐹(𝑎 + ℎ) − 𝐹(𝑎) Avec un DL à l’ordre 2 :

∫ 𝑓(𝑥)𝑑𝑥

𝑎+ℎ

𝑎

= 𝑓(𝑎)ℎ +𝑓(𝑎)ℎ2

2 +𝑓′′(𝜉)ℎ3 6 Donc

∫ 𝑓(𝑥)𝑑𝑥

𝑏

𝑎

≈ ∑ 𝑦𝑖ℎ +(𝑦𝑖+1− 𝑦𝑖)ℎ2 2ℎ

𝑛−1

𝑖=0

∫ 𝑓(𝑥)𝑑𝑥

𝑏

𝑎

≈ ∑(𝑦𝑖+ 𝑦𝑖+1)ℎ 2

𝑛−1

𝑖=0

Si on néglige 𝑛3

6 𝑓′′(𝜉)𝑚𝑎𝑥 ≈ 𝑂(ℎ2)

(6)

Exercice 3 : Algorithme de recherche

#%% question 1 détection d'un élément dans une liste def recherche1_a(liste,elt):

for i in liste : if i == elt :

return True#sortie anticipée return False

print(recherche1_a([0,1,2,3,4],4))

def recherche1_b(liste,elt):#avec une boucle while i=0

while i<len(liste) : if liste[i] == elt:

return True i=i+1

return False

print(recherche1_b([0,1,2,3,4],4))

def recherche1_c(liste,elt):#plus simplement return elt in liste

print(recherche1_c([0,1,2,3,4],4))

"""on peut aussi rechercher la 1e occurrence"""

def recherche1_d(liste,elt):#avec une boucle for for i in range(len(liste)) :

if liste[i] == elt:

return i return False

print(recherche1_d([0,1,2,3,4],4))

def recherche1_e(liste,elt):#avec une boucle while i=0

while i<len(liste) : if liste[i] == elt:

return i i = i+1 return False

print(recherche1_d([0,1,2,3,4],4))

"""on peut aussi rechercher la dernière occurrence"""

def recherche1_f(liste,elt):#avec une boucle for for i in range(len(liste)-1,-1,-1) :

if liste[i] == elt:

return i return False

print(recherche1_f([0,1,2,3,4,4],4))

def recherche1_g(liste,elt):#avec une boucle while i=len(liste)-1

while i>=0 :

if liste[i] == elt:

return i i = i-1 return False

print(recherche1_g([0,1,2,3,4,4],4))

(7)

#%% question 2

def recherche2_a(liste,elt):

position=[]

presence = False

for i in range(len(liste)) : if liste[i] == elt:

position.append(i) presence = True return presence, position

print(recherche2_a([0,1,2,3,4,4],4)) def recherche2_b(liste,elt):

position=[]

presence = False i=0

while i<len(liste) : if liste[i] == elt:

position.append(i) presence = True i=i+1

return presence, position

print(recherche2_b([0,1,2,3,4,4],4))

"""rappels de la fonction enumerate"""

for index,valeur in enumerate([5,4]):

print(index,valeur)

def recherche2_c(liste,elt):

presence = False liste_index=[]

for index,valeur in enumerate(liste):

if valeur == elt:

presence = True

liste_index.append(index) return presence, liste_index print(recherche2_c([0,1,2,3,4,4],4))

(8)

#%% question 3 : recherche d'un maximum def maximum_1(liste):

maxi=liste[0]

index=0

for i in range(1,len(liste)):

if liste[i]>maxi:

maxi=liste[i]

index=i

return (print("le maximum {0} est à l'index {1}".format(maxi,index))) maximum_1([0,1,2,3,4])

"""on peut chercher les deux premiers maximums"""

def maximum_2(liste):

max1=liste[0]

index1=0 max2=liste[1]

index2=1 if max2<max1:

max1,max2=max2,max1

index1,index2=index2,index1 for i in range(2,len(liste)):

if liste[i]>max2:

max1=max2 max2=liste[i]

index1=index2

index2=i

elif liste[i]>max1 and liste[i]<max2:

max1=liste[i]

index1=i return (print(

"le 1e maximum est {0} et est à l'index {1},le 2e maximum est {2} et est à l'index {3}".

format(max1,index1,max2,index2))) maximum_2([10,1,2,3,4])

#%%% question 4 : recherche dichotomique d'un élément dans une liste triée def dichotomie (liste,elt):

debut=0

fin = len(liste)-1

while fin-debut >=0 :#> pose problème pour les extrémités de la liste ! milieu = (fin+debut)//2

if elt == liste[milieu]:

return print("l'élément {0} est dans la liste à la position {1}".format(elt,milieu))

elif elt>liste[milieu] : debut = milieu +1 else:

fin = milieu-1

return (print("l'élément n'est pas dans la liste")) dichotomie([0,1,2,3,4],0)

(9)

#%%%question 5 : recherche d'un mot dans une chaine de caractère def recherche_mot_1(chaine,mot):#par paquet

for i in range(len(chaine)-len(mot)+1):

index=i

if chaine[i:i+len(mot)] == mot:

return (print("le mot est dans la liste à la position {}".format(index) ))

print("le mot n'est pas dans la liste")

recherche_mot_1("abcdef","ef")

def recherche_mot_2(chaine,mot):#lettre par lettre for i in range(len(chaine)-len(mot)+1):

index=i j=0

while j<len(mot) and chaine[i+j] == mot[j]:

j=j+1

if j == len(mot):

return (print("le mot est dans la liste à la position {}".format(index) )) return print("le mot n'est pas dans la liste")

recherche_mot_2("abcdef","ef") recherche_mot_1("abcdef","ef")

Le problème avec cette recherche naïve c’est qu’elle est gourmande en complexité

temporelle. Si la chaîne est "….abcd…." et que le mot recherché est "abce" alors on peut affirmer dès la 1e itération que les 3 suivantes sont fausses. En allant comparer le motif après la lettre d on apsse d’une complexité en 𝑂(𝑚𝑛) à une complexité en 𝑂(𝑛

𝑚)

(10)

Exercice 4 : Terminaison, correction et complexité d’algorithme itératif

1) On a bien un variant de boucle : 𝑖. Cette quantité diminue à chaque itération jusqu’à la condition d’arrêt 𝑖 = 0 qui stoppe la boucle. Le programme se termine bien

2) L’invariant de boucle est la quantité 𝑟𝑒𝑠𝑢𝑙𝑡𝑎𝑡 qui toujours égale à la somme des éléments lus dans la liste 𝐿[𝑙𝑒𝑛(𝐿) − 1: ∶ −1]. On a

- En entrée de boucle, la liste 𝐿2 n’est pas encore lue : 𝑟𝑒𝑠𝑢𝑙𝑡𝑎𝑡 = 0 - Si on suppose vrai 𝑟𝑒𝑠𝑢𝑙𝑡𝑎𝑡 = 𝐿[−1] + ⋯ + 𝐿[𝑖]

Alors l’itération suivante 𝑟𝑒𝑠𝑢𝑙𝑡𝑎𝑡 = 𝐿[−1] + ⋯ + 𝐿[𝑖] + 𝐿[𝑖 − 1]

La relation est donc vraie à l’itération suivante

- La boucle se termine quand toute la liste a été entièrement parcourue. Il manque un élément dans la liste dans la programme proposé (il faut prendre l’index 0) :

𝑟𝑒𝑠𝑢𝑙𝑡𝑎𝑡 = 𝐿[−1] + ⋯ + 𝐿[𝑖] + 𝐿[𝑖 − 1] + ⋯ 𝐿[0]

𝑟𝑒𝑠𝑢𝑙𝑡𝑎𝑡 = ∑ 𝐿𝑙𝑢𝑒,𝑖 𝑖=0

𝑖=𝑙𝑒𝑛(𝐿)−1

𝐶𝑒 𝑞𝑢𝑖 𝑑𝑜𝑛𝑛𝑒 𝑙𝑒 𝑏𝑜𝑛 𝑟é𝑠𝑢𝑙𝑡𝑎𝑡

𝑇(𝑛) = 1 + 3𝑛 = 𝑂(𝑛) en prenant comme unité de coût les opérations d’addition, de soustraction, de de multiplication et de comparaisons de deux nombres

Exercice 5 : Tableau numpy

#%% numpy

#question 1 : création de tableau import numpy as np

tab=np.ones((10,10))*255 tab[4:7,4:7]=100

print(tab)

#question 2 : création du mask mask = tab[:,:]<200

#question 3: slicing x=np.arange(0,10,1) y=x

X,Y=np.meshgrid(x,y) x_moy=np.mean(X[mask]) y_moy=np.mean(Y[mask]) print(x_moy,y_moy)

#question 4 : filtrage tab_new=np.copy(tab) for i in range(1,9):

for j in range(1,9):

tab_new[i,j]=abs(tab[i-1,j]+tab[i+1,j]+tab[i,j+1]+tab[i,j-1]-4*tab[i,j]) tab_new2=np.copy(tab)

tab_new2[1:-1,1:-1]=abs(tab[0:-2,1:-1]+tab[2:,1:-1]+tab[1:-1,0:-2]+tab[1:-1,2:]- 4*tab[1:-1,1:-1])

print(tab_new) print(tab_new2)

from PIL import Image

photo=Image.fromarray(tab_new) photo.show()

(11)

Exercice 6 :

#%%plot

#question 1 et 2 import numpy as np

import matplotlib.pyplot as plt t=np.linspace(0,10,1000)

x=np.cos(2*np.pi*t) y=np.sin(2*np.pi*t)

plt.plot(t,x,label='x(t)') plt.plot(t,y,label='y(t)') plt.legend()

plt.grid() plt.xlabel("t") plt.ylabel("x") plt.show()

#question 3

x=np.linspace(-5,5,100) for a in [1,2,3,4]:

plt.plot(x,a*x**2) plt.show()

Exercice 7 :

1e interprétation 2e interprétation

On utilise une formule de différence finie à droite (erreur de troncature en 𝑂(ℎ)):

𝑑𝑦

𝑑𝑡≈𝑦𝑖+1−𝑦𝑖

𝑇𝑒

Euler explicite (potentiellement instable mais facile à écrire)):

𝑓(𝑡, 𝑦(𝑡)) ≈ 𝑓(𝑡𝑖, 𝑦𝑖) 𝑦𝑖+1≈ 𝑦𝑖+ 𝑇𝑒𝑓(𝑡𝑖, 𝑦𝑖) Euler implicite :

𝑓(𝑡, 𝑦(𝑡)) ≈ 𝑓(𝑡𝑖+1, 𝑦𝑖+1) 𝑦𝑖+1≈ 𝑦𝑖+ 𝑇𝑒𝑓(𝑡𝑖+1, 𝑦𝑖+1)

𝑑𝑦

𝑑𝑡= 𝑓(𝑡, 𝑦(𝑡)) 𝑑𝑦 = 𝑓(𝑡, 𝑦(𝑡))𝑑𝑡

∫ 𝑑𝑦

𝑦𝑖+1

𝑦𝑖

= ∫ 𝑓(𝑡, 𝑦(𝑡))𝑑𝑡

𝑡𝑖+1

𝑡𝑖

Approximation à gauche (erreur d’arrondi en 𝑂(ℎ)):

𝑦𝑖+1= 𝑦𝑖+ 𝑇𝑒𝑓(𝑡𝑖, 𝑦𝑖) Approximation à droite :

𝑓(𝑡, 𝑦(𝑡)) ≈ 𝑓(𝑡𝑖+1, 𝑦𝑖+1) 𝑦𝑖+1≈ 𝑦𝑖+ 𝑇𝑒𝑓(𝑡𝑖+1, 𝑦𝑖+1)

import numpy as np

import matplotlib.pyplot as plt Te=0.1

t=np.arange(0,10+Te,Te) s=np.ones(len(t))

for i in range(len(t)-1):

s[i+1]=s[i]*(1-Te) w=np.ones(len(t))

for i in range(len(t)-1):

w[i+1]=w[i]/(Te+1)

plt.plot(t,s,t,w,t,np.exp(-t)) plt.show()

(12)

Exercice 8 :

import numpy as np def f(x):

return np.sin(x) def d(x):

return np.cos(x) def dicho(a,b,f,e):

i=0

while abs(a-b)>e:

i=i+1 c=(a+b)/2

if f(a)*f(c)>0:

a=c else : b=c return c,i

print(dicho(3,3.5,f,0.001))

def newt(a,f,d,e):

i=0

while abs(f(a))>e:

a=a-f(a)/d(a) i=i+1

return a,i

print(newt(3,f,d,0.001))

Références

Documents relatifs

Nous exhibons alors un invariant de boucle, c'est-à-dire une propriété P qui, si elle est valide avant l'exécution d'un tour de boucle, est aussi valide après l'exécution du tour

tail retourne la liste compos´ ee de tous les ´ el´ ements sauf le premier isEmpty retourne True ssi la liste est vide.. Ces op´ erations sont d´ efinies comme m´ ethodes des objets

Base et dimension d’un espace vectoriel. 1) Déterminer la dimension de F, puis celle

À partir d'une liste trié, la recherche dichotomique de la présence (et de l'index) d'une valeur consiste à prendre une valeur à l'index milieu d'une tranche de la liste (au début

On considère une liste d’ouvrages LOuvrages où chaque élément de la liste contient un Livre ; caractérisé par son code (un entier), son titre (une chaîne de caractères), et le

Testez d'abord sur des listes courtes construites avec les méthodes vide et ajoutT. d) Testez ensuite sur des listes longues générées avec la méthode creerAleat. Le

//ajouter un Objet en rième position de la liste public void supprimerentete() throws Exception;. //supprimer un Objet en tête de

2) Le serpent qui se mord la queue.... A l'exécution, faire évaluer comptegene en prenant comme liste argument la fonction comptegene elle même : vous saurez ainsi combien vous