package optimizacion;

/**
 * <p>Title: Ejemplo de aplicacion de LM</p>
 * <p>Description: Minimiza una funcion aplicando LM</p>
 * <p>Copyright: Copyright (c) 2006</p>
 * <p>Company: UMNSH</p>
 * @author Dr. Felix Calderon Solorio
 * @version 1.0
 */

public class ejemplo_08 extends LM{
    ejemplo_08(int np, double T)
    {
        super(np, T);
    }

    public double funcion(double x[]) {
        double f, c = 2.0 * Math.PI;

        f = x[0]*Math.exp(x[0]*x[0] + x[1]*x[1]);
        return f;
    }

    public void Gradiente(double g[], double x[]) {
        double f = Math.exp(x[0]*x[0] + x[1]*x[1]);

        g[0] = f*(1-2.0*x[0]*x[0]);
        g[1] = -f*2.0*x[0]*x[1];
    }

    public void Hessiano(double H[][], double x[]) {
        double f = Math.exp(x[0]*x[0] + x[1]*x[1]);

        H[0][0] = f*x[0]*(-6.0 + 4.0*x[0]*x[0]);
        H[0][1] = 2.0*x[1]*f*(-1.0 + 2.0*x[0]*x[0]);
        H[1][0] = H[0][1];
        H[1][1] = 2.0*x[0]*f*(-1.0 + 2.0*x[1]*x[1]);
    }

    public static void main(String[] args) {
        double x[] = {-0.7, 0.7};

        ejemplo_08 aplica = new ejemplo_08(2, 1e-05);
        aplica.Levenbert_Marquart(x);
    }
}
