function [x_grid,y_grid,u_grid]=poisson5pts(n,f,g_left,g_right,g_down,g_up)
% INPUT:  h=1/(n+1), f,g_left,g_right,g_down,g_up definiscono l'eqz. di Poisson.
% OUTPUT: x_grid,y_grid,u_grid: vettori che definiscono griglia e soluzione.
A=-gallery('poisson',n); A=full(A); % MATRICE DI POISSON.
h=1/(n+1); x=(h:h:1-h)'; y=x;
% CONTRIBUTI DI "g" AL TERMINE NOTO.
x_loc=x; y_loc=zeros(size(x_loc)); b_down=feval(g_down,x_loc,y_loc); % basso
x_loc=x; y_loc=ones(size(x_loc)); b_up=feval(g_up,x_loc,y_loc); % alto
x_loc=zeros(size(x)); y_loc=y; b_left=feval(g_left,x_loc,y_loc); % sinistra
x_loc=ones(size(x));  y_loc=y; b_right=feval(g_right,x_loc,y_loc); % destra
% CONTRIBUTO TERMINE NOTO "g": PRIMA E ULTIMA RIGHE
b1=b_down;  b1(1)=b1(1)+b_left(1); b1(n)=b1(n)+b_right(1); % riga in basso
bn=b_up; bn(1)=bn(1)+b_left(n); bn(n)=bn(n)+b_right(n); % riga in alto
% CONTRIBUTO TERMINE NOTO "g": RIGHE INTERMEDIE.
bj=[];
for j=2:(n-1)
    bjloc=zeros(n,1); bjloc(1)=b_left(j); bjloc(n)=b_right(j); bj=[bj; bjloc];
end
b_g=[b1; bj; bn]; % il contributo di "g" al termine noto e' "-b_g".
% GRIGLIA LESSICOGRAFICA (METODO STANDARD).
lunghezza_x=length(x); x_grid=[]; y_grid=[];
for index=1:lunghezza_x
    x_grid=[x_grid; x]; y_grid=[y_grid; y(index)*ones(size(x))];
end
% TERMINE NOTO "b"
fgrid=feval(f,x_grid,y_grid); b_f=(h^2)*fgrid; b=b_f-b_g; % termine noto "b".
u_grid=A\b; % soluzione nei punti della griglia