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:
\[\alpha_2 x_0^2 + \alpha_1 x_0 + \alpha_0 = y_0\]
\[\alpha_2 x_1^2 + \alpha_1 x_1 + \alpha_0 = y_1\]
\[2 \alpha_2 x_2 + \alpha_1 = 0\]
\[\alpha_2 x_2^2 + \alpha_1 x_2 + \alpha_0 = y_{max}\]
Nel complesso, abbiamo:
\[\begin{align} \alpha_2 x_0^2 + \alpha_1 x_0 + \alpha_0 &= y_0 \\ \alpha_2 x_1^2 + \alpha_1 x_1 + \alpha_0 &= y_1 \\ 2 \alpha_2 x_2 + \alpha_1 &= 0 \\ \alpha_2 x_2^2 + \alpha_1 x_2 + \alpha_0 &= y_{max} \end{align}\]
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 \(x\)Per 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:
\[\begin{align} & F(x) = 0 && \text{con } F: \mathbb{R}^n \mapsto \mathbb{R}^m \end{align}\]
Per esempio:
\[\begin{align} x^3 &= e^y \\ \log x &= y+1 \end{align} \longleftrightarrow F((x,y)) = (0, 0)\]
\[F((x,y)) = \left(\begin{array}{cc} x^3 - e^y, & \log x - y-1 \end{array}\right)\]
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
=
:\[\begin{align} \alpha_2 x_0^2 + \alpha_1 x_0 + \alpha_0 - y_0 &= 0\\ \alpha_2 x_1^2 + \alpha_1 x_1 + \alpha_0 - y_1 &= 0\\ 2 \alpha_2 x_2 + \alpha_1 &= 0\\ \alpha_2 x_2^2 + \alpha_1 x_2 + \alpha_0 - y_{max} &= 0 \end{align}\]
Le espressioni definiscono i termini di una funzione vettoriale:
\[{\bf x} = (\alpha_2, \alpha_1, \alpha_0, x_2)\]
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 \(x_0\) 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 = \int_{\underbrace{x_0}_{= 0}}^{x_1} f(x) \, dx\]
Il file es_riverbank2.m
contiene i dati del problema:
Suggerimento:
Si consideri il modello di Shepherd:
\[x^{(k+1)} = \frac{r x^{(k)}}{1 + \left(\frac{x^{(k)}}{N}\right)^2 }\]
È un modello tempo-discreto per l’evoluzione di una popolazione:
Si consideri il modello di Shepherd:
\[x^{(k+1)} = \frac{r x^{(k)}}{1 + \left(\frac{x^{(k)}}{N}\right)^2 }\]
Il file es_shepherd.m
nello start-kit contiene un simulatore
\[x = \frac{r x}{1 + \left(\frac{x}{N}\right)^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 \(x_0\)
Si consideri il modello di Crescita Logistica:
\[x^{(k+1)} = r x^{(k)} \left(1 - \frac{x^{(k)}}{N}\right)\]
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 \(x_0\)
Si consideri questo modello preda-predatore visto a lezione:
\[\begin{align} & H^{(t+1)} = \overbrace{r \left(1 - \frac{H^{(t)}}{k} \right) H^{(t)}}^{\text{crescita logistica}} - \overbrace{s\, H^{(t)} P^{(t)}}^{\text{prede eliminate}} \\ & P^{(t+1)} = \underbrace{u\, P^{(t)}}_{\text{calo in assenza di prede}} + v \underbrace{\left( s\, H^{(t)} P^{(t)} \right)}_{\text{prede eliminate}} \end{align}\]
Il file es_logi_pp_eq.m
contiene un simulatore:
Il punto di partenza \(x_0\) sarà in questo caso un vettore:
In un fluido comprimibile isoentropico all’equilibrio…
…Pressione e temperature si distribuiscono secondo le equazioni:
\[\begin{align} & p = p_0 \left[ 1 + \left(1 - \frac{1}{\gamma}\right) \frac{M}{R T_0} g (z_0 - z) \right]^{\frac{\gamma}{\gamma - 1} } \\ & T = T_0 \left[ 1 + \left(1 - \frac{1}{\gamma}\right) \frac{M}{R T_0} g (z_0 - z) \right] \end{align}\]
Se sono noti \(P_0, T_0, \gamma, M, z_0-z\), determinare \(P\) e \(T\) è facile:
Supponiamo invece di disporre di \(P, T, P_0, T_0\) e \(z_0 - 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 \(\gamma\) e \(M\)
Consideriamo un fluido di potenza (dilatante o pseudoplastico)
\[\frac{1}{\sqrt{f}} = \frac{4}{n^{0.75}} \log\left(Re_{pl} f^{1 - n/2}\right) - \frac{0.4}{n^{1.2}}\]
Vogliamo utilizzare la relazione per calcolare il valore di \(f\)
Si supponga che i valori di \(Re_{pl}\) 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 = \frac{64}{Re} \left(1 + \frac{1}{6}\frac{He}{Re} - \frac{64}{3} \frac{He^4}{f^3 Re^7} \right)\]
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