import math
def f(x, y):
return (x-2)**2+(y-3)**2
def df(x, y):
return 2*(x-2) , 2*(y-3) #composantes du gradient : df/dx , df/dy
def descente1(f, df, x, y, alpha=1e-2, eps=1e-6, maxIter=1000):
# Recherche le minimum d'une fonction f par descente de gradient
# df doit être la dérivée de f
# x,y sont les valeurs initiales
# alpha est le taux d'apprentissage qui détermine la rapidité de la descente (par défaut 1/100)
# eps est la précision souhaitée (par défaut 1/1000000)
# maxIter est le nombre maximum d'itération (par défaut 1000)
gradx, grady = df(x,y)
grad = math.sqrt(gradx**2+grady**2) # norme du gradient (math.sqrt est la racine carrée)
i=0
while abs(grad)>eps: # tant que la pente n'est pas approximativement nulle
gradx, grady = df(x,y) # on calcule la pente
grad = math.sqrt(gradx**2+grady**2) # norme du gradient
x = x-alpha*gradx # on effectue un petit pas vers le bas selon x
y = y-alpha*grady # on effectue un petit pas vers le bas selon y
i += 1
#print(i, x, y , gradx, grady) # décommenter cette ligne pour imprimer les itérations
if i > maxIter:
return None # on abandonne si le nombre d'itérations est trop élevé
return x,y
def descente2(f, x, y, alpha=1e-2, eps=1e-6, maxIter=1000):
# Recherche le minimum d'une fonction f par descente de gradient avec dérivée numérique
# x,y sont les valeurs initiales
# alpha est le taux d'apprentissage qui détermine la rapidité de la descente (par défaut 1/100)
# eps est la précision souhaitée (par défaut 1/1000000)
# maxIter est le nombre maximum d'itération (par défaut 1000)
grad = 1
i=0
while abs(grad)>eps:
gradx = (f(x+eps,y)-f(x-eps,y))/(2*eps) #approximation numérique de la dérivée df/dx
grady = (f(x, y+eps)-f(x, y-eps))/(2*eps) #approximation numérique de la dérivée df/dy
grad = math.sqrt(gradx**2+grady**2) # norme du gradient
x = x-alpha*gradx # on effectue un petit pas vers le bas selon x
y = y-alpha*grady # on effectue un petit pas vers le bas selon y
i += 1
#print(i, x, y, gradx, grady) # décommenter cette ligne pour imprimer les itérations
if i > maxIter:
return None # on abandonne si le nombre d'itérations est trop élevé