
function [V_hist,x_in,t_in,hx,ht]=metodolinee(theta,tfin,m,f,d0,d1,G,...
    sigma)

% INPUT.
% theta   : PARAMETRO DEL THETA METODO in [0,1].
% tfin    : ISTANTE FINALE.
% m       : DETERMINA IL PASSO SPAZIALE CON PASSO h_x=1/m.
% f       : u(x,0)=f(x)
% d0, d1  : u(0,t)=d0(t), u(1,t)=d1(t).
% G       : (D_t)u=(D^2_x)u+G.
% sigma: IL PASSO TEMPORALE E' sigma*(hx^2)/2.

% OUTPUT.
% V_hist  : SOLUZIONE ISTANTE PER ISTANTE. RIGHE INIZIALI -> BASSO t.
% x_in   : PUNTI INTERNI NELLA VARIABILE x.
% t_in   : PUNTI INTERNI NELLA VARIABILE t.
% hx      : PASSO SPAZIALE.
% ht      : PASSO TEMPORALE.

hx=1/m; ht=sigma*(hx^2)/2; % PASSI SPAZIALI E TEMPORALI.
x=(0:hx:1)'; x_in=x(2:end-1,:); % PUNTI INTERNI.
u0=feval(f,x_in); % VETTORE SOLUZIONE AL TEMPO "0".
t=(0:ht:tfin)';  t_in=t(2:end,1);   % TEMPI DA ANALIZZARE.
Lambda=-(1/hx^2)*gallery('tridiag',m-1); % Lambda=full(Lambda);


if theta < 1, gt_prev=g(0,x_in,hx,d0,d1,G); end 
V_old=u0; V_hist=[V_old']; err_hist=[]; % INIZIALIZZAZIONI.

for index=1:length(t_in) % STUDIO SOLUZIONE IN TEMPI FINO A tfin.
    t_curr=t_in(index); gt_curr=g(t_curr,x_in,hx,d0,d1,G);
    switch theta
        case 0 % EULERO ESPLICITO.
            V_new=V_old+ht*(Lambda*V_old+gt_prev);
            gt_prev=gt_curr;
        case 1 % EULERO IMPLICITO.
            A=eye(size(Lambda))-ht*Lambda;
            b=V_old+ht*gt_curr; V_new=A\b;
        otherwise % THETA METODO.
            A=eye(size(Lambda))-(ht*theta)*Lambda;
            b=V_old+ht*(1-theta)*(Lambda*V_old+gt_prev)+ht*theta*gt_curr;
            V_new=A\b; gt_prev=gt_curr;
    end
    V_hist=[V_hist; V_new']; V_old=V_new;
end
