LABO4 - tutorial analisi dati - ADDENDUM

Esempi per modificare gli assi lin/log

In [1]:
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(10,20,10)
y = x**4

Figura divisa in 4 con le tutte le combo (lin-lin, lin-log, log-lin, log-log)

In [2]:
plt.figure(figsize=(10,8))

plt.subplot(221)
plt.plot(x,y,'--or')
plt.xscale('linear')
plt.yscale('linear')

plt.subplot(222)
plt.plot(x,y,'--or')
plt.xscale('linear')
plt.yscale('log')

plt.subplot(223)
plt.plot(x,y,'--or')
plt.xscale('log')
plt.yscale('linear')

plt.subplot(224)
plt.plot(x,y,'--or')
plt.xscale('log')
plt.yscale('log')

plt.show()

Assi con range a piacere

Approfondimento: axis

In [3]:
rangeapiacere = [-100, 100, -2e5, 2e5]

plt.axis(rangeapiacere)
plt.plot(x,y,'or')
plt.show()

Chi quadro risultante da un fit

Esempio fit di punti con polyfit (approfondiamento: numpy.polyfit)

Se polyfit viene usato con l'opzione full=True restituisce non solo i parametri ma anche i residui (somma degli scarti quadratici), il chi quadro ridotto è quindi ottenibile dividento questo numero per il numero di gradi di libertà (nr dati - parametri fit)

In [4]:
x = np.linspace(0,20,50)
y = x**2 + np.random.normal(0,5,50) # parabola con spread gaussiano

plt.plot(x,y,'ob', label='dati',alpha=0.5)

# fit quadratico (nelle variabili "_" intercetto quantità che non mi interssa usare)
p, residuals, _, _, _ = np.polyfit(x, y, 2, full=True)
red_chisq = residuals/(y.size-3) # chi quadro ridotto

# plot del risultato del fit (usando polyval)
plt.plot(x,np.polyval(p,x),'--r',label='$\chi^2/dof = %.2f$'%red_chisq, linewidth=2)
plt.legend(fontsize=16)
plt.show()

Esempio con scipy.optimize.curve_fit (approfondiamento: curve_fit)

Il comando curve_fit non restituisce direttamente il chi quadro che va quindi ricavato (somma degli scarti quadratici del modello rispetto ai dati)

In [5]:
import scipy.optimize as opt

# funzione lineare (retta)
def quadr(x, *pars):
    return pars[0]*x**2 + pars[1]*x + pars[0]


plt.plot(x,y,'ob', label='dati',alpha=0.5)

optPars, pCov = opt.curve_fit(quadr,x,y,p0=[1,0.1,1]) # optPar contiene i parametri risultanti dal fit mentr pCov è la matrice di covarianza

# calcolo chi quadro (si può fare in una linea ma così sono chiari i passaggi)
least_squares = (quadr(x,*optPars) - y)**2  # scarti quadratici
chisq = least_squares.sum()                 # somma totale
red_chisq = chisq / (y.size - 3)            # chi quadro ridotto (divisione per nr di dati meno i parametri liberi)

plt.plot(x,quadr(x,*optPars),'--r',linewidth=2, label='$\chi^2/dof = %.2f$'%red_chisq)
plt.legend(fontsize=16)

plt.show()
/home/valerio/.local/lib/python3.6/site-packages/scipy/optimize/minpack.py:808: OptimizeWarning: Covariance of the parameters could not be estimated
  category=OptimizeWarning)
In [ ]: