TL;DR: relación de la Masa = 14 no es particularmente especial, pero está en una región especial de la misa ratios (11 a 14) que tiene propiedades óptimas para enrollar la cuerda alrededor de los dedos tanto como sea posible.
Si quieres saber por qué leer la respuesta. Si sólo desea buscar en un bonito gif salida (sombrero de punta a @Ruslan para la idea de animación):
Código para las animaciones, si desea ejecutar el mismo o adaptar las ecuaciones de movimiento para algo de fantasía (como la inclusión de fricción):
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib import cm
import numpy as np
# integrator for ordinary differential equations
from scipy.integrate import ode
def eoms_pendulum(t, y, params):
"""
Equations of motion for the simple model.
I was too dumb to do the geometry elegantly, so there are case distinctions...
"""
# unpack #
v1_x, v1_y, v2, x1, y1, y2 = y
m1, m2, g, truncate_at_inversion = params
if x1<=0 and y1<=0:
# calc helpers #
F1_g = m1*g
F2_g = m2*g # _g for "gravity"
L_swing = np.sqrt( x1**2 + y1**2 ) # distance of mass 1 to the pendulum pivot
Theta = np.arctan(y1/x1) # angle
dt_Theta = ( v1_y/x1 - v1_x*y1/x1**2)/(1. + y1**2/x1**2) # derivative of arctan
help_term = -F2_g/m2 - F1_g/m1 * np.sin(Theta) - v1_x*np.sin(Theta)*dt_Theta + v1_y*np.cos(Theta)*dt_Theta
F_r = help_term / ( -1./m1 - 1./m2 ) # _r for "rope", this formula comes from requiring a constant length rope
# calc derivatives
dt_v1_x = ( F_r*np.cos(Theta) ) / m1
dt_v1_y = ( -F1_g + F_r*np.sin(Theta) ) / m1
dt_v2 = ( F_r - F2_g ) / m2
dt_x1 = v1_x
dt_y1 = v1_y
dt_y2 = v2
elif x1>=0 and y1<=0:
# calc helpers #
F1_g = m1*g
F2_g = m2*g
L_swing = np.sqrt( x1**2 + y1**2 )
Theta = np.arctan(-x1/y1)
dt_Theta = -( v1_x/y1 - v1_y*x1/y1**2)/(1. + x1**2/y1**2)
help_term = -F2_g/m2 - F1_g/m1 * np.cos(Theta) - v1_x*np.cos(Theta)*dt_Theta - v1_y*np.sin(Theta)*dt_Theta
F_r = help_term / ( -1./m1 - 1./m2 )
# calc derivatives
dt_v1_x = ( -F_r*np.sin(Theta) ) / m1
dt_v1_y = ( -F1_g + F_r*np.cos(Theta) ) / m1
dt_v2 = ( F_r - F2_g ) / m2
dt_x1 = v1_x
dt_y1 = v1_y
dt_y2 = v2
elif x1>=0 and y1>=0:
# calc helpers #
F1_g = m1*g
F2_g = m2*g
L_swing = np.sqrt( x1**2 + y1**2 )
Theta = np.arctan(y1/x1)
dt_Theta = ( v1_y/x1 - v1_x*y1/x1**2)/(1. + y1**2/x1**2)
help_term = -F2_g/m2 + F1_g/m1 * np.sin(Theta) + v1_x*np.sin(Theta)*dt_Theta - v1_y*np.cos(Theta)*dt_Theta
F_r = help_term / ( -1./m1 - 1./m2 )
# calc derivatives
dt_v1_x = ( -F_r*np.cos(Theta) ) / m1
dt_v1_y = ( -F1_g - F_r*np.sin(Theta) ) / m1
dt_v2 = ( F_r - F2_g ) / m2
dt_x1 = v1_x
dt_y1 = v1_y
dt_y2 = v2
elif x1<=0 and y1>=0:
# calc helpers #
F1_g = m1*g
F2_g = m2*g
L_swing = np.sqrt( x1**2 + y1**2 )
Theta = np.arctan(-y1/x1)
dt_Theta = -( v1_y/x1 - v1_x*y1/x1**2)/(1. + y1**2/x1**2)
help_term = -F2_g/m2 + F1_g/m1 * np.sin(Theta) - v1_x*np.sin(Theta)*dt_Theta - v1_y*np.cos(Theta)*dt_Theta
F_r = help_term / ( -1./m1 - 1./m2 )
# calc derivatives
dt_v1_x = ( F_r*np.cos(Theta) ) / m1
dt_v1_y = ( -F1_g - F_r*np.sin(Theta) ) / m1
dt_v2 = ( F_r - F2_g ) / m2
dt_x1 = v1_x
dt_y1 = v1_y
dt_y2 = v2
if truncate_at_inversion:
if dt_y2 > 0.:
return np.zeros_like(y)
return [dt_v1_x, dt_v1_y, dt_v2, dt_x1, dt_y1, dt_y2]
def total_winding_angle(times, trajectory):
"""
Calculates the total winding angle for a given trajectory
"""
dt = times[1] - times[0]
v1_x, v1_y, v2, x1, y1, y2 = [trajectory[:, i] for i in range(6)]
dt_theta = ( x1*v1_y - y1*v1_x ) / np.sqrt(x1**2 + y1**2) # from cross-product
theta_tot = np.cumsum(dt_theta) * dt
return theta_tot
################################################################################
### setup ###
################################################################################
trajectories = []
m1 = 1
m2_list = np.arange(2, 20, 2)[0:9]
ntimes = 150
for m2 in m2_list:
# params #
params = [
m1, # m1
m2, # m2
9.81, # g
False # If true, truncates the motion when m2 moves back upwards
]
# initial conditions #
Lrope = 1.0 # Length of the rope, initially positioned such that m1 is L from the pivot
init_cond = [
0.0, # v1_x
0., # v1_y
0., # v2
-Lrope/2, # x1
0.0, # y1
-Lrope/2, # y2
]
# integration time range #
times = np.linspace(0, 1.0, ntimes)
# trajectory array to store result #
trajectory = np.empty((len(times), len(init_cond)), dtype=np.float64)
# helper #
show_prog = True
# check eoms at starting position #
#print(eoms_pendulum(0, init_cond, params))
################################################################################
### numerical integration ###
################################################################################
r = ode(eoms_pendulum).set_integrator('zvode', method='adams',
with_jacobian=False) # integrator and eoms
r.set_initial_value(init_cond, times[0]).set_f_params(params) # setup
dt = times[1] - times[0] # time step
# integration (loop time step)
for i, t_i in enumerate(times):
trajectory[i,:] = r.integrate(r.t+dt) # integration
trajectories.append(trajectory)
# ### extract ###
# x1 = trajectory[:, 3]
# y1 = trajectory[:, 4]
# x2 = np.zeros_like(trajectory[:, 5])
# y2 = trajectory[:, 5]
# L = np.sqrt(x1**2 + y1**2) # rope part connecting m1 and pivot
# Ltot = -y2 + L # total rope length
################################################################################
### Visualize trajectory ###
################################################################################
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.animation import FuncAnimation
plt.style.use('seaborn-pastel')
n=3
m=3
axes = []
m1_ropes = []
m2_ropes = []
m1_markers = []
m2_markers = []
fig = plt.figure(figsize=(10,10))
for sp, m2_ in enumerate(m2_list):
ax = fig.add_subplot(n, m, sp+1, xlim=(-0.75, 0.75), ylim=(-1, 0.5), xticks=[], yticks=[])
m1_rope, = ax.plot([], [], lw=1, color='k')
m2_rope, = ax.plot([], [], lw=1, color='k')
m1_marker, = ax.plot([], [], marker='o', markersize=10, color='r', label=r'
Argumento principal
Liquidación ángulo de comportamiento en el no hay fricción, delgada pivote caso
Mi respuesta se basa en un modelo simple para el sistema(no fricition, infinitamente delgadas de pivote, ideal cuerda, véase también la descripción detallada más abajo), a partir de la cual uno puede conseguir realmente algo muy bonito visión sobre el por qué de la región alrededor de 14 es especial.
Como una cantidad de interés, se define un bobinado de ángulo como una función del tiempo $\theta(t)$. En ella se indica, que el total de ángulo de la pequeña masa ha viajado alrededor del dedo. $\theta(t)=2\pi$ corresponde a una revolución completa, $\theta(t)=4\pi$ corresponde a dos revoluciones, y así sucesivamente.
Entonces, uno puede trazar el devanado de ángulo como una función del tiempo y la relación de la masa para el modelo simple:
El eje de color muestra el devanado de ángulo. Podemos ver claramente que entre la relación de la masa del 12-14, la liquidación ángulo que sube de forma continua en el tiempo y alcanza un máximo alto. La primera maxima en el tiempo para cada relación de la masa son indicados por el magenta cruces. También tenga en cuenta que el extraño discontinuidades son lugares donde la oscilación de la masa pasa a través de cero/golpea el dedo, donde el devanado ángulo no está bien definida.
Para ver el comportamiento en un poco más de detalle, veamos algunos trozos de los gráficos 2D (2$\pi$ pasos/revoluciones completas marcado como líneas horizontales):
Vemos que la masa ratios 12, 13, 14 se comportan de manera muy similar. 16 tiene un punto de inflexión después de 4 revoluciones, pero me sería de esperar que esto todavía funciona en la práctica, ya que cuando la cuerda está envuelto 4 veces alrededor de los dedos, debe haber suficiente fricción para un clip.
Para la relación de la masa del 5, por otro lado, no tenemos ni siquiera llega a 2 revoluciones y la cuerda probablemente deslizamiento.
Si desea reproducir estas parcelas, aquí está mi código. Siéntase libre de hacer las adaptaciones y publicarlos como una respuesta. Sería interesante, por ejemplo, si uno puede incluir la fricción de una manera sencilla para cuantificar el efecto de recorte en la final. Me imagino que esto va a ser difícil, sin embargo, y se necesita al menos un parámetro adicional.
$m_1 = {}$
Detalles
El modelo simple
El sencillo modelo utilizado anteriormente y (probablemente) la forma más sencilla para modelar el sistema es asumir:
- Ideal infinitamente delgada cuerda.
- Una infinitamente delgada de pivote de la cuerda se envuelve alrededor (el dedo en el video).
- No hay fricción.
Sobre todo el no hay fricción suposición es claramente deficiente, porque el efecto de detener completamente basa en la fricción. Pero como hemos visto más arriba todavía se puede obtener una idea de la inicial de la dinámica de todos modos y, a continuación, pensar acerca de lo que la fricción va a hacer para cambiar esto. Si alguien se siente motivado te reto a incluir la fricción en el modelo y cambiar mi código!
Bajo estos supuestos, uno puede establecer un sistema de ecuaciones diferenciales acopladas mediante las leyes de Newton, que puede ser fácilmente resuelto numéricamente. No voy a entrar en detalle sobre la geometría y la derivación, voy a darle un poco de código a continuación para que la gente de verificación y jugar con ellos. Descargo de responsabilidad: no estoy seguro de mi ecuaciones de movimiento son completamente a la derecha. Hice algunas comprobaciones y parece razonable, pero siéntase libre de llenar su propia versión y publicar una respuesta.
La geometría
La geometría se asume como este:
En la imagen, podemos obtener las ecuaciones de movimiento de la siguiente manera:
$$
m_1 \dot{v}_{x,1} = F_\mathrm{cuerda} \cos(\theta) \,,
\\
m_1 \dot{v}_{y,1} = -F_{g,1} + F_\mathrm{cuerda} \sin(\theta) \,,
\\
m_2 \dot{v}_{y,2} = -F_{g,2} + F_\mathrm{cuerda} \,,
\\
\dot{x}_1 = v_{x,1} \,,
\\
\dot{y}_1 = v_{y,1} \,,
\\
\dot{y}_2 = v_{y,2} \,.
$$
This is just Newton's laws for the geometry wirtten as a set of first order coupled differential equations, which can easily be solved in scipy (see code).
The hard bit is to find the rope force $F_\textrm{cuerda}$. It is constraint by the ideal rope condition, that the total rope length does not change in time. Following this through I got
$$
F_\textrm{cuerda} = \frac{\frac{F_{g,2}}{m_2} + \frac{F_{g,1}}{m_1}\sin(\theta) + v_{x,1}\sin(\theta)\dot{\theta} - v_{y,1}\cos(\theta)\dot{\theta}}{\frac{1}{m_1} + \frac{1}{m_2}} \,.
$$
Note that my way of writing the solution is not particularly elegant and as a result some of these formulas only apply in the lower left quadrant ($x_1<0$, $y_1<0$). The other quadrants are implemented in the code too.
As the initial position, we will consider $x_1 = -L/2$, $y_1 = -L/2$, similarly to the video. $y_1$ does not matter too much, it simply causes an overall displacement of mass 2. We set $L=1$ and $g=9.81$. Someone else can work out the units ;-)
Let's do it in python
I already gave some code snippets above. You need numpy and matplotlib to run it. Maybe python3 would be good. If you want to plot static trajectories you can used:
'.format(m1))
m2_marker, = ax.plot([], [], marker='o', markersize=10, color='b', label=r'
The dynamics for 1/14 mass ration
Here is what the dynamics of the pendulum look like for a mass ratio of 14 ($m_1 = 1$, $m_2=14$):
El panel de la izquierda muestra las trayectorias de las dos masas en el plano x-y, con el tiempo se indica por el color del eje. Se supone que esta es una vista frontal del rendimiento de vídeo. Vemos que la masa 1 se envuelve alrededor del pivote (en x=0, y=0) varias veces (véase la liquidación ángulo de la imagen de arriba). Después de un par de revoluciones, el modelo no es probablemente representante más. En su lugar, la fricción iba a empezar a patear en y el clip de la cuerda. En nuestra imagen simplificada, la partícula sigue adelante. Lo que es interesante es que, incluso sin fricción, la menor partícula se detiene en algún momento e incluso vuelve a subir, provocando estable oscilación!!
¿Qué cambia con la relación de la masa?
Ya vimos lo que cambia con la relación de la masa de la liquidación ángulo de la imagen. Sólo para visual intuiution, aquí está la imagen correspondiente para 1/5 relación de la masa:
Para una mayor relación de la masa (1/20):