diff --git a/algoritmo.md b/algoritmo.md new file mode 100644 index 0000000..8ae5b6f --- /dev/null +++ b/algoritmo.md @@ -0,0 +1,90 @@ +# Algoritmo di fitting: Minimi Quadrati Non Lineari con Trust Region Reflective + +## 1. Introduzione + +Il raffreddamento newtoniano produce curve della forma: + +$$T(t) = T_\infty + A \cdot e^{-(t - t_0)/\tau}$$ + +I parametri da stimare sono $A$, $\tau$ e $t_0$. Nonostante la parte esponenziale sia linearizzabile con un logaritmo, la presenza di $T_\infty$ e di $t_0$ rende il modello **intrinsecamente non lineare** nei parametri: non esiste una trasformazione algebrica che lo riduca a una regressione lineare. È quindi necessario un algoritmo iterativo di ottimizzazione non lineare. + +--- + +## 2. Minimi Quadrati Non Lineari + +L'obiettivo è trovare il vettore di parametri $\boldsymbol{\theta}$ che minimizza la somma dei quadrati dei residui pesati: + +$$\min_{\boldsymbol{\theta}} \; S(\boldsymbol{\theta}) = \sum_{i=1}^{N} \left(\frac{y_i - f(x_i,\, \boldsymbol{\theta})}{\sigma_i}\right)^2$$ + +dove: +- $y_i$ sono le temperature misurate, +- $f(x_i, \boldsymbol{\theta})$ è il modello (esponenziale semplice o doppio), +- $\sigma_i$ è l'incertezza associata al campione $i$ (usata per pesare i punti). + +A differenza dei minimi quadrati lineari, qui $S(\boldsymbol{\theta})$ non ha soluzione analitica chiusa. Il problema viene risolto iterativamente sfruttando il **Jacobiano** $J_{ij} = \partial f(x_i, \boldsymbol{\theta}) / \partial \theta_j$, che descrive come ogni parametro influenza i residui localmente. + +--- + +## 3. Trust Region Reflective (TRF) + +`scipy.optimize.curve_fit` usa per default il metodo **Trust Region Reflective**, progettato per problemi di minimi quadrati non lineari — in particolare con vincoli di bound (parametri limitati inferiormente/superiormente). + +### Idea di base: regione di fiducia + +Ad ogni iterazione $k$, invece di cercare il minimo globale di $S$, l'algoritmo risolve un **sottoproblema locale** entro una *regione di fiducia* di raggio $\Delta_k$: + +$$\min_{\mathbf{p}} \; m_k(\mathbf{p}) = S(\boldsymbol{\theta}_k) + \mathbf{g}_k^T \mathbf{p} + \tfrac{1}{2}\mathbf{p}^T B_k \mathbf{p}$$ +$$\text{soggetto a } \|\mathbf{p}\| \leq \Delta_k$$ + +dove $\mathbf{g}_k = J^T \mathbf{r}$ è il gradiente e $B_k \approx J^T J$ è l'approssimazione hessiana (formula di Gauss–Newton). + +### Aggiornamento adattivo del raggio + +Dopo ogni passo proposto $\mathbf{p}_k$, si calcola il **rapporto di riduzione**: + +$$\rho_k = \frac{S(\boldsymbol{\theta}_k) - S(\boldsymbol{\theta}_k + \mathbf{p}_k)}{m_k(\mathbf{0}) - m_k(\mathbf{p}_k)}$$ + +- $\rho_k \approx 1$: il modello quadratico è accurato → il passo viene accettato e $\Delta_k$ aumenta. +- $\rho_k \ll 1$ o negativo: il modello è impreciso → il passo viene rifiutato e $\Delta_k$ si riduce. + +Questo meccanismo garantisce convergenza anche quando il punto iniziale è lontano dal minimo. + +### Gestione dei bound ("Reflective") + +Il termine *Reflective* indica la strategia per rispettare i vincoli di box ($l_j \leq \theta_j \leq u_j$): quando il passo proposto supera un bound, viene **riflesso** lungo quella direzione, mantenendo il sottoproblema risolvibile in modo efficiente senza proiezioni esplicite. + +--- + +## 4. Pesi (Weighted Least Squares) + +Il parametro `sigma` di `curve_fit` permette di assegnare incertezze diverse ai punti. Campioni con $\sigma_i$ grande contribuiscono poco a $S(\boldsymbol{\theta})$ e vengono quasi ignorati dal fit. + +Questa tecnica è usata per **escludere zone di dati corrotti** senza eliminarle fisicamente: ai campioni nella zona problematica si assegna $\sigma_i = 10^{10}$, riducendo il loro peso a zero in modo pratico. I campioni affidabili mantengono $\sigma_i = 1$. + +--- + +## 5. Stima iniziale dei parametri + +I minimi quadrati non lineari sono sensibili al punto di partenza: un'inizializzazione lontana dal minimo globale può far convergere l'algoritmo verso un minimo locale. Per questo motivo i parametri iniziali vanno scelti con cura, usando: + +- **Conoscenza fisica** del processo (es. costante di tempo dell'ordine di decine di secondi per un oggetto metallico in aria), +- **Fit preliminari** su sotto-finestre dei dati (es. il risultato del fit sull'intero intervallo come punto di partenza per il doppio esponenziale), +- **Ispezione visiva** della curva. + +--- + +## 6. Metriche di qualità + +### Coefficiente di determinazione R² + +$$R^2 = 1 - \frac{\sum_i (y_i - \hat{y}_i)^2}{\sum_i (y_i - \bar{y})^2}$$ + +Misura la frazione di varianza dei dati spiegata dal modello. Valori vicini a 1 indicano un fit eccellente. + +### Incertezze sui parametri + +`curve_fit` restituisce la **matrice di covarianza** $C = (J^T J)^{-1} \sigma^2_{\text{res}}$. La deviazione standard del parametro $\theta_j$ è: + +$$\sigma_{\theta_j} = \sqrt{C_{jj}}$$ + +Queste incertezze quantificano la sensibilità del fit alla variabilità dei dati e dipendono sia dalla qualità del modello sia dalla struttura dei residui.