Consideriamo il sistema non lineare:
2x2=ey12x+13y+z2=0z=sin(πx)+cos(πy)
Come possiamo risolverlo?
Consideriamo il sistema non lineare:
2x2=ey12x+13y+z2=0z=sin(πx)+cos(πy)
fi(x,y,z)=0
f1(x,y,z)=2x2−ey=0f2(x,y,z)=12x+13y+z2=0f3(x,y,z)=z−sin(πx)−cos(πy)=0
Consideriamo il sistema non lineare:
2x2=ey12x+13y+z2=0z=sin(πx)+cos(πy)
F((x,y,z))=(f1(x,y,z)f2(x,y,z)f3(x,y,z))=(0,0,0)
Una possibile soluzione (disponibile sul sito del corso)
clear all
function y = f(x)
y(1) = 2.*x(1).^2 - e.^x(2);
y(2) = 1./2 .* x(1) + 1./3 .* x(2) + x(3).^2;
y(3) = sin(pi .* x(1)) + cos(pi .* x(2)) - x(3);
end
x0 = [0, 0, 0]
[sol, fval, status] = fsolve(@f, x0)
Consideriamo una leggera variziona del sistema:
2x2=ey12x+13y+z=0era: z2z=sin(πx)+cos(πy)
In questo caso il metodo di Newton non converge
f(x(k))
non si annulla mai...Per via delle tolleranze, possono succedere due cose:
x(k+1)
e x(k)
sono vicini, anche se f(x(k+1))≠0
f(x(k+1))
e f(x(k))
sono vicini, anche se f(x(k+1))≠0
In entrambi i casi la funzione fsolve
di Octave termina:
INFO
è rispettivamente 2 o 3FVAL
non è nulloCome gestire il problema?
FVAL
!In fluidodinamica si può distinguere la classe di un fluido
La distinzione viene fatta in base alla relazione tra:
˙γ
τ
In particolare, consideriamo tre casi:
τ=α˙γ
τ=α˙γ+β
τ=α˙γβ
Su un piano cartesiano, i tre tipi di fluido si presentano così:
La determinazione viene effettuata in modo empirico:
τ,˙γ
In pratica, possiamo utilizzare il metodo dei minimi quadrati!
(a)τ=α˙γ(b)τ=α˙γ+β(c)τ=α˙γβ
e=n∑i=1(τi−fα,β(˙γi))2
Siano date le misurazioni di τ,˙γ
della figura seguente:
Si determini il tipo di fluido ed i parametri della relazione tra τ
e ˙γ
Partiamo dal caso più semplice, ossia il fluido di Bingham
fα,β(˙γ)=α˙γ+β
x = % misurazioni di gamma
y = % misurazioni di tau
% Minimi quadrati
p1 = polyfit(x, y, 1) % p1 = [1.07631, 0.82395]
% Funzione approssimante
f1 = @(x) (polyval(p1, x))
Vediamo su un grafico la qualità dell'approssimazione:
In termini numerici, guardiamo alla somma dei quadrati dei residui:
e=n∑i=1(τi−fα,β(˙γi))2
In Octave:
E1 = sum((y - f1(x)).^2)
1.2065
Proviamo ipotizzare che il fluido sia Newtoniano, quindi:
fα,β(˙γ)=α˙γ
polyfit
: non garantirebbe di avere β=0
Però possiamo eseguire il metodo risolvendo un sistema lineare!
β
sono dati da:β=(ΦTΦ)ΦTy
fβ(x)=β1g1(x)+β2g2(x)+…
Nel nostro caso, la funzione approssimante ha un solo componente:
g1(x)↔˙γ
α
Quindi la matrice Φ
sara fatta come segue:
Φ=(g1(x1)g2(x2)⋮)=(˙γ1˙γ2⋮)
Φ
è semplicemente il vettore delle nostre misurazioni ˙γ
!In Octave, assumendo di avere un fluido Newtoniano, otteniamo:
x = % colonna con le misurazioni di gamma
y = % colonna con la misurazioni di tau
Phi = x
p2 = Phi \ y % p = alpha = 1.6901
f2 = @(x) (p2 .* x) % Funzione approssimante
E2 = sum((y - f2(x)).^2)
E2
vale 15.990
Rimane da considerare solo il caso del fluido pseudoplastico, con:
fα,β(˙γ)=α˙γβ
Di nuovo non possiamo usare polyfit
, ma per una ragione diversa:
β
...Il metodo non si applica se f
dipende non linearmente dai parametri
In realtà, c'è una soluzione semplice: possiamo "barare" ;-)
Guardiamo cosa succede considerando log(fα,β)
anziché fα,β
:
logfα,β(˙γ)=log(α˙γβ)=logα+βlogx
In altre parole:
fα,β(˙γ)
...x
Quindi, utilizzare il metodo dei minimi quadrati, trasformiamo i dati:
τi⟶logτi˙γi⟶log˙γi
Questi sono i dati trasformati su un grafico cartesiano:
Sembra proprio una retta => è probabile che il fluido si pseudoplastico
A questo punto possiamo approssimare i dati trasformati:
x = % misurazioni di gamma
y = % misurazioni di tau
xl = log(x) % trasformo gamma
yl = log(y) % trasformo tau
p3 = polyfit(xl, yl) % risultato: [0.49591, 0.68855]
Poiché abbiamo logfα,β(˙γ)=logα+βlogx
, allora:
p3(1)
contiene β
p3(2)
contiene logα
A questo punto possiamo applicare ai parametri alla forma iniziale:
fα,β(˙γ)=αxβ
In Octave, abbiamo:
% p3(1) = alpha = 0.49591
% p3(2) = log(beta) = 0.68855
% Quindi la funzione approssimante è:
f3 = @(x) (e.^p3(2) .* x.^p3(1) )
E3 = sum((y - f3(x)).^2)
E3
è 0.58175
, il migliore finoraα≃0.49591,β≃e0.68855
Vediamo la qualità dell'approssimazione su un grafico:
Consideriamo il nostro esempio delle BMW
Lo stato è descritto da (x,v)
e si evolve secondo l'EDO:
˙v=1m(F−12ρv2CDA)
Dove abbiamo che:
F=1000N
, m=161Kg
ρ≃1.25Kg/m3
(densità dell'aria)A=1.2m2
(superficie esposta)CD=0.26
(resistenza aerodinamica)Domanda: quanto vale la velocità dopo 40
secondi?
Il modo più semplice per rispondere è risolvere l'EDO fino a t=40
:
function dx = f(x, t)
... % Definizione delle variabili
% x(1) = posizione, x(2) = velocità
dx(1) = x(2);
dx(2) = 1./m .* (F - 0.5.*rho.* x(2).^2.*C_D.*A);
end
t = linspace(0, 40);
x0 = [0, 0];
sol = lsode(@f, x0, t)
v = sol(:, 2)
v40 = v(end) % Il risultato!
v
Proviamo a complicare la cosa:
Soluzione banale:
t=40
per ottenere la velocitàt=20
per ottenere la stradaCosì facendo però ripetiamo i conti due volte
Vediamo un metodo alternativo
La soluzione della EDO è un vettore di valutazioni della funzione v(t)
:
Se ci interessa il valore di v(t0)
per un t0
che è stato valutato:
i0
di t0
nel vettore t
...v(i0)
Se ci interessa v(t0)
per un t0
che è non stato valutato:
i
per cui t(i) >= t0 && t(i+1) <= t0
t(i) <= t0 && t(i+1) >= t0
(se t
non è un "tempo")Se ci interessa v(t0)
per un t0
che è non stato valutato:
v(i)
Se ci interessa v(t0)
per un t0
che è non stato valutato:
v(i)
In sintesi, dati due vettori v
e t
:
i
tale che t
"attraversa" t0
v
(eventualmente interpolando)Equivale ad approssimare y=f(x)
con una spezzata!
Equivale ad approssimare y=f(x)
con una spezzata!
Il codice in Octave:
function xx = lookup_interp(t, x, t0)
for ii = 1:length(t)-1
if (t(ii) <= t0 && t(ii+1) >= t0) || ...
(t(ii+1) <= t0 && t(ii) >= t0)
% Coefficiente angolare
m = (x(ii+1)-x(ii)) ./ (t(ii+1)-t(ii));
% Interpolazione lineare
xx = x(ii) + m .* (t0 - t(ii));
break
end
end
end
Quanto tempo di vuole per arrivare a 100Km/h
?
v
(anziché su t
)t
(anziché di v
)lookup_interp(v, t, 27.78) % 100 Km/h = 27.78 m/s
Quanto vale la velocità dopo 100m
?
x
v
lookup_interp(x, v, 100)
interp1
In alternativa, potete usare la funzione predefinita:
function Y1 = interp1(X, Y, XI)
...Che restituisce il valore interpolato di Y
quando X
vale XI
interp1
utilizza una interpolazione linearehelp
)Attenzione: interp1
richiede che X
sia ordinato
X
rappresenta il tempo, allora l'ordinamento è naturaleX
rappresenta qualcos'altro (e.g. strada) allora non è dettoBuone notizie: la nostra lookup_interp
non ha questo problema!
Consideriamo ancora le nostre montagne russe:
a=15m,b=20m
a
?Vediamo le parti importanti della soluzione in Octave:
function y = f(x, t)
% x(1) = pos., x(2) = vel. (vars: da definire)
fp = (2.*b)./a.^2 .* x(1) + - (2.*b)./a;
y(1) = x(2) .* (1 ./ sqrt(1 + fp.^2));
y(2) = -g .* (fp ./ sqrt(1 + fp.^2));
end
t = linspace(0, 4); % In 4 secondi oltrepasso "a"
x0 = [0, 0];
sol = lsode(@f, x0, t);
v = sol(:, 2)
VA = lookup_interp(x, v, a); % Risultato: 1.6633
Torniamo all'esempio delle BMW
Lo stato è descritto da (x,v)
e si evolve secondo l'EDO:
˙v=1m(F−12ρv2CDA)
Abbiamo sempre che:
F=1000N
, m=161Kg
ρ≃1.25Kg/m3
(densità dell'aria)A=1.2m2
(superficie esposta)CD=0.26
(resistenza aerodinamica)Nuova Domanda: quanto vale la velocità massima?
In questo caso la velocità massima è la velocità "a regime"
Lo stato stazionario di v
viene raggiunto quando ˙v=0
t = linspace(0, 60);
sol = lsode(@f, [0, 0], t);
v = sol(:, 2)
˙v=˙v=1m(F−12ρv2CDA)
dv = 1./m .* (F - 0.5 .* rho .* v.^2 .* C_D .* A)
v
quando ˙v=0
% Uso una tolleranza: ˙v=0 a +∞
vmax = lookup_interp(dv, v, 1e-5)
Consideriamo la formula fondamentale del metodo di Eulero:
x(t+δ)=x(t)+δf′(x,t)
È la descrizione di un sistema dinamico tempo-discreto
x(t+δ)
e x(t)
non sono sufficientemente viciniRispetto al metodo precedente:
lsode
usa delle approssimazioni molto miglioriConsideriamo ancora l'esempio delle montagne russe:
Domanda: quanto deve valere v
nel punto 0
perché in a
sia 20m/s
?
Proviamo a modellare il problema:
˙x=v1√1+ϕ′(x)2˙v=−gϕ′(x)√1+ϕ′(x)2
ϕ′(x)=2b/a2x−2b/a
Sappiamo che, per un qualche tempo ff
deve valere:
x(tf)=av(tf)=20
Possiamo risolverlo con i metodi visti finora?
Provate a pensare dal metodo di Eulero:
x=a
e v=20
...x
vale 0
Intuitivamente:
˙x′(τ)= ?˙v′(τ)= ?x′(0)=av′(0)=20
Dobbiamo solo determinare le funzioni per il calcolo di ˙x′(τ),˙v′(τ)
Per come l'abbiamo definita, la nuova variabile τ
corrisponde a:
τ=g(t)=tf−t
Quindi, se ci riferiamo con x′(τ)
a x(g(τ))
, possiamo ottenere:
˙x′(τ)=˙x(g(t))g′(t)=−f(x(g(t),g(t))=−f(x′,tf−t)
f(x,t)
è la funzione che definiva ˙x(t)
Quindi possiamo ottenere la nuova EDO con:
˙x′=−f(x′,tf−t)
f(x,t)
originariat
in f(x,t)
con tf−t
Nel nostro caso, il problema con il tempo invertito è dato da:
˙x=−v1√1+ϕ′(x)2˙v=+gϕ′(x)√1+ϕ′(x)2x(0)=a,v(0)=20
Per semplicità le variabili non sono state rinominate
t
fosse comparsa nella espressione di ˙x,˙v
...tf−t
In questo caso, avremmo dovuto conoscere il valore di tf
Vediamo la soluzione (disegnata con plotyy
, se vi interessa)
Per ottenere il valore di velocità richiesto:
xf = [a, 20]; % Condizioni al contorno
tau = linspace(0, 4); % Tempo invertito
sol = lsode(@f, xf, tau);
% Ottengo i due vettori che compongono la soluzione
x = sol(:, 1);
v = sol(:, 2);
v0 = lookup_interp(x, v, 0) % velocità per x = 0
2.7558m/s