package optimizacion;

import operaciones.Matriz;

/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: </p>
 * @author not attributable
 * @version 1.0
 */

public class ejemplo07 extends minimos {
    public static void main(String arg[])
    {
        ejemplo07 aplica = new ejemplo07();
        double x[] = {2,2};

        aplica.Forsite(new Matriz(x));

        //aplica.Maximo_Descenso_Gradiente(new Matriz(x));

        //aplica.Maximo_Descenso_Gradiente(new Matriz(x));
        //aplica.Minimiza_Wolfe_RD(new Matriz(x));
    }

    public void valor()
    {
        double a[] = {2, 2};
        double b[] = {0.2215, 0.2215};
        Matriz X1 = new Matriz(a);
        Matriz X2 = new Matriz(b);
        Matriz Y = X2.menos(X1);
        Matriz d = Unitario(Y);

        Matriz p = new Matriz(b);
        Matriz H = Hessiano(X1);
        Matriz g = Gradiente(X1);
        System.out.println("Y");
        Y.imprime();

        double alpha = alpha_Direcccion(X1, Y);
        System.out.println(alpha + " -- " + alpha_MD(p, H));
        X1 = X1.mas(d.por(alpha));

        X1.imprime();
    }

    /**
     * Funcion a minimizar
     * @param x Matriz
     * @return double
     */

    public double funcion(Matriz x) {
        double f, x1 = x.obten(0, 0), x2 = x.obten(1, 0);

        f = 4.0*x1*x1 + x2*x2;

        return f;
    }

    /**
     * Calcula el vector de primeras derivadas
     * @param x Matriz punto de evaluacion
     * @return Matriz vector gradiente
     */

    public Matriz Gradiente(Matriz x) {
        double x1, x2;
        double g[] = new double[2];

        x1 = x.obten(0, 0);
        x2 = x.obten(1, 0);

        g[0] = 8.0*x1;
        g[1] = 2.0*x2;

        Matriz grad = new Matriz(g);
        return grad;
    }

    /**
     * Hessiano de la funcion objetivo
     * @param x Matriz Punto de evaluacion
     * @return Matriz
     */

    public Matriz Hessiano(Matriz x) {
        double x1, x2;
        double h[][] = new double[2][2];

        x1 = x.obten(0, 0);
        x2 = x.obten(1, 0);

        h[0][0] = 8;
        h[0][1] = 0;
        h[1][0] = 0;
        h[1][1] = 2;

        Matriz hess = new Matriz(h);
        return hess;
    }
}
