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
α7t70+α6t60+α5t50+α4t40+α3t30+α2t20+α1t0+α0=p0α7t71+α6t61+α5t51+α4t41+α3t31+α2t21+α1t1+α0=p1α7t72+α6t62+α5t52+α4t42+α3t32+α2t22+α1t2+α0=p2…
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 xY
è il vettore con le coordinate yP
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:
α2t20+α1t0+α0=p0α2t21+α1t1+α0=p0α2t22+α1t2+α0=p0α2t23+α1t3+α0=p0…
Alle equazioni corrisponde un sistema:
Ax=b
Metodo dei minimi quadrati
Potremmo però risolvere il sistema in senso approssimato:
E=Ax−b
min
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 \tauLa funzione assume che il fluido sia di Bingham e restituisce:
MSE
il Mean Squared Errorf
che calcoli \tau = f(\dot{\gamma}) = a \dot{\gamma} + bPrima 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 \tauLa 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 \tauLa 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}^aTerza 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 \alphaSono 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: