Datan sovitus
Aiemmin malli tehtiin olettamalla, että $v(0) = 0$, mutta nyt pitää vielä huomioida reaktioaika $t = 0.142 $s. Se onnistuu helpolla siirtämällä aika-akselia $t \to t – 0.142 s$. Sovitetaan vain mittauspisteisiin, ei lasernopeuteen/ paikkaan, kuten ap artikkelissa.
Ensin pieni kuvaajan piirto ja datan luku
import csv import numpy as np #genfromtxt import matplotlib.pyplot as plt data = np.genfromtxt('100mBerlin.csv', skip_header=1) xmitta=ajat[:,0] tmitta=ajat[:,1] plt.plot(xmitta, tmitta, 'o-', linewidth=3); plt.xlabel('Paikka [m]', fontsize=20); plt.ylabel('Aika [s]', fontsize=20); "xlim(0,100); plt.show();
Sovitus Pythonin lmfit-paketilla. Sitä varten piti asentaa scipy ja lmfit tuli helpolla
easy_install -U lmfit
Lmfit-paketti on melko yksinkertainen käyttää ja parametrit ja data kulkeutuvat kivasti. Määritetään virhe- eli minimoitava residuaalifunktio
from lmfit import minimize, Parameters import numpy as np def residual(params, t, data): A = params['A'].value B = params['B'].value k = params['k'].value t = t tr = 0.142 model = A/k*np.log( (A+B*np.exp(-k*(t-tr)) )/(A+B)) + B/k*np.log( (A*np.exp(k*t) + B)/(A+B) ) return (data-model) params = Parameters() params.add('A', value=100) params.add('B', value=10) params.add('k', value=1) result = minimize(residual, params, args=(tmitta,xmitta)) report_fit(params)