Supponiamo di dover progettare l’argine di un fiume
L’argine deve:
Di fatto, si tratta di progettare/tracciare una curva
Proviamo a formulare equazioni per le condizioni da rispettare:
α2x20+α1x0+α0=y0
α2x21+α1x1+α0=y1
2α2x2+α1=0
α2x22+α1x2+α0=ymax
Nel complesso, abbiamo:
α2x20+α1x0+α0=y0α2x21+α1x1+α0=y12α2x2+α1=0α2x22+α1x2+α0=ymax
In sostanza, abbiamo un sistema di equazioni non lineari:
Per risolvere equazioni non lineari Matlab offre due funzioni:
Entrambe risolvono equazioni nella forma:
f(x)=0
fsolve
) potrebbe non convergereUna soluzione dell’equazione è detta uno zero della funzione
Per risolvere equazioni non lineari Matlab offre due funzioni:
Per quanto riguarda i parametri, abbiamo che:
X0
è la stima iniziale di x da cui partireF
è la funzione da azzerare (passata come parametro)F
deve avere un singolo parametro, i.e.:X
) corrisponde alla variabile xPer risolvere equazioni non lineari Matlab offre due funzioni:
Per quanto riguarda i valori restituiti abbiamo che:
X
è l’ultimo valore di x visitato
FVAL
è il valore di F
in corrispondenza di X
FLAG
è un numero che indica come sono andate le cose
1
, l’algoritmo ha trovato uno zerohelp
)Per risolvere equazioni non lineari Matlab offre due funzioni:
Le due funzioni usano una combinazione di metodi numerici
fzero
è basata (grossomodo) sul metodo della bisezione
x1
…F(X0)
e F(X1)
abbiamo segni oppostiF
è continua, allora converge semprefsolve
usa metodi completamente diversi (i.e. trust region)
fzero
Per risolvere equazioni non lineari Matlab offre due funzioni:
Il valore di x0
è molto importante:
fzero
, perché non si riesce a trovare un x1
adeguatofsolve
, per i limiti del metodo stessox0
…Di solito, il valore di x0
si sceglie per intuizione o per tentativi
Per risolvere un sistema di equazioni non lineari…
…Cerchiamo lo zero di una funzione vettoriale, ossia risolviamo:
F(x)=0con F:Rn↦Rm
Per esempio:
x3=eylogx=y+1⟷F((x,y))=(0,0)
F((x,y))=(x3−ey,logx−y−1)
Per i sistemi di equazioni non lineari…
…Possiamo usare solo fsolve
In questo caso:
F
dovrà avere ancora un singolo parametro:X
sarà un vettore anziché uno scalareZ
fsolve
cercherà un vettore X
per cui F(X)
restituisca un vettore nullo
Torniamo al nostro problema
=
:α2x20+α1x0+α0−y0=0α2x21+α1x1+α0−y1=02α2x2+α1=0α2x22+α1x2+α0−ymax=0
Le espressioni definiscono i termini di una funzione vettoriale:
x=(α2,α1,α0,x2)
A questo punto possiamo codificare la funzione in Matlab:
function z = f(a2, a1, a0, x0, x1, y0, y1, x2, ymax)
% La curva deve passare per (x0, y0)
z(1) = a2*x0^2 + a1*x0 + a0 - y0;
% La curva deve passare per (x1, y1)
z(2) = a2*x1^2 + a1*x1 + a0 - y1;
% La derivata si deve annullare in X(4)
z(3) = 2*a2*x2 + a1;
% in X(4) la curva deve valere ymax
z(4) = a2*x2^2 + a1*x2 + a0 - ymax;
end
z
è un vettore di 4 elementiLa nostra f
è la funzione da azzerare
fsolve
richiede una funzione con un singolo argomentoRisolviamo il problema con una funzione anonima:
x0 = 0;
x1 = 7;
y0 = 0;
y1 = 2;
ymax = 5;
% Espongo un solo parametro
fz = @(X) f(X(1),X(2),X(3),x0,x1,y0,y1,X(4),ymax);
X
, il vettore delle variabiliPer trovare uno zero a questo punto usiamo:
x0
specificherà un valore per ogni variabilex0 = [-1, 1, 0, 3]
Scegliere il valore x0 per i sistemi di equazioni può essere complicato
Come linea guida:
Per il nostro problema, l’argine avrà questa forma:
Consideriamo di nuovo l’esempio di costruzione di un argine
Come in precedenza:
L’argine deve:
La superficie sarà data da:
S=∫x1x0⏟=0f(x)dx
Il file es_riverbank2.m
contiene i dati del problema:
Suggerimento:
Si consideri il modello di Shepherd:
x(k+1)=rx(k)1+(x(k)N)2
È un modello tempo-discreto per l’evoluzione di una popolazione:
Si consideri il modello di Shepherd:
x(k+1)=rx(k)1+(x(k)N)2
Il file es_shepherd.m
nello start-kit contiene un simulatore
x=rx1+(xN)2
Estendete il codice in es_shepherd.m
Costruite opportunamente la funzione da azzerare
Trovate lo zero con fzero
o fsolve
fval
e flag
Provate a variare il valore di partenza x0
Si consideri il modello di Crescita Logistica:
x(k+1)=rx(k)(1−x(k)N)
Che può essere utilizzato per l’evoluzione di una popolazione
Il file es_logi_eq.m
nello start-kit contiene un simulatore
Estendete il codice in es_logi_eq.m
Costruite opportunamente la funzione da azzerare
Trovate lo zero con fzero
o fsolve
fval
e flag
Provate a variare il valore di partenza x0
Si consideri questo modello preda-predatore visto a lezione:
H(t+1)=crescita logistica⏞r(1−H(t)k)H(t)−prede eliminate⏞sH(t)P(t)P(t+1)=uP(t)⏟calo in assenza di prede+v(sH(t)P(t))⏟prede eliminate
Il file es_logi_pp_eq.m
contiene un simulatore:
Il punto di partenza x0 sarà in questo caso un vettore:
In un fluido comprimibile isoentropico all’equilibrio…
…Pressione e temperature si distribuiscono secondo le equazioni:
p=p0[1+(1−1γ)MRT0g(z0−z)]γγ−1T=T0[1+(1−1γ)MRT0g(z0−z)]
Se sono noti P0,T0,γ,M,z0−z, determinare P e T è facile:
Supponiamo invece di disporre di P,T,P0,T0 e z0−z
Quindi dobbiamo risolvere un sistema di due equazioni non lineari
Il file es_isentropic.m
contiene i dati del problema
Definite una funzione:
Definite quindi una funzione anonima che esponga solo γ e M
Consideriamo un fluido di potenza (dilatante o pseudoplastico)
1√f=4n0.75log(Replf1−n/2)−0.4n1.2
Vogliamo utilizzare la relazione per calcolare il valore di f
Si supponga che i valori di Repl e n siano noti
Il file es_dodge_metzner.m
contiene i dati del problema
fzero
o fsolve
…fzero
o fsolve
In un secondo momento:
Consideriamo un fluido di Bingham
f=64Re(1+16HeRe−643He4f3Re7)
Vogliamo utilizzare la relazione per calcolare il valore di f
Si supponga che i valori di Re e He siano noti
Il file es_buckingham_reiner.m
contiene i dati del problema
fzero
o fsolve
…fzero
o fsolve
Attenzione: Per f=0 l’equazione perde senso fisico!
linspace
usa di default