function [u] = eq_differenziali(funcauchy,t0,T,y0,varargin)
% Implementare i metodi di Eulero Esplicito 
% ed Eulero Implicito
% INPUT: eq. differenziale, t_0 tfin, y_0 
% OUTPUT: vettore dei valori che approssimano y(t_n)

if nargin==4
    varargin{1}=[] ;
    varargin{2}=[] ;
end

metodo=menu('Metodo ODE','Eulero Esplicito','Eulero Implicito','?','RungeKutta2') ;
h=input('Inserisci il valore del passo di discretizzazione: ') ;
t=t0:h:T ;
N=length(t) ;
u=zeros(N,1)' ;
u(1)=y0 ;
figure

if metodo==1
    for n=1:N-1
        fn=feval(funcauchy,t(n),u(n),varargin{1},varargin{2}) ;  %f(t_n,u_n)
        u(n+1)=u(n)+h*fn ;
    end
elseif metodo==2
    % devo risolvere l'equazione non lineare:
    % u(n+1)-u(n)-h*f(t_(n+1),u_(n+1))=0
    for n=1:N-1
        % risolvere con Newton (fzero, fsolve) 
        % l'equazione non lineare g(u_(n+1))=0
        % incognita: u(n+1) la chiamiamo x
        x0=u(n) ;
        [x,gval]=fsolve(@(x) gEI(x,h,t(n+1),u(n),funcauchy,varargin{1},varargin{2}),x0) ;
        u(n+1)=x ;
        disp(gval)
    end
elseif metodo==3
    for n=1:N-1
        %risoluzione di gtrap: DA FARE
    end  
elseif metodo==4
    [t,u]=rk2(funcauchy,[t0 T],y0,N-1,varargin{1},varargin{2}) ;
else
    disp('Non cosa fare...')
    return
end

plot(t,u,'o--','LineWidth',1.5)
if metodo==1
    title('Eulero Esplicito')
elseif metodo==2
    title('Eulero Implicito')
elseif metodo==4 
    title('RK2')
else
    title('')
end
if strcmp(funcauchy,'fcauchy')
    yesatta=feval(funcauchy,t,[]) ;
    hold on
    plot(t,yesatta,'r')
    grid
    legend('u','Soluzione esatta per f(t,y(t))=cos(2y(t))')
    errore=max(abs(u-yesatta)) ;
    disp(errore)
else
    disp(['Equazione differenziale: ' funcauchy])
end
end

