Comment trouver numériquement le minimum local d'une fonction avec scipy en python ?

Published: 21 juillet 2020

Tags: Python; Scipy; Optimization;

DMCA.com Protection Status

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, cm

import matplotlib.pyplot as plt
import numpy as np

def function(x):
    return 3.0*x**2 + 4 * x - 4

x = 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

Comment trouver numériquement le minimum local d'une fonction avec scipy en python ?
Comment trouver numériquement le minimum local d'une fonction avec scipy en python ?

Méthode de Nelder-Mead

from scipy.optimize import minimize

x0 = 4.0

res = minimize(function, x0, method='Nelder-Mead', tol=1e-6)

print(res.x[0])

donne

-0.6666664123535198

Algorithme de gradient conjugué

x0 = 4.0

res = minimize(function, x0, method='CG', tol=1e-6)

print(res.x[0])

donne

-0.6666666709714467

Algorithme BFGS

from scipy.optimize import minimize

x0 = 4.0

res = minimize(function, x0, method='BFGS', tol=1e-6)

print(res.x[0])

donne

-0.6666666860653405

Algorithme du gradient

from scipy import misc

alpha = 0.1 # learning rate
nb_max_iter = 100 # Nb max d'iteration
eps = 1e-6 # stop condition

x0 = 4.0 # start point
y0 = function(x0)


cond = eps + 10.0 # start with cond greater than eps (assumption)
nb_iter = 0 
tmp_y = y0
while cond > eps and nb_iter < nb_max_iter:
    x0 = x0 - alpha * misc.derivative(function, x0)
    y0 = function(x0)
    nb_iter = nb_iter + 1
    cond = abs( tmp_y - y0 )
    tmp_y = y0
    #print(x0,y0,cond)

print(x0)

donne

-0.6664709324799999

Références

Image

of