# 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.
