Koliko sam dobro trčao? (drugi dio)

Sanjao sam sfingu koja daje proročanstva i mogao sam postaviti jedno pitanje. Pitao sam: kada će na Blogaritmu ponovno osvanuti nešto normalno, matematičko? Sfinga je odgovorila: hokus pokus, bogovi su odlučili, to će biti danas!

Ovo je nastavak objave Koliko sam dobro trčao? (prvi dio) u kojoj sam pitao:

Ako sam pretrčao S metara u T sekundi, koliko sam uspješno trčao?

I evo, tijekom ovog sunčanog vikenda riješio sam taj problem.

Nakon što sam pri kraju te objave zaključio da je uspjeh dobro računati kao kombinaciju doprinosa prijeđenog puta S i prosječne brzine V (= S / T), te u međuvremenu kratkim istraživanjem po webu shvatio da je riječ o približno eksponencijalnom odnosu, odlučio sam da formula treba biti umnožak oblika:

S^\beta V^\gamma

s parametrima \beta i \gamma takvima da se iznos kreće od 0 do 100 – pri čemu bi svjetski rekord dao rezultat 100. Da bismo izračunali dotične parametre, valja pogledati te svjetske rekorde – osim sprinteva (S < 1000) u kojima su principi malo drugačiji. Ako je, recimo, (s, v) jedan konkretan rekord, onda treba vrijediti:

s^\beta v^\gamma = 100 \quad\Rightarrow\quad \beta \log s + \gamma \log v = 2.

Ako u matricu X po redcima stavimo parove (\log s, \log v) za sve promatrane svjetske rekorde, iz gornjih jednadžbi dobivamo preodređeni sustav jednadžbi:

X [\beta \, \,\, \gamma]^T = [2, 2, ..., 2]^T,

čije najpreciznije rješenje u smislu najmanjih kvadrata dobivamo na sljedeći način:

[\beta \,\,\, \gamma]^T = (X^T X)^{-1} X^T [2, 2, ..., 2]^T.

Konačno, formula za uspjeh trčanja (na osnovi liste svjetskih rekorda danih u donjem kodu), ako je S izražen u metrima, a V u metrima po sekundi, ispada približno:

uspjeh = S^{0.14} \cdot V^{1.81}

Primjerice, ako sam pretrčao 5 kilometara (S = 5000) u 25 minuta (V = 5000 / (25 \cdot 60) = 3.33), uspjeh ispada 5000^{0.14} \cdot 3.33^{1.81} = 29.1 od mogućih 100. Prilično loše, hahaha!

Evo i koda u Pythonu. Pokrenete li ga, vidjet ćete da formula nije potpuno precizna: uspjesi svjetskih rekordera kreću se između 97 i 103.

#!/usr/bin/python3
from math import log
import numpy as np

csv = "1000,no,131.96,male,track,Noah Ngeny,1999-09-05\n\
1500,yes,206.00,male,track,Hicham El Guerrouj,1998-07-14\n\
1609.344,no,223.13,male,track,Hicham El Guerrouj,1999-07-07\n\
2000,no,284.79,male,track,Hicham El Guerrouj,1999-09-07\n\
3000,no,440.67,male,track,Daniel Komen,1996-09-01\n\
5000,yes,757.35,male,track,Kenenisa Bekele,2004-05-31\n\
10000,yes,1577.53,male,track,Kenenisa Bekele,2005-08-26\n\
10000,no,1604,male,road,Leonard Patrick Komon,2010-09-26\n\
15000,no,2473,male,road,Leonard Patrick Komon,2010-11-21\n\
20000,no,3386,male,track,Haile Gebrselassie,2007-06-27\n\
20000,no,3321,male,road,Zersenay Tadese,2010-03-21\n\
21097.5,no,3503,male,road,Zersenay Tadese,2010-03-21\n\
21285,no,3600,male,road,Haile Gebrselassie,2007-06-27\n\
25000,no,4345.4,male,track,Moses Mosop,2011-06-03\n\
25000,no,4310,male,road,Samuel Kosgei,2010-05-09\n\
30000,no,5207.4,male,track,Moses Mosop,2011-06-03\n\
30000,no,5257,male,road,Peter Cheruiyot Kirui,2011-09-25\n\
42195,yes,7418,male,road,Patrick Makau,2011-09-25"

x = []
y = []
for row in csv.split('\n'):
    data = row.split(',')
    s, t = float(data[0]), float(data[2])
    v = s / t
    x.append([np.log10(s), np.log10(v)])
    y.append(2)
x = np.array(x)
y = np.array(y)

beta, gamma = np.linalg.inv(x.T @ x) @ x.T @ y
print(beta, gamma)

for row in csv.split('\n'):
    data = row.split(',')
    s, t = float(data[0]), float(data[2])
    v = s / t
    print(s**beta * v**gamma)

Komentiraj

Popunite niže tražene podatke ili kliknite na neku od ikona za prijavu:

WordPress.com Logo

Ovaj komentar pišete koristeći vaš WordPress.com račun. Odjava /  Izmijeni )

Facebook slika

Ovaj komentar pišete koristeći vaš Facebook račun. Odjava /  Izmijeni )

Spajanje na %s