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)