Per il composto acido formico:
Abbiamo a disposizione i seguenti dati sperimentali:
Un possibile approccio:
Innanzitutto preparo i dati:
% Temperatura (°C) e Pressione (Torr)
T = [-20,-5,2.1,10.3,24,32.4,43.8,61.4,80.3,100.6];
P = [1, 5, 10, 20, 40, 60, 100, 200, 400, 760];
Tf = 8.2; % Temperatura di fusione (°C)
% Trasformo le temperature in °K
T = T + 273.15;
Tf = Tf + 273.15;
% Considero i punti sopra la temperatura di fusione
P = P(T > Tf) % Uso T per selezione una parte di P
T = T(T > Tf) % Quindi rimpiazzo T
Che tipo di curva andremo a costruire?
Ragionando così, dovremmo usare un polinomio di 7° grado
\[\alpha_7 t_0^7 + \alpha_6 t_0^6 + \alpha_5 t_0^5 + \alpha_4 t_0^4 + \alpha_3 t_0^3 + \alpha_2 t_0^2 + \alpha_1 t_0 + \alpha_0 = p_0 \\ \alpha_7 t_1^7 + \alpha_6 t_1^6 + \alpha_5 t_1^5 + \alpha_4 t_1^4 + \alpha_3 t_1^3 + \alpha_2 t_1^2 + \alpha_1 t_1 + \alpha_0 = p_1 \\ \alpha_7 t_2^7 + \alpha_6 t_2^6 + \alpha_5 t_2^5 + \alpha_4 t_2^4 + \alpha_3 t_2^3 + \alpha_2 t_2^2 + \alpha_1 t_2 + \alpha_0 = p_2 \\ \ldots\]
A questo punto possiamo impostare un sistema lineare:
Possiamo costruirla per concatenazione di colonne!
A questo punto possiamo risolvere il sistema:
Questo tipo di problema è molto comune
Si parla di interpolazione polinomiale esatta
Matlab mette a disposizione una funzione per risolverli:
X
è il vettore con le coordinate \(x\)Y
è il vettore con le coordinate \(y\)P
contiene i coefficienti del polinomio interpolanteProviamo ad usarla:
Purtroppo, il risultato lascia desiderare…
Come possiamo ovviare il problema?
Un primo approccio semplicissimo:
Così otteniamo una approssimazione lineare a tratti
In Matlab la possiamo calcolare con:
X
, Y
sono le coordinate \(x\) ed \(y\) dei punti notix
contiene i valori di \(x\) per cui si desidera la valutazioney
è il valore dell’approssimazione nei punti desideratiNel nostro caso, potremmo avere:
Va molto meglio!
Idealmente, dovremmo limitare il grado dell’approssimazione
Per esempio, potremmo impostare:
\[\alpha_2 t_0^2 + \alpha_1 t_0 + \alpha_0 = p_0 \\ \alpha_2 t_1^2 + \alpha_1 t_1 + \alpha_0 = p_0 \\ \alpha_2 t_2^2 + \alpha_1 t_2 + \alpha_0 = p_0 \\ \alpha_2 t_3^2 + \alpha_1 t_3 + \alpha_0 = p_0 \\ \ldots\]
Alle equazioni corrisponde un sistema:
\[A x = b\]
Metodo dei minimi quadrati
Potremmo però risolvere il sistema in senso approssimato:
\[E = Ax - b\]
\[\min_x \|E\|^2 = \min_x \|Ax-b\|^2\]
Perché il quadrato dell’errore?
Il problema di minimizzazione:
\[\min_x \|Ax-b\|^2\]
Si riduce ad un secondo sistema lineare:
\[A^TA x = A^T b\]
Da cui si ottengono le cosiddette equazioni normali:
\[x = (A^TA)^{-1} A^T b\]
Intuitivamente: i coefficienti di una buona approssimazione
Quindi, possiamo impostare il problema come al solito
A
con più righe che colonneb
dei termini notiA questo punto, in teoria ci basta risolvere le equazioni normali:
In pratica, è ancora più semplice. Basta calcolare:
A
non è quadrata…Quindi, possiamo impostare il problema come al solito
A
con più righe che colonneb
dei termini notiA questo punto, in teoria ci basta risolvere le equazioni normali:
In pratica, è ancora più semplice. Basta calcolare:
In realtà, il metodo funziona se il sistema di partenza è lineare
Questo è vero se la funzione approssimante è nella forma:
\[f(x) = \sum_{j=0}^{n-1} \alpha_j g_j(x)\]
In generale, la nostra matrice dei coefficienti avrà questa struttura:
\[\left(\begin{array}{cccc} g_{n-1}(x_0) & g_{n-2}(x_0) & \ldots & g_{0}(x_0) \\ g_{n-1}(x_1) & g_{n-2}(x_1) & \ldots & g_{0}(x_1) \\ \vdots & \vdots & \ddots & \vdots \\ g_{n-1}(x_{m-1}) & g_{n-2}(x_{m-1}) & \ldots & g_{0}(x_{m-1}) \\ \end{array}\right)\]
Torniamo a noi
Nel nostro esempio, sappiamo che vale l’equazione di Antoine:
\[P^* = e^{\left(a - \frac{b}{T}\right)}\]
Torniamo a noi
Nel nostro esempio, sappiamo che vale l’equazione di Antoine:
\[P^* = e^{\left(a - \frac{b}{T}\right)}\]
Fortunatamente, è facile adattarla:
\[\begin{align} & \ln P^* = a - \frac{b}{T} & \longrightarrow & & \ln P^* = a + b \left(-\frac{1}{T}\right) \end{align}\]
Impostiamo un sistema come per l’interpolazione esatta
Quindi avremo:
\[a + b \left(-\frac{1}{T_0}\right) = \ln P^*_0 \\ a + b \left(-\frac{1}{T_1}\right) = \ln P^*_1 \\ \ldots\]
In forma matriciale:
\[\underbrace{\left(\begin{array}{cc} 1 & -\frac{1}{T_0} \\ 1 & -\frac{1}{T_1} \\ \ldots & \ldots \end{array}\right)}_{A} \left(\begin{array}{c} a \\ b \end{array}\right) = \underbrace{\left(\begin{array}{c} \ln P^*_0 \\ \ln P^*_1 \\ \ldots \end{array}\right)}_{b}\]
Nel codice:
Costruiamo la matrice \(A\) e la colonna \(b\) dei termini noti:
T = T' % Vettore delle temperature come colonna
A = [T.^0, -1./T]
b = log(P)' % Logaritmo delle temp. come colonna
Risolviamo le equazioni normali:
x(1)
corrisponde ad a
, x(2)
a b
Nel nostro caso otteniamo:
Si possono dividere i fluidi in diverse categorie…
In particolare, distinguiamo:
Fluidi Newtoniani, per cui:
\[\tau = a \dot{\gamma}\]
Fluidi di Bingham, per cui:
\[\tau = a \dot{\gamma} + b\]
Fluidi pseudoplastici e dilatanti, per cui:
\[\tau = b \dot{\gamma}^a\]
Per due fluidi, sono stati misurati i valori di \(\dot{\gamma}\) e \(\tau\)
fluid1.xlsx
e fluid2.xlsx
es_fluidbehavior.m
contiene già il codice di letturaVogliamo determinare il tipo dei due fluidi. Per farlo:
Otterremo delle funzioni approssimanti \(f\) (via minimi quadrati)
\[MSE = \frac{1}{n} \sum_{i = 1}^n (\tau_i - f(\dot{\gamma}_i))^2\]
È semplicemente la media dei residui al quadrato
Prima parte: verifica se il fluido sia di Bingham
Nel file es_fluidbehavior.m
nello start-kit, definite la funzione:
function [MSE, f] = check_Bingham(DGAMMA, TAU)
Che prenda come parametri:
DGAMMA
con i valori noti di \(\dot{\gamma}\)TAU
con i valori noti di \(\tau\)La funzione assume che il fluido sia di Bingham e restituisce:
MSE
il Mean Squared Errorf
che calcoli \(\tau = f(\dot{\gamma}) = a \dot{\gamma} + b\)Prima parte: verifica se il fluido sia di Bingham
Nel file es_fluidbehavior.m
nello start-kit, definite la funzione:
function [MSE, f] = check_Bingham(DGAMMA, TAU)
f
per disegnare:
min(DGAMMA)
e max(DGAMMA)
È possibile farlo utilizzando la funzione:
Seconda parte: verifica se il fluido sia Newtoniano
Nel file es_fluidbehavior.m
nello start-kit, definite la funzione:
function [MSE, f] = check_Newton(DGAMMA, TAU)
Che prenda come parametri:
DGAMMA
con i valori noti di \(\dot{\gamma}\)TAU
con i valori noti di \(\tau\)La funzione assume che il fluido sia Newtoniano e restituisce:
MSE
il Mean Squared Errorf
che calcoli \(\tau = f(\dot{\gamma}) = a \dot{\gamma}\)Seconda parte: verifica se il fluido sia Newtoniano
Nel file es_fluidbehavior.m
nello start-kit, definite la funzione:
function [MSE, f] = check_Newton(DGAMMA, TAU)
f
per disegnare:
min(DGAMMA)
e max(DGAMMA)
È possibile farlo utilizzando la funzione:
Terza parte: verifica se il fluido sia pseudoplastico o dilatante
Nel file es_fluidbehavior.m
nello start-kit, definite la funzione:
function [MSE, f] = check_PowerLaw(DGAMMA, TAU)
Che prenda come parametri:
DGAMMA
con i valori noti di \(\dot{\gamma}\)TAU
con i valori noti di \(\tau\)La funzione assume che il fluido segua la legge \(\tau = b \dot{\gamma}^a\) e restituisce:
MSE
il Mean Squared Errorf
che calcoli \(\tau = f(\dot{\gamma}) = b \dot{\gamma}^a\)Terza parte: verifica se il fluido sia pseudoplastico o dilatante
Nel file es_fluidbehavior.m
nello start-kit, definite la funzione:
function [MSE, f] = check_PowerLaw(DGAMMA, TAU)
f
per disegnare:
min(DGAMMA)
e max(DGAMMA)
È possibile farlo utilizzando la funzione:
I due file winequality-red.xlsx
e winequality-white.xlsx
…
…Contengono informazioni su una serie di vini portoghesi
Formalmente, ogni data point è una coppia \((x_i, y_i)\) in cui:
Vogliamo ottenere una approssimazione \(f(x)\) della qualità \(y\)
Come gestire funzioni multivariate? Nel solito modo!
Il metodo lineare dei minimi quadrati si può applicare a funzioni nella forma:
\[f(x) = \sum_{j=0}^{n-1} \alpha_j g_j(x)\]
Una funzione basa può utilizzare solo alcune componenti del vettore
Una scelta molto frequente:
\[f(x) = \sum_{j=0}^{n-1} \alpha_j x_j\]
A partire dal file es_wine.m
:
Approssimare la qualità del vino (rosso e bianco) con una funzione \(f(x)\) tale che:
\[f(x) = \sum_{j=0}^{n-1} \alpha_j x_j\]
Una volta determinati i pesi:
histogram
) l’istogramma dell’errore di stima, i.e.:\[err(x_i) = y_i - f(x_i)\]
bar
) un grafico a barre che mostri i valori dei pesi \(\alpha\)Sono date delle misure di deformazione di un pezzo meccanico
Le misure non sono molto precise (sono “rumorose”)
A partire dal file es_strain.m
:
Una possibile definizione dello sforzo meccanico è data da:
\[S(X) = 1 - F'(X)\]
Si calcoli lo sforzo meccanico per \(X = 1.5\)
La velocità di un fluido in una condotta varia lungo la sezione
Supponiamo di avere delle misurazioni di velocità
Le misurazioni sono nella forma \((x_i, y_i)\)
Vogliamo ricostruire l’intero profilo di velocità
Partite dal file es_waterspeed.m
nello start-kit
Approssimate il profilo di velocità:
Procedete poi a disegnare:
scatter
disegnate anche le misurazioniProvate quindi ad utilizzare una interpolazione polinomiale esatta
Il diagramma di prestazione di una pompa centrifuga:
Spesso il diagramma viene definito a partire da valori noti, e.g.:
Nel file es_pump.m
dello start-kit: