public class ODE1D{
double T;
double h;
int N;	
double u0;
double[] Valeurs;
FoncRdansR f;
FoncRdansR fp;

ODE1D(double TT, double hh, double uu0, FoncRdansR fonc, FoncRdansR foncp)
{
f=fonc;
fp=foncp;
T=TT;
h=hh;
N= (int) (T/h);
u0=uu0;
Valeurs=null;
//System.out.println("OK");
}

public double[] eulerE(){
double[] u=new double[N+1];
u[0]=u0;
for(int n=0;n<N;n++)
{
u[n+1]=u[n]+h*f.calcul(u[n]);
}
Valeurs=u;
return u;
}

public void afficherValeurs(){

for(int n=0;n<N;n++)
{
System.out.println("Valeurs ["+n+"]="+Valeurs[n]);
}

}

public double[] eulerI(){
int nmax=1000;
double eps=0.00000001;
double[] u=new double[N+1];
u[0]=u0;
for(int n=0;n<N;n++)
{
double xn=u[n];
int i=0;
while ((Math.abs(-u[n]+xn-h*f.calcul(xn))>eps) & (i<nmax))
{
xn=xn-(-u[n]+xn-h*f.calcul(xn))/(1-h*fp.calcul(xn));
i++;
}
u[n+1]=xn;
}
Valeurs=u;
return u;
}

public double[] thMeth(double th){
int nmax=1000;
double eps=0.00000001;
double[] u=new double[N+1];
double xn;
u[0]=u0;
for(int n=0;n<N;n++)
{
xn=u[n];
int i=0;
while ((Math.abs(xn-h*(1.0-th)*f.calcul(xn)-u[n]-th*h*f.calcul(u[n]))>eps) & (i<nmax))
{
xn=xn-(xn-h*(1.0-th)*f.calcul(xn)-u[n]-th*h*f.calcul(u[n]))/(1.0-(1.0-th)*h*fp.calcul(xn));
i++;
System.out.println("xn="+xn+", i="+i);
}
u[n+1]=xn;
}
Valeurs=u;
return u;
}

public double[] rK2(){

double[] u=new double[N+1];
double un1,un2;
u[0]=u0;
for(int n=0;n<N;n++)
{
un1=u[n];
un2=u[n]+h*f.calcul(un1);
u[n+1]=u[n]+(h/2)*(f.calcul(un1)+f.calcul(un2));
}
Valeurs=u;
return u;
}

public double[] rK4(){

double[] u=new double[N+1];
double un1,un2,un3,un4;
u[0]=u0;
for(int n=0;n<N;n++)
{
un1=u[n];
un2=u[n]+(h/2)*f.calcul(un1);
un3=u[n]+(h/2)*f.calcul(un2);
un4=u[n]+(h)*f.calcul(un3);
u[n+1]=u[n]+(h/6)*(f.calcul(un1)+2*f.calcul(un2)+2*f.calcul(un3)+f.calcul(un4));
}
Valeurs=u;
return u;
}
}
