Autor: Pablo Fernández (theansweris27.com)

Éste notebook nace como una contribución a los comentarios a la entrada Telemetría - Caso práctico I en el blog de DeltaGap.

El reto consiste en tratar de obtener la pérdida de tiempo, para dos vueltas, en cuatro sectores. Para ello nos centraremos únicamente en la gráfica de la velocidad.

In [1]:
from IPython.display import Image
Image(url='http://deltagap.org/wp-content/uploads/2014/10/traza-marcada.png')
Out[1]:

Planteamiento de la solución

La intuición nos llevará a pensar que el tiempo está relacionado con el área bajo la curva; pero en éste caso eso no es así. Ello se debe a que en el eje $x$ está representada la distancia, y por definición

$$v = \frac{ds}{dt}$$

O de otra manera, si lo que queremos es calcular el tiempo

$$dt = \frac{ds}{v}$$

vemos que para obtener el tiempo $t$ no nos podemos apoyar en la integración de Riemann, pues $v$ y $ds$ no se están multiplicando. Sin embargo, si podríamos calcular la distancia recorrida en una gráfica función del tiempo, pues en ese caso tendríamos que $ds = v\, dt$.

Por tanto, y a partir de la gráfica, para obtener el tiempo empleado en recorrer cierta distancia tenemos que

$$ t = \int\limits_{s_1}^{s_2} \frac{ds}{v(s)} $$

con lo que la diferencia de tiempos sería

$$ \Delta t = \int\limits_{s_1}^{s_2} \frac{ds}{v_2(s)} - \int\limits_{s_1}^{s_2} \frac{ds}{v_1(s)} $$

o compactándalo todo un poco

$$ \Delta t = \int\limits_{s_1}^{s_2} \frac{1}{v_2(s)} - \frac{1}{v_1(s)}\,ds = \int\limits_{s_1}^{s_2} \frac{v_1(s) - v_2(s)}{v_2(s)\cdot v_1(s)}\, ds$$

El hecho de explicar todo este proceso en un notebook de IPython no es trivial, pues utilizaremos el lenguaje de programación Python para resolver estas expresiones.

Resolución

Para resolver el problema primero vamos a discretizar. Lo ideal sería tener a mano los valores proporcionados por el sistema de adquisición de datos del vehículos, pero en éste caso nos apañaremos con las gráficas proporcionadas. Y para obtener una serie de valores discretos a partir de gráficas no he encontrado mejor herramienta que WebPlotDigitizer, con la que hemos obtenido los valores de $v_1$ y $v_2$ a intervalos de 10 m.

Importamos el fichero CSV generado con WebPlotDigitizer a Python:

In [2]:
import pandas as pd
%matplotlib inline
In [3]:
velocidades = pd.DataFrame.from_csv('plot_data.csv')
velocidades.head(6)
Out[3]:
Blue Red
Dist
950 140.446128 141.187921
960 141.772618 142.179718
970 142.920651 143.603031
980 143.661435 144.651549
990 145.157671 145.863872
1000 146.860980 147.541183
In [4]:
velocidades.plot(figsize=(10,5), color=['blue','red'], legend=False)
Out[4]:
<matplotlib.axes.AxesSubplot at 0x882ec18>

Como podemos ver, los datos digitalizados se ajustan razonablemente bien a lo que nos ha proporcionado Daniel García-Carpintero en su blog. Como en el enunciado del problema Daniel nos pide analizar cuatro sectores, de unos 150 m cada uno, realizamos las diviviones correspondientes.

Tomamos los tramos desde:

  • 1300 a 1450 m,
  • 1450 a 1600 m,
  • 1880 a 2030 m, y
  • 2150 a 2300 m.
In [5]:
v11 = velocidades.Blue.ix[1300:1450] / 3.6 # de km/h a m/s
v21 = velocidades.Red.ix[1300:1450] / 3.6
v12 = velocidades.Blue.ix[1450:1600] /3.6
v22 = velocidades.Red.ix[1450:1600] /3.6
v13 = velocidades.Blue.ix[1880:2030] /3.6
v23 = velocidades.Red.ix[1880:2030] /3.6
v14 = velocidades.Blue.ix[2150:2300] /3.6
v24 = velocidades.Red.ix[2150:2300] /3.6

La integral la realizaremos empleando la regla del trapecio.

In [6]:
from scipy.integrate import trapz

Tramo 1

In [7]:
velocidades.ix[1300:1450].plot(figsize=(10,5), color=['blue','red'], legend=False)
Out[7]:
<matplotlib.axes.AxesSubplot at 0x89d00b8>
In [8]:
dt1 = trapz((v11 - v21)/(v21*v11),dx=10)
dt1
Out[8]:
0.60160768955812671

Tramo 2

In [9]:
velocidades.ix[1450:1600].plot(figsize=(10,5), color=['blue','red'], legend=False)
Out[9]:
<matplotlib.axes.AxesSubplot at 0x9b386d8>
In [10]:
dt2 = trapz((v12 - v22)/(v22*v12),dx=10)
dt2
Out[10]:
0.22966861600074526

Tramo 3

In [11]:
velocidades.ix[1880:2030].plot(figsize=(10,5), color=['blue','red'], legend=False)
Out[11]:
<matplotlib.axes.AxesSubplot at 0x9cacbe0>
In [12]:
dt3 = trapz((v13 - v23)/(v23*v13),dx=10)
dt3
Out[12]:
0.12525465180815937

Tramo 4

In [13]:
velocidades.ix[2150:2300].plot(figsize=(10,5), color=['blue','red'], legend=False)
Out[13]:
<matplotlib.axes.AxesSubplot at 0x9c09048>
In [14]:
dt4 = trapz((v14 - v24)/(v24*v14),dx=10)
dt4
Out[14]:
0.3555458607658758

Resultado

Como podemos ver a partir de los resultados numéricos, los puntos donde más tiempo se pierde son aquellos tramos más lentos. Por orden serían:

  • Tramo 1: 0.60 s
  • Tramo 4: 0.36 s
  • Tramo 2: 0.23 s
  • Tramo 3: 0.13 s

Y cuanto menor sea la distancia entre muestras, más precisa será la medida del tiempo.