Equazioni Differenziali
Equazioni Differenziali
Equazioni Differenziali
A. SOMMARIVA E M. VIANELLO
Conoscenze richieste. Formula di Taylor. Risoluzione di equazioni nonlineari. Calcolo differenziale. Cono-
scenza di Matlab/Octave.
Conoscenze ottenute. Discretizzazione con Eulero esplicito ed Eulero implicito. Stabilita assoluta dei due
metodi.
2.1. I metodi di Eulero esplicito ed Eulero implicito. Si supponga che (1.2) abbia una
e una sola soluzione. Per semplicita consideriamo il caso in cui y sia a valori in R. Due
classici metodi per risolvere il problema differenziale (1.2) sono il metodo di Eulero esplicito
ed il metodo di Eulero implicito.
Denotiamo con I(x, x) il piu piccolo intervallo aperto contenente x e x. Assumendo
che la soluzione sia sufficientemente regolare, abbiamo dalla formula di Taylor per x x,
c1 I(x, x) e (1.2)
ove y0 = y(x0 ).
Similmente al caso precedente, se poniamo in (2.3) che siano x = xk , x = xk+1 abbiamo
e quindi
ove y0 = y(x0 ).
Evidentemente ad ogni iterazione si richiede di risolvere unequazione nonlineare nella
variabile z del tipo z = yk + hf (xk+1 , z), la cui soluzione puo essere calcolata utilizzando
ad esempio col metodo di punto fisso, delle secanti o di Newton.
N OTA 2.3. Si osservi che utilizzando la formula di Taylor multivariata, i due metodi
possono essere estesi al caso generale n 1. In particolare il metodo di Eulero implicito ad
ogni operazione dovra risolvere un sistema nonlineare, ad esempio con il metodo di punto
fisso o di tipo Newton.
2
3. I metodi di Eulero in Matlab. Utilizzando lhelp di Matlab, si nota subito che
esistono delle routines predefinite per risolvere equazioni differenziali ordinarie. Infatti
...
...
>>
Tra queste non sono incluse le routines dei metodi di Eulero esplicito ed implicito che dal-
tra parte non sono difficili da programmare. Dei codici in merito si trovano presso il sito
web [4], osservando che forward Euler e backward Euler corrispondono rispettivamente ai
metodi di Eulero esplicito ed implicito. Tale software e gentilmente fornito gratuitamente
dagli autori. Per quanto detto euler for corrisponde al metodo di Eulero esplicito mentre
euler back al metodo di Eulero implicito.
3.1. Codice di Eulero esplicito. Di seguito scriviamo il codice Matlab che implementa
il metodo di Eulero esplicito, offerto da K. Atkinson, W. Han e D. Steward. Quali inputs
vengono richiesti il punto iniziale t 0 e il valore y 0 della soluzione, il punto finale t end,
il passo h e la funzione f via la variabile fcn.
n = fix((t_end-t0)/h)+1;
t = linspace(t0,t0+(n-1)*h,n);
y = zeros(n,1);
y(1) = y0;
for i = 2:n
y(i) = y(i-1) + h*feval(fcn,t(i-1),y(i-1));
end
end % euler_for
ans =
Nelle colonne dei risultati, la prima e lascissa in cui viene approssimata la soluzione, la
seconda il valore approssimato dal metodo di Eulero esplicito, la terza la soluzione corret-
ta. Infine nelle ultime due colonne vengono forniti gli errori assoluti e relativi compiuti dal
metodo di Eulero esplicito.
3.2. Codice di Eulero implicito. Di seguito scriviamo il codice Matlab che implementa
il metodo di Eulero esplicito, offerto da K. Atkinson, W. Han e D. Steward. Quali inputs
vengono richiesti il punto iniziale t 0 e il valore y 0 della soluzione, il punto finale t end,
il passo h, la funzione f via la variabile fcn. e tol la tolleranza richiesta dal metodo
iterativo che risolve ad ogni iterazione lequazione nonlineare richiesta dal metodo.
%----------------------------------------------------
% MATLAB CODE TAKEN FROM
% K. Atkinson, W. Han e D. Steward,
% Numerical Solution of Ordinary Differential Equations,
% programs for the book, John Wiley and Sons, 2009,
% http://www.math.uiowa.edu/NumericalAnalysisODE/
%----------------------------------------------------
% function [t,y] = euler_back(t0,y0,t_end,h,fcn,tol)
%----------------------------------------------------
% Solve the initial value problem
% y = f(t,y), t0 <= t <= b, y(t0)=y0
% Use the backward Euler method with a stepsize
% of h.
% The user must supply an m-file to define the
% derivative f, with some name,
% say deriv.m, and a first line of the form
% function ans=deriv(t,y)
% tol is the user supplied bound on the difference
% between successive values of the backward Euler
% iteration.
% A sample call would be
% [t,z]=euler_back(t0,z0,b,delta,deriv,1e-6)
%----------------------------------------------------
% Output:
% The routine euler_back will return two vectors,
% t and y.
% The vector t will contain the node points
% t(1)=t0, t(j)=t0+(j-1)*h, j=1,2,...,N
5
% with
% t(N) <= t_end, t(N)+h > t_end
% The vector y will contain the estimates of the
% solution Y at the node points in t.
%----------------------------------------------------
% Initialize.
n = fix((t_end-t0)/h) + 1;
t = linspace(t0,t0+(n-1)*h,n);
y = zeros(n,1);
y(1) = y0;
% advancing
for i=2:n
% forward Euler estimate
yt1 = y(i-1) + h*feval(fcn,t(i-1),y(i-1));
% one-point iteration
count = 0;
diff = 1;
while diff > tol && count < 10
yt2 = y(i-1) + h*feval(fcn,t(i),yt1);
diff = abs(yt2-yt1);
yt1 = yt2;
count = count +1;
end
if count >= 10
disp(Not converging after 10 steps at t = )
fprintf(%5.2f\n, t(i))
end
y(i) = yt2;
end
end % euler_back
>> fcn=inline(2*cos(x)-0*sin(x)-y);
>> t0=1; y0=1; t_end=10; h=0.5; tol=10(-2);
>> [t,y] = euler_back(t0,y0,t_end,h,fcn,tol);
>> [t y y_sol abs(y-y_sol) abs(y-y_sol)./abs(y_sol)]
ans =
>>
Nelle colonne dei risultati, la prima e lascissa in cui viene approssimata la soluzione, la
seconda il valore approssimato dal metodo di Eulero implicito, la terza la soluzione corret-
ta. Infine nelle ultime due colonne vengono forniti gli errori assoluti e relativi compiuti dal
metodo di Eulero implicito. Il metodo risolve lequazione
z = yk + hf (xk+1 , z)
%----------------------------------------------------
% VARIANT OF A MATLAB CODE TAKEN FROM
% K. Atkinson, W. Han e D. Steward,
% Numerical Solution of Ordinary Differential Equations,
7
% programs for the book, John Wiley and Sons, 2009,
% http://www.math.uiowa.edu/NumericalAnalysisODE/
%----------------------------------------------------
% Solve the initial value problem
% y = f(t,y), t0 <= t <= b, y(t0)=y0
% Use the backward Euler method with a stepsize of h. The user must
% supply an m-file to define the derivative f, with some name,
% say deriv.m, and a first line of the form
% function ans=deriv(t,y)
% tol is the user supplied bound on the difference between successive
% values of the backward Euler iteration.
% Maxit is the maximum number of iterations performed
% by the secants method.
% A sample call would be
% [t,z]=euler_back_secants(t0,z0,b,delta,deriv,maxit,1e-6)
%----------------------------------------------------
% Output:
% The routine euler_back will return two vectors, t and y.
% The vector t will contain the node points
% t(1)=t0, t(j)=t0+(j-1)*h, j=1,2,...,N
% with
% t(N) <= t_end, t(N)+h > t_end
% The vector y will contain the estimates of the solution Y
% at the node points in t.
%----------------------------------------------------
% Initialize.
n = fix((t_end-t0)/h) + 1;
t = linspace(t0,t0+(n-1)*h,n);
y = zeros(n,1);
y(1) = y0;
% advancing
for i=2:n
% forward Euler estimate
yt1 = y(i-1) + h*feval(fcn,t(i-1),y(i-1));
% secant iteration
k=1;
yy(1)=min(yt1,yt2); yy(2)=max(yt1,yt2);
step_err(1)=yy(2)-yy(1);
k=k+1;
fx_old=yy(k-1)-y(i-1)-h*feval(fcn,t(i),yy(k-1));
fx_new=yy(k)-y(i-1)-h*feval(fcn,t(i),yy(k));
dfx=(fx_new-fx_old)/(yy(k)-yy(k-1));
step_err_k=-fx_new/dfx;
step_err=[step_err; step_err_k];
8
yy(k+1)=yy(k)+step_err(end);
end
step_err=[];
if k == maxit
fprintf(\n \t Results may be not correct.);
end
y(i) = yy(end);
end
>> fcn=inline(2*cos(x)+0*sin(x)-y);
>> t0=1; y0=1; t_end=10; h=0.5; maxit=100; tol=10(-4);
>> [t,y] = euler_backn(t0,y0,t_end,h,fcn,maxit,tol);
>> y_sol=sin(t)+cos(t);
>> [t y y_sol abs(y-y_sol) abs(y-y_sol)./abs(y_sol)]
ans =
>>
5. Esercizio.
1. Approssimare per = 100 il valore assunto dalla soluzione y del problema di
Cauchy
y (x) = y(x), x 0
(5.1)
y(0) = 1
nel punto x = 0.2. A tal proposito si utilizzano i metodi di Eulero esplicito e Eulero
implicito (nella versione con il metodo delle secanti) con passi h = 0.1, h = 0.05,
h = 0.02, h = 0.01, h = 0.001. Al variare di h verificare quando |1 + h| < 1. Se
eseguiti correttamente dovrebbero fornire quali risultati (cf. [2, p.396])
in cui alla prima colonna si stabilisce il passo h, nella seconda si espongono i risultati
ottenuti dal metodo di Eulero esplicito e nella terza quelli di Eulero implicito (nella
versione con il metodo delle secanti). Suggerimenti.
>> fcn=inline(0*x-100*y);
(b) Visto che vogliamo valutare la funzione in 0.2, ha senso porre t end maggiore
o minore di 0.2? Perche ?
2. Approssimare per = 500 il valore assunto dalla soluzione y del problema di
Cauchy
y (x) = y(x), x 0
(5.2)
y(0) = 1
nel punto x = 0.2. A tal proposito si utilizzano i metodi di Eulero esplicito e Eulero
implicito (nella versione con il metodo delle secanti) con passi h = 0.1, h = 0.05,
10
h = 0.02, h = 0.01, h = 0.001, h = 0.0005. Al variare di h verificare quando
|1 + h| < 1. Il metodo di Eulero implicito per h piccoli puo richiedere molto
tempo di calcolo.
RIFERIMENTI BIBLIOGRAFICI
11