function [intervalle,iter]=dicho(fonction,intervalle,epsilon,iter) // Methode de dichotomie utilisant la dédivée // En entree // fonction : fonction supposee unimodale de la forme // y=fonction(x). // intervalle : vecteur 1x2, intervalle de depart pour l'optimisation. // epsilon : reel positif, precision de l'optimisation. // iter : entier, nombre d'iteration pour l'algotithme. // En sortie // intervalle : vecteur 1x2, resultat de la dichotomie. // iter : nombre d'iterations restantes a effectuer. // // Test de l'intervalle de départ // init=iter; binf=min(intervalle); bsup=max(intervalle); if norm(binf-bsup)==%inf then error('une des bornes de l''intervalle est infinie'), end; bdemi = (binf+bsup)/2; f_binf = fonction(binf); f_bsup = fonction(bsup); f_bdemi = fonction(bdemi); u=file('open','results_dicho','unknown'); // Methode de dichotomie while ((abs(bsup-binf)>= epsilon) & (iter >= 1)) b1quart = (bdemi+binf)/2; b3quart = (bsup+bdemi)/2; f_b1quart = fonction(b1quart); f_b3quart = fonction(b3quart); tab=[f_binf,f_b1quart,f_bdemi,f_b3quart,f_bsup]; [a,b]=gsort(tab,'c','i'); if (b(1) == 1) | (b(1) == 2) then bsup = bdemi; bdemi = b1quart; f_bsup = f_bdemi; f_bdemi = f_b1quart; elseif b(1) == 3 then binf = b1quart; bsup = b3quart; f_binf = f_b1quart; f_bsup = f_b3quart; elseif (b(1) == 4) | (b(1) == 5) then binf = bdemi; bdemi = b3quart; f_binf = f_bdemi; f_bdemi = f_b3quart; end fprintf(u,'iter = %2.0f binf = %10.8f bsup = %10.8f precision %10.8f',... init-iter+1,binf,bsup,abs(bsup-binf)); iter=iter-1; end intervalle=[binf,bsup]; file('close',u) endfunction