private static double[] gaussTriDiag(Punto[] puntos){
        // cálculo de h[i] y w[i]
        int n = puntos.length-1;  // Cantidad de puntos menos uno --> cantidad de invervalos que hay.
        double[] h = new double[n];
        double[] w = new double[n];
        // calculo de los hi y los wi
        for (int i = 0; i < n; i ++) {
            h[i] = puntos[i+1].getX() - puntos[i].getX();
            w[i] = 6*(puntos[i+1].getY()-puntos[i].getY())/h[i];
        }
        double[] u = new double[n];
        double[] v = new double[n];
        // cálculo de u[1] y v[1]
        u[1] = 2*(h[1] + h[0]);
        v[1] = w[1]-w[0];
        // proceso descendente del sistema tridiagonal
        // calculo de los ui y los vi
        for (int i = 2; i < n; i ++) {
            u[i] =2*(h[i]+h[i-1])-h[i-1]*h[i-1]/u[i-1];
            v[i] = w[i]- w[i-1]-h[i-1]*v[i-1]/u[i-1];
        }
        double[] z = new double[n+1];
        // proceso ascendente del sistema tridiagonal
        z[n]=0;      // Condicion por spline cubico natural
        // Se calculan los zi
        for (int i = n-1; i > 0; i--){
            z[i] = (v[i]- h[i]*z[i+1])/u[i];
        }
        z[0]=0;       // Condicion por spline cubico natural
        return z;
    }