

function [T,Y]=Eulero(t0,tmax,n,y0,f)

%___________________________________________________________________________
%
% Funzione Eulero
% ____________________
%
% Chiamata:   [T,Y]=Eulero(t0,tmax,n,y0,f);
%
%
% Commento:
%
% La function Eulero utilizza il metodo di Eulero del primo 
% ordine esplicito per determinare i valori approssimati
% della soluzione di un problema di Cauchy,  nei nodi t(i),
% i=1,2,...,n+1 contenuti in  un intervallo [t0,tmax].
% Il problema (scalare o vettoriale) e' del tipo:
% 
% 
% y'(t)=f(t,y(t))     con t in (t0,tmax]
% y(t0)=yo
%
%   
% dove:
% y(t)=(y1(t),y2(t),...,ym(t))
% f(t,y(t))=(f1(t,y(t)),f2(t,y(t)),...,fm(t,y(t))
% y(t0)=(y1(t0),y2(t0),...,ym(t0))=(yo1,yo2,...,yom)=yo
%
% con m=1 nel caso scalare e m>1 nel caso vettoriale.
%___________________________________________________________________________ 
%
%
% Parametri di input della function:
% ___________________________________
%
%  t0,tmax  estremi dell'intervallo di integrazione.
%
%  n        numero di sottointervalli [t(i),t(i+1)], i=1,...,n
%           in cui si desidera suddividere l'intervallo [t0,tmax].    
%
% y0        vettore riga di lunghezza m contenente la condizione iniziale
%           y(t0)=yo=(yo1,yo2,...,yom).
%
% f         vettore colonna di dimensione m  in cui ogni componente e' 
%           una stringa contenente le espressioni f1, f2,..,fm scritte in
%           funzione delle variabili t e y; si puo' creare il vettore f 
%           utilizzando il comando 'strvcat', nel seguente modo: 
%           f=strvcat(f1,f2,...,fm). 
%
%
% Parametri di output della function:
% ___________________________________
%
% T        vettore colonna di dimensione n+1 contenente i nodi t0=t(1),
%          t(2),...,t(n),t(n+1)=tmax.
%
% Y        matrice di dimensione (n+1)x m la cui i-esima riga di lunghezza 
%          m contiene l'approssimazione della funzione y(t)=[y1(t),...,ym(t)], 
%          calcolata nel nodo t(i): y(t(i))=[y1(t(i)),y2(t(i)),...,ym(t(i))].
% 
%___________________________________________________________________________
%
%
% 1° esempio  di utilizzo della function  applicata al seguente 
% problema di Cauchy (caso scalare con m=1):
%  
% y'(t)=-y^2     t e' in (0,1]
% y(0)=1.
%
% La soluzione vera del problema e':
% y(t)=1/(t+1).
%
%
%
%      clear all
%      t0=0; tmax=1;
%      y0=1;
%      n=100;
%      f='-y.^2';     
% 
%      [T,Y]= Eulero(t0,tmax,n,y0,f);
%       
%
%___________________________________________________________________________
%
%
% 2° esempio  di utilizzo della function  applicata al seguente 
% problema di Cauchy (da ricondursi a un problema vettoriale del primo 
% ordine con m=2):
%
% 
% z''(t)=6-20z'(t)-200z(t)    t e' in (0,1].   (*)
% z(0)=0.01
% z'(0)=0.
%
% Il problema di Cauchy (*) e' del secondo ordine; per poter applicare
% la function Eulero a tale problema e' necessario trasformare (*) in
% un problema del I ordine. 
% Ponendo z(t)=y1(t), il problema (*) si trasforma nel problema 
% equivalente:
%
%  
% y1'(t)=y2(t)                t e' in (0,1]    (**)
% y2'(t)=6-200y1(t)-20y2(t)        
% y1(0)=0.01
% y2(0)=0
% 
% con soluzione vera:
% y1(t)=3/100-1/50exp(-10t)(cos(10t)+sin(10t))
% y2(t)=2/5exp(-10t)sin(10t).
%
% La soluzione vera di (*) e' allora:
% z(t)=y1(t)=3/100-1/50exp(-10t)(cos(10t)+sin(10t)).
% La y2(t) corrisponde alla derivata z'(t).
% 
%
% clear all
% t0=0; tmax=1;
% y0=[0.01 0];
% n=100;
% f1='y(2)'; f2='6-200*y(1)-20*y(2)';
% f=strvcat(f1,f2);
% 
% [T,Y]=Eulero(t0,tmax,n,y0,f);
%
% 
% % Osservare che in questo caso Y e' una matrice di dimensione 
% % n+1 x 2 contenente nella prima colonna i valori y1(t(i)), 
% % i=1,2,...,n+1, che sono  le approssimazioni nei nodi della 
% % soluzione del problema (*); la seconda colonna di Y contiene
% % i valori y2(t(i)) che sono le approssimazioni della derivata
% % prima della soluzione di (*).
%
%
%___________________________________________________________________________






h=(tmax-t0)/n;
m=length(y0);
t=t0;y=y0;
T=t0;Y=y0;

for i=1:n
   for j=1:m
      k(j)=eval(f(j,:));
   end
   y=y+h*k;
   t=t+h;
   T=[T; t];
   Y=[Y; y];
end



