def optimize(dfonc, x_init, pas=0.001, max_iter=1000):
    """ Effectue une descente de gradient de type batch (par lot) pour
    optimiser la valeur d'une fonction.
    :param: dfonc, La fonction retournant le gradient de la fonction à
    optimiser.
    :param: x_init, La valeur initiale de la fonction à optimiser.
    :param: pas, Le pas d'apprentissage.
    :param: max_iter, Le seuil d'itération maximal.
    :return: (x_histo, f_histo, grad_histo), L'historique des valeurs
    calculées.
    """
    x = x_init
    for _ in range(max_iter):
        x = x - pas * dfonc(*x.T)
    return x
