% 
% Metodo di soluzione per il problema di Poisson:
%
%  - \Delta u(x,y)   +   sigma * u(x,y)   =   f
%
% con il metodo delle differenze finite, sul dominio quadrato [0,1]x[0,1] ,
% discretizzato uniformemente e con condizioni al contorno di Dirichlet
% omogenee
%
N=10;        % numero di nodi per lato
h=1/(N-1);   % passo della griglia
% coordinate dei nodi a valori incongniti della griglia sul quadrato unitario :
x=[h:h:1-h]';  
y=[h:h:1-h]';
n=(N-2)^2;   % numero di variabili del modello discreto (gradi di libertà)
%
% assegno i coefficienti della PDE
%
sigma = -1;
%
% costruisco la matrice del problema discreto
%
A = mat_ellipt_2D(N,sigma); 
figure(1); clf, spy(A);  % vediamo la struttura di sparsità della matrice "A"
%
% costruisco il membro destro in modo da avere una soluzione predefinita al problema
%
u_vera = ones(size(A,2),1); 
b = A * u_vera;
%
% Risolvo il sistema Ax=b con un metodo iterativo stazionario
%
x_0=zeros(size(A,2),1);
max_it=100;
tol=10^-5;
[u_h,verror,iter,flag] = jacobi_verror(A,x_0,b,max_it,tol);  
%
% grafico della soluzione
%
[xx,yy]=meshgrid(x,y);
u2D = reshape(u_h,N-2,N-2);
figure(2); clf,  mesh(xx,yy,u2D);
%
% Analisi della convergenza del metodo CG per i tre tipi di precondizionamento
%
figure(3); clf,  semilogy(1:length(verror),verror,'b-'); hold on,
           xlabel('iterazioni'); ylabel('norma-2 dell''errore'); 
           title('convergenza del metodo iterativo');
