#!/usr/bin/python ############################################################################# # # # RESOLUTION D'UN PROBLEME D'OPTIMISATION SANS CONTRAINTES # # # # Methode de Newton a pas fixe # # # ############################################################################# def Newton_F(Oracle, x0, alpha0): from numpy.linalg import norm from numpy.linalg import solve from time import process_time from Visualg import Visualg ##### Initialisation des variables iter_max = 100 gradient_step = alpha0 threshold = 0.000001 gradient_norm_list = [] gradient_step_list = [] critere_list = [] time_start = process_time() x = x0 ##### Boucle sur les iterations for k in range(iter_max): # Valeur du critere et du gradient critere, gradient, hessien = Oracle(x) # Test de convergence gradient_norm = norm(gradient) if gradient_norm <= threshold: break # Direction de descente direction = - solve(hessien, gradient) # Mise a jour des variables x = x + (gradient_step*direction) # Evolution du gradient, du pas, et du critere gradient_norm_list.append(gradient_norm) gradient_step_list.append(gradient_step) critere_list.append(critere) ##### Resultats de l'optimisation critere_opt = critere gradient_opt = gradient x_opt = x time_cpu = process_time() - time_start print() print('Iteration :', k) print('Temps CPU :', time_cpu) print('Critere optimal :', critere_opt) print('Norme du gradient :', norm(gradient_opt)) # Visualisation de la convergence Visualg(gradient_norm_list, gradient_step_list, critere_list) return critere_opt, gradient_opt, x_opt