Partiamo da un problema semplice, ma realistico:
Partiamo da un problema semplice, ma realistico:
Alcune domande interessanti:
Innanzitutto, occorre modellare il problema:
x
al sua posizione0
e la velocità iniziale 15(m/s)
Possiamo descrivere il sistema con un'equazione differenziale
In particolare, la palla è soggetta ad una accelerazione costante:
¨x=−g
x
è in realta una funzione del tempo, i.e. x(t)
˙x
è la velocità, ¨x
l'accelerazioneSappiamo inoltre che:
x(0)=0˙x(0)=15
Il problema è semplice e può essere risolto per via analitica
A partire da:
d˙xdt=−g
Possiamo ottenere:
d˙x=−gdt∫d˙x=∫−gdt˙x=−gt+C0
Combinando le due equazioni:
˙x=−gt+C0˙x(0)=15
C0=15
Con la stessa tecnica, possiamo derivare:
dxdt=−gt+15∫dx=∫−gt+15dtx=−12gt2+15t+C1
x(0)=0
, abbiamo C1=0
Alla fine del procedimento, otteniamo quindi:
x(t)=−12gt2+15t
x
, in funzione del tempoIntuitivamente: definisce come alcune grandezze variano nel tempo
Possiamo disegnare la funzione su un piano cartesiano!
Guardando il grafico, possiamo osservare che:
Inoltre:
Si possono ottenere i valori esatti, ma per ora non lo facciamo
Invece, ci concentriamo sulla formalizzazione del problema
Noi ci focalizziamo su equazioni differenziali ordinarie
Si tratta di equazioni differenziali nella forma:
x(n)=f(t,x,˙x,¨x,…,x(n−1))
Dove:
x
è una funzione della variabile t
˙x,¨x…x(i)
sono le derivate di x
n
definisce l'ordine dell'equazioneComprendono molte equazioni di interesse pratico
Vedremo come risolvere un EDO utilizzando metodi numerici
Conseguenza:
x(t)
x(t)
per un certo t
Altra conseguenza:
f(t,x,˙x,¨x,…,x(n))=0
Di fatto, possiamo limitarci ad EDO di primo ordine
Quindi alla forma (esplicita):
˙x=f(t,x)
Il "trucco" è che x
può essere una funzione vettoriale
v
per ˙x
)f
(e.g. v=˙x
)Si capisce meglio con un esempio...
Per il nostro problema, abbiamo una equazioni di secondo ordine:
¨x=−g
Introduciamo una variabile per ˙x
e l'equazione che la definisce:
˙x=v˙v=−g
Formalmente, abbiamo f:R2→R2
(˙x,˙v)=f((x,v),t)
Le due componenti di f
sono:
f1((x,v),t)=vf2((x,v),t)=−g
Per risolvere una EDO non è sufficiente la definizione:
˙x=f(t,x)
Occorre specificare delle informazioni addizionali!
x
ad un istante t0
Conseguenza: chiamiamo problema ai valori iniziali un sistema:
˙x=f(t,x)x(t0)=x0
Octave permette di risolvere EDO di primo ordine
In particolare, si utilizza la funzione:
x = lsode(f, x0, t)
Dove "ODE" sta per Ordinary Differential Equations e:
f
è la funzione che definisce l'equazionex0
è il valore di x(t0)
t
è il vettore di valori di t
per cui si vuole conoscere x(t)
x
è il vettore con i valori di x(t)
Per altre informazioni, usate help
!
Il "cuore" della soluzione dell'esempio in Octave è:
function y = f(x, t)
% x(1) = posizione, x(2) = velocità
dx = x(2);
dv = -g;
y = [dx, dv];
end
x0 = [0, 15]; % Valori iniziali
t = linspace(0, 4); % Primi 4 secondi
sol = lsode(@f, x0, t); % soluzione (matrice [x, v])
plot(t, sol(:, 1)) % stampo i valori di x
La soluzione sarà anche disponibile sul sito del corso
Supponiamo di dover verificare la progettazione di montagne russe
Ci interessa il tratto in ingresso ad un "giro della morte"
Ci interessa il tratto in ingresso ad un "giro della morte"
y=ba2x2−2bax+b
b=20m
è la quota di partenza del carrelloa=15m
è il punto di ingresso al giro della morteVogliamo determinare la velocità del carrello nel punto a
Il carrello è soggetto alla forza di gravità. In sintesi, abbiamo:
Come sempre, la prima cosa da fare è modellare il problema
g
Intuitivamente:
A questo punto diventa possibile risolvere il problema
Consideriamo un punto sulla discesa di ingresso
Ci interessa l'accelerazione tangenziale
Sia g
il vettore accelerazione e d
il vettore direzione della tangente
d
ed intensità gTd
Per avere la proiezione, ci serve quindi il vettore direzione
Algebricamente, tutti i punti sulla tangente hanno la forma:
(xy)=(xϕ′x)
Dove:
ϕ(x)
è la funzione che definisce la curvaϕ′
è la derivata di ϕ(x)
nel punto consideratoPer il vettore direzione deve valere:
√x2+y2=1
Combinando le due equazioni otteniamo:
√x2+(ϕ′x)2=1
E con un po' di derivazioni (semplici) deduciamo che:
d=(1√1+ϕ′2ϕ′√1+ϕ′2)
Poiché gT=(0,−g)
, possiamo ottenere l'accelerazione tangenziale:
˙v=gTd=−gϕ′√1+ϕ′2
In sintesi l'accelerazione tangenziale è data da:
˙v=gTd=−gϕ′√1+ϕ′2
˙v
è solo l'intensità del vettored
L'EDO caratterizza il comportamento della velocità tangenziale
v
ϕ′
dipende dalla posizione x
Ci occorre un'altra equazione per caratterizzare la funzione x
Supponiamo che v
sia nota (l'abbiamo già caratterizzata)
x
della velocità con una proiezioneLa velocità tangenziale in forma di vettore è data da:
v=vd=v(1√1+ϕ′2ϕ′√1+ϕ′2)
d
La componente x
della velocità tangenziale è quindi:
˙x=vT(10)=v1√1+ϕ′2
Possiamo così ottenere una modello completo per il problema:
˙x=v1√1+ϕ′(x)2˙v=−gϕ′(x)√1+ϕ′(x)2
Con i valori iniziali:
x(0)=0v(0)=0
È una EDO definita da una funzione vettoriale!
Un altro punto di vista per il modello:
Definiamo lo stato del sistema con due scalari:
v
x
Determiniamo le due equazioni che definiscono ˙v
e ˙x
f
Potremmo tentare di risolvere il problema per via analitica
Le due EDO sono però molto difficili da integrare:
˙x=v1√1+ϕ′(x)2˙v=−gϕ′(x)√1+ϕ′(x)2
Dove, nel nostro caso (traiettoria parabolica):
ϕ(x)=ba2x2−2bax+bϕ′(x)=2ba2x−2ba
Se utilizziamo un metodo numerico, invece:
˙v,˙x
function y = f(x, t)
% x(1) = posizione, x(2) = velocità tangenziale
phip = @(x) ((2.*b)./a.^2 .* x + - (2.* b)./a);
fp = phip(x(1)); % derivata di phi in x
dx =x(2) .* (1 ./ sqrt(1 + fp.^2));
dv = -g .* (fp ./ sqrt(1 + fp.^2));
y = [dx, dv];
end
La soluzione per i primi 3 secondi è la seguente:
Data una EDO del primo ordine in forma esplicita:
˙x=f(x,t)
Ed un valore iniziale:
x(t0)=x0
Come possiamo risolvere il problema ai valori iniziali?
x
˙x
con il rapporto incrementaleMetodo di Eulero (Diretto)
Rimpiazzando ˙x
con il rapporto incrementale otteniamo:
x(t+δ)−x(t)δ≃˙x(t)=f(x(t),t)
˙x
e x
da t
sono esplicitateCon qualche piccola manipolazione otteniamo:
x(t+δ)=x(t)+δf(x(t),t)
x
x(t0)
possiamo calcolare x(t)
nei punti desideratiMetodo di Eulero (Diretto)
Rimpiazzando ˙x
con il rapporto incrementale otteniamo:
x(t+δ)−x(t)δ≃˙x(t)=f(x(t),t)
˙x
e x
da t
sono esplicitateLa formula somiglia un po' a quella dell'IPF
x(t+δ)=x(t)+δf(x(t),t)
Un possibile codice per il metodo:
function x = euler_direct(f, x0, t)
x(1, :) = x0; % prima riga (x è un vettore riga)
for ii = 1:length(t)-1
xc = x(ii, :); % x corrente
tc = t(ii); % tempo corrente
x(ii+1, :) = xc + f(xc, tc) .* (t(ii+1) - tc);
end
end
x
contiene i valori desideratix(t)
e v(t)
Linea nera: lsode
, linea rossa: metodo di Eulero, 50 punti
Il metodo di Eulero non è particolarmente robusto:
f
è fortemente non lineare, l'approssimazione è cattivaIl metodo di Eulero non è particolarmente preciso:
Come gestire i due inconvenienti?
Idea: definiamo il rapporto incrementale sul prossimo istante
x(t)−x(t−δ)δ≃˙x(t)=f(x(t),t)
Con qualche piccola manipolazione otteniamo:
x(t)=x(t−δ)+δf(x(t),t)
Traslando di δ
unità di tempo, finalmente abbiamo:
x(t+δ)=x(t)+δf(x(t+δ),t+δ)
Intuitivamente, quando risolviamo:
x(t+δ)=x(t)+δf(x(t+δ),t+δ)
x
tale che...x
correnteQuesta tecnica rende il metodo più robusto
Attenzione: il metodo non è necessariamente più accurato
δ
non è molto piccoloNero: lsode
, Blu: Eulero, Rosso: Eulero Inverso, 50 punti
L'idea base del metodo di Eulero è utilizzare l'approssimazione:
x(t+δ)−x(t)δ≃˙x(t)
˙x(t)
con il rapporto incrementaleIn realtà, però, è più accurata l'approssimazione seguente:
x(t+δ)−x(t)δ≃˙x(δ2)
Procedendo come al solito otteniamo:
x(t+δ)≃x(t)+δf(t+δ2,x(t+δ2))
x(t+δ/2)
, che ancora non conosciamox(t+δ2)≃x(t)+δ2f(t,x(t))
Combinando, otteniamo il metodo del punto intermedio:
x(t+δ)≃x(t)+δf(t+δ2,x(t)+δ2f(t,x(t)))
La formula del metodo del punto intermedio:
x(t+δ)≃x(t)+δf(t+δ2,x(t)+δ2f(t,x(t)))
...Non è equivalente a raddoppiare i passi nel metodo di Eulero:
x(t+δ)≃x(t)+δ2f(t,x(t))⏟Eulero per t+δ/2+δ2f(t+δ2,x(t)+δ2f(t,x(t)))
δ/2
viene usato solo per correggere la derivataNero: lsode
, Blu: Eulero, Rosso: Punto Intermedio, 50 punti
Un serbatoio atmosferico scarica acqua attraverso una condotta
k=0.5
Quanto tempo impiega il serbatoio a svuotarsi?
Per risolvere il problema occorre utilizzare una EDO
I dati del problema in sintesi:
Prima osservazione chiave:
H
è la quantità d'acqua nel serbatoio, allora −Q=˙H
Seconda osservazione:
f
...fsolve
per calcolare Q