Quelques exemples de comment trouver numériquement le minimum local d'une fonction avec scipy en python:
Définir une fonction en python
Soit par exemple la fonction suivante:
from pylab import figure, cmimport matplotlib.pyplot as pltimport numpy as npdef function(x):return 3.0*x**2 + 4 * x - 4x = np.arange(-5.0,5.0,0.1)y = function(x)fig = figure(num=None, figsize=(12, 10), dpi=80, facecolor='w', edgecolor='k')plt.plot(x,y)plt.grid()plt.axvline(x=-4.0/(2.0*2.4),color='red')plt.show()
Dans cet exemple on peut calculer le minimum analytiquement:
print(-4.0/(2.0*3.0))
donne
-0.6666666666666666

Méthode de Nelder-Mead
from scipy.optimize import minimizex0 = 4.0res = minimize(function, x0, method='Nelder-Mead', tol=1e-6)print(res.x[0])
donne
-0.6666664123535198
Algorithme de gradient conjugué
x0 = 4.0res = minimize(function, x0, method='CG', tol=1e-6)print(res.x[0])
donne
-0.6666666709714467
Algorithme BFGS
from scipy.optimize import minimizex0 = 4.0res = minimize(function, x0, method='BFGS', tol=1e-6)print(res.x[0])
donne
-0.6666666860653405
Algorithme du gradient
from scipy import miscalpha = 0.1 # learning ratenb_max_iter = 100 # Nb max d'iterationeps = 1e-6 # stop conditionx0 = 4.0 # start pointy0 = function(x0)cond = eps + 10.0 # start with cond greater than eps (assumption)nb_iter = 0tmp_y = y0while cond > eps and nb_iter < nb_max_iter:x0 = x0 - alpha * misc.derivative(function, x0)y0 = function(x0)nb_iter = nb_iter + 1cond = abs( tmp_y - y0 )tmp_y = y0#print(x0,y0,cond)print(x0)
donne
-0.6664709324799999
