public class L2functions implements D2op{

 
    double sigma = 0.1;

    double sqr(double x){
	return((x)*(x));
    }
    
    public double valeurspropres(int n){//série inifnie des valeurs propres positives 
	return(sqr(n*Math.PI));
    }

    public double valpn(double gamma){
	return( -1.0/sqr(gamma) );
    }

    public double  Dfonctionspropres(int n, double x){//Le cas des conditions aux limites Dirichlet
	return(Math.sqrt(2.0)*Math.sin(n*Math.PI*x));
    }

    public double dDfonctionspropres(int n, double x){//Le cas des conditions aux limites Dirichlet
	return(Math.sqrt(2.0)*Math.PI*Math.cos(n*Math.PI*x));
    }

    public double Nfonctionspropres(int n, double x){//Le cas des conditions aux limites Neumann
	return(Math.sqrt(2.0)*Math.cos(n*Math.PI*x));
    }

    public double dNfonctionspropres(int n, double x){//Le cas des conditions aux limites Neumann
	return(-Math.sqrt(2.0)*Math.PI*Math.sin(n*Math.PI*x));
    }

    public double theta(double gamma, int n){//La fonction auxiliaire, qui entre dans la définition des conditions aux limites Robin
	return(Math.atan(n*Math.PI*gamma));
    }

    
    public double Rfonctionspropres(int n, double gamma, double x){//Le cas des conditions aux limites Robin: La série infinie
	return(Math.sqrt(2.0)*Math.sin(n*Math.PI*x-theta(gamma,n)));
    }

    public double dRfonctionspropres(int n, double gamma, double x){//La dérivée par rapport à la coordonnée spatiale de la fonction propre de Robin de la série infinie
	return(Math.sqrt(2.0)*n*Math.PI*Math.cos(n*Math.PI*x-theta(gamma, n)) );
    } 
    
    public double Rfpropren(double gamma, double x){//Le cas des  conditions aux limites Robin: La fonction propre à valeur propre négative isolée
	return(Math.sqrt(2.0/(gamma*(1-Math.exp(-2.0/gamma))))*Math.exp(-x/gamma) );// La normalisation manque!!
    }

    public double dRfpropren(double gamma, double x){
	return( -(Math.sqrt( 2.0/(gamma*(1-Math.exp(-2.0/gamma)))))*Math.exp(-x/gamma)/gamma );//La normalisation manque!!
    }
    
    
    public double ConditionInitiale(double x){
	    return(Math.exp(-sqr(x-0.5)/(2.0*sqr(sigma) ))/Math.sqrt(2.0*Math.PI*sqr(sigma)));
		//	return(Dfonctionspropres(1,x));
		//	return(Rfonctionspropres(1,0.1,x);//Condition initiale pour gamma = 0.1
    }

	

}
