Applying calculus to real-world physics to compute the shape of a roller coaster loop.
This program should work on Python 2.7.x and 3.x.
pip install -r requirements.txtpython main.py [C1, C2, ...]
python main.py 2 3 4 5
The derivation of equations is based on [1]. Scipy's default non-linear ODE solver is used instead of Euler's method.
The loop shape is computed so that the centripetal force a_c stays constant along the track segment:
a_c = C * g # (1)where C is a non-dimensional parameter.
We then derive the expression of the radius r along the track section.
The centripetal acceleration is commonly express as:
a_c = v ** 2 / r # (2)Using (1) and (2) we get:
r = v ** 2 / (G * g) # (3)But the conservation of energy gives us:
v ** 2 = v_0 ** 2 - 2 * g * yAnd so:
r = 1 / C * (v_0 ** 2 / g - 2 * y)The relationship between r the curvilinear abscissa s is:
∂Θ/∂s = 1/rBesides, s can be related to the abscissa x and the height y of a given point of the track section using:
∂x/∂s = cos(Θ)
∂y/∂s = sin(Θ)This allows us to write the final system of non-linear ODEs:
∂Θ/∂s = C / (v_0 ** 2 / g - 2 * y)
∂x/∂s = cos(Θ)
∂y/∂s = sin(Θ)This system can be rewritten as
dZ/ds = f(s, Z)where Z = (Θ x y) and:
f(s, Z) = (C / (v_0 ** 2 / g - 2 * Z[2]), cos(Z[0]), sin(Z[1]))We use this expression to integrate the system of ODEs using scipy.integrate.ode. The final results are dislayed using matplotlib.
- Improve the CLI experience (hint: use Click).
- Plot G against
s:G = v ** 2 / (r * g) + cos(Θ). - Add other scenarios, e.g. circular loop, triangular/trapezoid centripetal accelaration, etc.
[1]: Art of Engineering, The Real Physics Of A Roller Coaster, published 2019-05-09.
