function [err, u, u_ex] = pararetro_quiz(N, M, tau)
%
%  Schema d'Euler retrograde pour un probleme parabolique unidimensionnel.
%  A chaque pas de temps, il s'agit de resoudre le systeme lineaire :
%            A u^n+1 = u^n + tau f^{n+1}
%
%  parametres
%
%  N        : nombre d'inconnues du systeme lineaire 
%  h        : pas d'espace
%  M        : nombre de pas de temps
%  tau      : pas de temps
%  t        : temps courant
%  u        : N-vecteur, a chaque pas de temps, 
%             u est second membre du systeme lineaire,
%             puis solution du systeme lineaire
%  a        : N-vecteur, diagonale de la matrice A,
%             puis diagonale de L tq  A=LL^T
%  c        : (N-1)-vecteur, sur-diagonale et sous-diagonale
%             de la matrice A, puis sous-diagonale de L tq  A=LL^T
%
h = 1/(N + 1);
t = 0;

%
% condition initiale
%
for i = 1:N
  u(i) = ???;
end

%
% remplissage de la matrice  A
%
for i = 1:N
  a(i) = 1+ ???;
end
for i = 1:N-1
  c(i) = - ???;
end

%
% decomposition LL^T A = LL^T
%
a(1) = sqrt(a(1));
for i = 1:N-1
  c(i) = c(i)/???; 
  a(i+1) = sqrt(a(i+1) - ???);
end

%
% schema d'Euler retrograde: A u^n+1 = u^n
%
for n = 1:M
  t = t+tau;

%
% resolution du systeme lineaire Ly = u^n
%
  u(1) = u(1)/a(1);
  for i = 1:N-1
    u(i+1) = ???;
  end

%
% resolution du systeme lineaire L^T u^n+1 = y
%
  u(N) = u(N)/a(N);
  for i = N-1:-1:1
    u(i) =  (u(i)-???)/a(i); 
  end
end

err = 0;
for i = 1:N
  u_ex(i) = uex(i*h, t);
  erri = abs(u(i) - uex(i*h, t));
  if (erri > err) 
    err = erri;
  end
end
fprintf(' erreur maximum au temps final  %e \n', err)

%
% definition de la solution exacte
%
function u_exacte = uex(x, t)
  u_exacte = sin(2*pi*x)*exp(-4*pi*pi*t);

