//////////////////////
// TP3 : exercice 1 //
//////////////////////


/////////Choix des paramètres//////////////

L=3;//On travaille sur [-L,L]
N=50;//nombre de discrétisations par unité de longueur
dx=1/N;
dt=0.02;
lambda=-1;

//La stabilité dépend de la valeur de lambda*dt/dx
messagebox('On a lambda*dt/dx='+string(lambda*dt/dx));

//La condition initiale
u=max(1-abs(x),0);
//Une autre condition initiale intéressante
//u=1*(abs(x)<1);


//Les variables correspondant aux différentes approximations
sol_ex=u;//La solution exacte
sol_centr=u;//La solution du schéma centré
sol_dec_g=u;//La solution du schéma décentré à gauche
sol_dec_d=u;//La solution du schéma décentré à droite
sol_LW=u;//La solution du schéma de Lax-Wendroff

x=[-L*N:L*N-1]/N;//La grille d'espace


////////////////////////////////////////////////

//Une fonction permettant de décaler tous les coefficients d'un vecteur
function w=decal(v,signe)
  if signe>0//décalage à droite
	w=[v(1) v(1:$-1)];
  else//décalage à gauche
	w=[v(2:$) v($)];
  end;	
endfunction;


//La fenêtre graphique
f=scf(0);
clf();
f.pixmap="on";

/////////////////////////////////////////////////

t=0;
decalage=0;
while 1==1
  t=t+dt;
  
  //Les différents schémas
  sol_centr=sol_centr-lambda*dt/(2*dx)*(decal(sol_centr,-1)-decal(sol_centr,1));
  sol_dec_g=sol_dec_g-(lambda*dt/dx)*(sol_dec_g-decal(sol_dec_g,1));
  sol_dec_d=sol_dec_d-(lambda*dt/dx)*(decal(sol_dec_d,-1)-sol_dec_d);
  sol_LW=sol_LW-lambda*dt/(2*dx)*(decal(sol_LW,-1)-decal(sol_LW,1))+(lambda^2/2)*(dt/dx)^2*[decal(sol_LW,1)+decal(sol_LW,-1)-2*sol_LW];
  
  //Le calcul de la solution exacte
  while decalage*dx<abs(lambda)*t
	decalage=decalage+1;
	sol_ex=decal(sol_ex,lambda);
  end;
  
  //Affichage des résultats
  clf();
  subplot(2,2,1);
  title("Schéma centré");
  plot2d(x,sol_centr,5);
  plot2d(x,sol_ex,13);
  subplot(2,2,2);
  title("Schéma de Lax-Wendroff");
  plot2d(x,sol_LW,5);
  plot2d(x,sol_ex,13);
  subplot(2,2,3);
  title("Schéma décentré à gauche");
  plot2d(x,sol_dec_g,5);
  plot2d(x,sol_ex,13);
  subplot(2,2,4);
  title("Schéma décentré à droite");
  plot2d(x,sol_dec_d,5);
  plot2d(x,sol_ex,13);
  show_pixmap();
end;
