Nantes Université

Skip to content
Extraits de code Groupes Projets
Valider 2a202a0c rédigé par Samuel PAULY's avatar Samuel PAULY
Parcourir les fichiers

tps de methodes numeriques

parent b85d79e3
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
import numpy as np
import matplotlib.pyplot as plt
import random
import time
def BaseLagrange(X,listX,i) :
res = 1
X = np.array(X)
for j in range(len(listX)) :
if j != i :
res *= (X-listX[j])/(listX[i]-listX[j])
return res
def GraphLagrange(listX,i) :
absc = np.linspace(-1,2,300)
ordo = BaseLagrange(absc,listX,i)
plt.plot(absc,ordo)
plt.scatter(listX,[1 if i == x else 0 for x in range(len(listX))])
plt.show()
def InterLagrange1(X,listX,listY) :
s = 0
for i in range(len(listY)) :
s += listY[i] * BaseLagrange(X,listX,i)
return s
def GraphInterLagrange1(listX,listY) :
absc = np.linspace(min(listX),max(listX),300)
ordo = InterLagrange1(absc,listX,listY)
plt.plot(absc,ordo)
plt.scatter(listX,listY)
plt.show()
def EvalP(b,listCoef) :
res = 0
for i in range(0,len(listCoef)) :
res += listCoef[i]*(b**i)
return res
def Horner(b,listCoef) :
n = len(listCoef)-1
res = b*(listCoef[n])
for i in range(1,n) :
res += listCoef[n-i]
res *= b
return res + listCoef[0]
def compare(f1,f2) :
listCoef = [random.randint(1,1000) for x in range(10000)]
b = random.randint(1,1000)
t1 = time.time()
f1(b,listCoef)
t1 = time.time() - t1
t2 = time.time()
f2(b,listCoef)
t2 = time.time() - t2
print(f"{f1.__name__} met : {t1}")
print(f"{f2.__name__} met : {t2}")
print(f"La différence est donc de {abs(t2-t1)}")
def DifferencesDivisees(listX,listY) :
matrice = [[0 for x in listX] for y in listX]
for i in range(len(listY)):
matrice[i][0] = listY[i]
for j in range(len(listX)):
for k in range(1, j+1):
matrice[j][k] = (matrice[j][k-1]-matrice[j-1][k-1])/(listX[j]-listX[j-k])
res = []
for l in range(len(matrice)) :
res.append(matrice[l][l])
return res
def InterLagrange2(X,listX,listY) :
coefs = DifferencesDivisees(listX,listY)
res = coefs[-1]
for i in range(len(coefs)-1,0,-1) :
res *=(X-listX[i-1])
res +=coefs[i-1]
return res
def ex1() :
print()
print("Exercice 1 :")
print()
GraphLagrange([0,1,2],0)
GraphInterLagrange1([0,1,2],[-1,3,2])
def ex2() :
print()
print("Exercice 2 :")
print()
print("EvalP et Horner donne le même résultat pour (5,[3,4,5,6]), EvalP : ", EvalP(5,[3,4,5,6]), "et Horner : ", Horner(5,[3,4,5,6]))
print()
print("2.b)")
print("Le nombre de sommes est de i car on additionne (u0 + u1 + ... + ui), ")
print("et le nombre de multiplication est de (i**2 + i) / 2 car il y a i multiplications pour ui")
print("et selon la formule de somme des suites arithmétiques on a (i(i+1)) / 2")
print()
print("2.c)")
print("Le nombre de sommes reste le même, i sommes,")
print("mais le nombre de multiplications devient i aussi.")
print()
compare(EvalP,Horner)
def ex3() :
print()
print("Exercice 3 :")
print(DifferencesDivisees([1,5,2],[3,4,1]))
listX = [0,1,2]
listY = [-1,3,2]
absc = np.linspace(min(listX),max(listX),300)
# print("InterLagrange1 : ",InterLagrange1(absc,listX,listY))
# print("InterLagrange2 : ",InterLagrange2(absc,listX,listY))
print("J'ai vérifié et InterLagrange2 donne le même résultat que InterLagrange1")
def f4(x) :
return 1/(1+10*x**2)
def exercice4_a(N) :
print()
print("Exercice 4.a) :")
print()
droiteX = np.linspace(-5,5,100)
droiteY = f4(droiteX)
absc = np.linspace(-5,5,N)
ordo = f4(absc)
pol = InterLagrange2(droiteX,absc,ordo)
plt.scatter(absc,ordo)
plt.plot(droiteX,pol)
plt.plot(droiteX,droiteY)
print("Lorsque N grandit, la variation des points s'équilibre plus.")
plt.show()
def exercice4_b(N) :
print()
print("Exercice 4.b) :")
print()
droiteX = np.linspace(-5,5,100)
droiteY = f4(droiteX)
absc = np.polynomial.chebyshev.Chebyshev(np.array([0]*N+[1])).roots()
ordo = f4(absc)
pol = InterLagrange2(droiteX,absc,ordo)
plt.scatter(absc,ordo)
plt.plot(droiteX,pol)
plt.plot(droiteX,droiteY)
print("Lorsque N augmente, les points ne varient plus beaucoup et c'est beaucoup plus stable.")
plt.show()
ex1()
ex2()
ex3()
exercice4_a(20)
exercice4_b(20)
\ No newline at end of file
import numpy as np
import matplotlib.pyplot as plt
def g(x) :
return x*np.tan(x)-1
def dichotomie(f,a,b,e):
if abs(b-a) < e :
return (a,b)
m = (a+b)/2
if f(a)*f(m) >= 0:
return dichotomie(f,m,b,e)
else :
return dichotomie(f,a,m,e)
def graph_g() :
x = np.linspace(-5,5,200)
plt.plot(x,[g(i) for i in x])
plt.show()
def equ(x) :
return x**2 - 2
def derive_equ(x) :
return 2*x
def tangeante(f,df,x,a) :
return df(a)*(x-a) + f(a)
def phi(f,df,x) :
return x- (f(x)/df(x))
def Newton(f,df,x0,N) :
suite = [x0]
for _ in range(N) :
suite.append(phi(f,df,suite[-1]))
return suite
def VitesseNewton(suite,n) :
y = []
for u in suite :
y.append(equ(u))
plt.scatter([x for x in range(n)],y[:n])
plt.show()
def taux_acroissement(f,x0,x1) :
return (f(x1)-f(x0))/(x1-x0)
def Secante(f,x0,x1,N) :
suite = [x0,x1]
for _ in range(N) :
if abs(suite[-1]-suite[-2]) < 10**(-15) :
break
suite.append(suite[-1]-f(suite[-1])/taux_acroissement(f,suite[-2],suite[-1]))
return suite[-1]
def ex2_1() :
# 1.
# supposons un intervalle [a;b]
# la moitié m de cet intervalle est m = (a+b) / 2
# on cherche @ dans l'intervalle [a;b]
# on cherche d'abord dans l'intervalle [a;m]
# si @ n'y est pas, cela signifie qu'il est dans l'intervalle [m;b]
# on réitère en divisant aussi l'intervalle [m;b]
# on ressert jusqu'à ce qu'on trouve @
# la méthode converge donc vers @
a, _ =dichotomie(equ,-5,5,(10**(-8)))
print("dichotomie : ",a)
def ex2_3() :
# 1.
# Soit f' la dérivée de f
# La tangeante de f au point a est f'(a)(x-a) + f(a)
# La tangeante de x0 est donc f'(x0)(x -x0) + f(x0)
# On a donc x1 défini par : f'(x0)(x1-x0)+f(x0) = 0
# f'(x0)(x1-x0) = -f(x0)
# (x1 - x0) = -f(x0)/f'(x0)
# x1 = -f(x0)/f'(x0) + x0
print("Newton : ",Newton(equ,derive_equ,4,20)[-1])
print("le résultat attendu étant racine de 2, c'est donc le bon résultat")
VitesseNewton(Newton(equ,derive_equ,2,20),10)
print("nous voyant bien avec VitesseNewton que cela converge vers 0")
def ex2_4() :
print("Secanete : ",Secante(equ,2,4,20))
ex2_1()
ex2_3()
ex2_4()
\ No newline at end of file
import matplotlib.pyplot as plt
import numpy as np
def f(c,x) :
return c*x*(1-x)
def ex_1() :
print("Exercice 1")
liste_de_c = [0.5,1.5,2,2.5,3,3.5,4]
x = np.linspace(0,1,100)
plt.plot(x,x,color = 'black', label = 'y')
# for c in liste_de_c :
# y = f(c,x)
# plt.plot(x,y,label='c = '+str(c))
plt.title('Graphes de fc')
plt.legend()
plt.show()
# 2 - Il faut chercher pour quelle valeur de c, fc(1/2) = 1
# On remplace donc x par 1/2 dans l'équation :
# c * 1/2 * (1 - 1/2) = 1
# (c / 2) * (1 / 2) = 1
# c / 4 = 1
# c = 4
#Fonction qui calcule c en fonction de x
def calcul_c(x) :
return 1/(-x**2 + x)
print(calcul_c(1/2))
def logistique(c,a,N) :
suite = [a]
X = list(range(N))
for x in range(len(X)-1) :
suite.append(f(c,suite[-1]))
plt.scatter(X ,suite,s=5)
plt.title(f'Graphe de c = {c}, a = {a}, N = {N}')
plt.show()
def ex_3() :
print("Exercice 3")
print("Pour les valeurs : c = 0.5, a = 0.5 et N = 20")
logistique(0.5,0.5,20)
# 4 - Selon les valeurs de c, la suite a un comportement différent
# Entre 0 et 1.5 environ, la courbe de la suite converge vers 0
# Entre 1.5 et 2.6 environ, la courbe de la suite converge vers 0.5/0.6
# Entre 2.6 et 3.4 environ, la courbe oscille entre 2 valeurs
# Entre 3.4 et 3.5 environ, la courbe oscille entre 4 valeurs
# Au delà de 3.5, la courbe parcourt toute l'intervalle
def GraphLogistique(c,a,N) :
x = np.linspace(0,1)
y = f(c,x)
plt.plot(x ,y)
plt.plot(x,x)
plt.title(f'Graphe de c = {c} et u(0) = {a}')
x = [a,a]
y = [0,f(c,a)]
for i in range(N) :
x.append(y[-1])
y.append(y[-1])
x.append(y[-1])
y.append(y[-1] * c*(1-y[-1]))
plt.plot(x,y)
plt.show()
def ex_5() :
print("Exercice 5")
GraphLogistique(2.3,0.2,30)
GraphLogistique(2.95,0.2,50)
GraphLogistique(3.5,0.2,50)
def ex_7() :
print("Exercice 7")
print("Pour les valeurs : c = 3.1, a = 0.4 et N = 30")
print("Nous remarquons qu'il n'y a plus de convergence")
GraphLogistique(3.1,0.4,30)
def feigenbaum(u0, c1, c2) :
cs = np.linspace(c1,c2, 500)
suite = [u0]
for c in cs:
for n in range(200) :
suite.append(f(c,suite[-1]))
plt.scatter([c for x in range(51)], suite[150:], color = 'royalblue', s = 0.7)
suite = [u0]
plt.xlabel("coefficient c")
plt.ylabel("u(n) pour 150<n<200")
plt.title("Diagramme de Feigenbaum")
plt.show()
def ex_8() :
print("Exercice 8")
print("Pour les valeurs : u0 = 0.5, c1 = 2.5 et c2 = 4")
feigenbaum(0.5,2.5,4)
def ex_9() :
print("Exercice 9")
suite = [0.4]
for n in range(100000) :
suite.append(f(4,suite[-1]))
nb = []
for i in range(100) :
nb.append(0)
for u in suite :
if (i/100) <= u < ((i+1)/100) :
nb[i] += 1
plt.bar([x for x in range(100)],nb)
plt.xlabel("i")
plt.ylabel("nombre de valeur dans l'intervalle [i/100,(i+1)/100]")
plt.show()
ex_1()
ex_3()
ex_5()
ex_7()
ex_8()
ex_9()
\ No newline at end of file
# but année 1
# BUT Informatique - 1ère année
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter