function [err, unew, u_ex] = paraprog_with_holes(N, M, tau)
    %
    %  Schema d'Euler progressif pour un probleme parabolique unidimensionnel
    %
    %  parametres
    %
    %  N        : nombre de points interieurs dans l'intervalle [0,1]
    %  h        : pas d'espace
    %  M        : nombre de pas de temps
    %  tau	: pas de temps
    %  t        : temps courant
    %  uold     : N-vecteur, uold(i) est une approximation de u(x_i,t_n)
    %  unew     : N-vecteur, unew(i) est une approximation de u(x_i,t_n+1)
    %
    h = 1./(N + 1);
    t = 0.;

    %
    % condition initiale (fct w definie ci-dessous)
    %
    for i = 1:N
      uold(i) = w(i*h);
    end

    %
    % schema d'Euler progressif 
    %
    for n = 1:M
      unew(1) = ??? ;
      for i = 2:N-1
        unew(i) = ??? ;
      end
      unew(N) = ??? ;  
      t = t + tau;

      %
      % reactualiser la solution et imprimer la norme euclidienne de u
      %
      norm2 = 0.;
      for i = 1:N
        uold(i) = unew(i);
        norm2 = norm2 + uold(i)*uold(i);
      end
      if (mod(n, 50) == 0) 
        fprintf(' pas de temps %d temps %f norm2 %e \n', n, t, norm2);
      end
    end

    %
    % imprimer l'erreur maximum au temps final
    %
    err = 0;
    for i = 1:N
      x(i) = i*h;
      u_ex(i) = uex(i*h, t);
      erri = abs(unew(i) - uex(i*h, t));
      if (erri > err) 
        err = erri;
      end
    end
    fprintf(' erreur maximum au temps final  %e \n', err);
    plot(x, unew, '*-b', x, u_ex, '-r');
    legend('solution approchee', 'solution exacte');

    %
    % definition de la condition initiale w(x)
    %
    function init = w(x)
      init = ??? ;

    %
    % solution u du probleme de la chaleur (utilise pour le calcul de l'erreur)
    %
    function u_exact = uex(x, t)
      u_exact = ??? ;
