La celda de abajo permite variar la relación M/m = η entre las masas sin interrumpir la simulación. La condición inicial se actualiza cada vez que se cambia el valor de η , de modo que la trayectoria es continua, pero en general  no corresponderá a la misma condición en t= 0 para distintos valores de η.

Para ejecutar, situarse sobre cualquier punto de la celda y apretar shift+enter o el enter del teclado numérico.

DynamicModule[{L = 2, tmax = 200, radio = 1,  theta = π/2, radioprima = 0, thetaprima = 0, ηinicio = 3, cero = 0,   run, x, y,  lastη, soln, r, θ, trayectoria, tru = False, reset=True},

Manipulate[

If[η ≠ lastη ||  reset , soln = Flatten[NDSolve[{r''[t] == ((1/η)/(1+1/η)) r[t] ((θ'[t])^2)+  (((1/η)/(1+1/η)) Cos[θ[t]]-(1/(1+1/η))),r[t] θ''[t] + 2 r'[t]θ'[t] == -   Sin[θ[t]], r[run -cero] == radio, r'[run -cero] == radioprima, θ[run -cero] ==  theta, θ'[run -cero] == thetaprima} , {r, θ}, {t, 0, tmax}, MaxSteps->100000]];

trayectoria = ParametricPlot[{ (radio =r[t]/.soln) Sin[(theta = θ[t]/.soln)], -radio  Cos[theta]}, {t, 0, tmax},PlotPoints-> 200, PerformanceGoal-> "Quality", PlotStyle-> Opacity[0.5]];
lastη = η;
reset = False; ];

If[tr ==  True  && tru ≠ tr, trayectoria = ParametricPlot[{ (radio =r[t]/.soln) Sin[(theta = θ[t]/.soln)], -radio  Cos[theta]}, {t, 0, tmax},PlotPoints-> 200, PerformanceGoal-> "Quality", PlotStyle-> Opacity[0.5]]; tru = True];

theta=θ[run -cero]/.soln;
radio = r[run -cero] /. soln;
thetaprima=θ'[run -cero]/.soln;
radioprima = r'[run -cero] /. soln;
x = radio Sin[theta];
y = -radio Cos[theta];
Switch[setη, 1, η = 1.66500000;  radio = 1;  theta = π/2; radioprima = 0; thetaprima = 0;  cero = 0; reset = True, 
2, η = 1.55500000; radio = 1;  theta = π/2; radioprima = 0; thetaprima = 0;  cero = 0; reset = True,
3,  η = 4.17700000; radio = 1;  theta = π/2; radioprima = 0; thetaprima = 0;  cero = 0; reset = True,
 4, η = 7.71000000 ; radio = 1;  theta = π/2; radioprima = 0; thetaprima = 0;  cero = 0; reset = True];
setη = Null;

If[run == tmax, cero = 0; Abort[]];


Show[ Graphics[{If[tr, trayectoria[[1]], {}], {Line[{{0,0}, {0,-L+radio}}], {Gray,Disk[{0, -L+radio}, 1/12]}, Line[{{0,0}, {x,y}}], {Orange,Disk[{x, y}, 1/(12(Sqrt[η]))+(1/50)]}}}], PlotRange-> {{-1.2, 1.2}, {-2.2, 1.5}}, ImageSize-> 300],

Style["% Animación", Bold],
Dynamic[N[100 run/tmax]],
{{run,0, ""},0,tmax, ControlType->Trigger,   AnimationRate-> 1, AppearanceElements->{"PlayPauseButton","FasterSlowerButtons"}},
Style["Al llegar a 100% se detiene"],

Delimiter,
{{η,ηinicio,"η = M/m"},1.1,100,(10^(-paso)), Appearance->"Open", AppearanceElements->{"InputField", "StepLeftButton", "StepRightButton"}},
Style["Algunos valores interesantes de η", FontSize-> 10],
{{setη,Null, ""},{ 1-> "1.665", 2->"1.555", 3-> "4.177", 4-> "7.710"},ControlType->Setter, Enabled-> True},


Delimiter,
{{paso, 1, "Δη =  ± (10^(-x))" }, 0, 10, 1, Appearance -> "Open",  AppearanceElements->{"InputField", "StepLeftButton", "StepRightButton"}},
Style["Δη controla la presición en el ajuste de η"],

Delimiter,
{{tr, False, Style["Mostrar trayectoria", Bold]}, {True, False}},

Delimiter,
Style["Resetear a la condición inicial por defecto",Bold],
Button[Graphics[{Line[{{0,0}, {0,-L+1}}], {Gray,Disk[{0, -L+1}, 1/12]}, Line[{{0,0}, {1,0}}], {Orange,Disk[{1, 0},  1/(12(Sqrt[η]))+(1/50)]}}], 
cero = run;
radio = 1;
theta = π/2;
radioprima = 0;
thetaprima = 0;
reset = True,
ImageSize->75],

 SynchronousUpdating->False, ControlPlacement->Left, SaveDefinitions-> False]]

El sistema:

El lagrangiano:

L= (1/2)(m + M) ((OverDot[r])^2)+ (1/2)m (r^2)((OverDot[θ])^2)+ g r (m Cos[θ] - M)

En lugar de la variable t es útil cambiar a una variable adimensional τ= (Sqrt[g/(Subscript[r, 0])])t, donde (Subscript[r, 0]) es el radio inicial. Si además se escribe m = ϵ M, queda

L =M g (Subscript[r, 0]) [(1/2)(1 + ϵ) ((OverDot[x])^2)+ (1/2)ϵ (x^2)((OverDot[θ])^2)+  x (ϵ Cos[θ] - 1)],

donde x = r/(Subscript[r, 0]), y las derivadas están tomadas respecto de τ, no de t. La ventaja de escribir el lagrangiano de ese modo es que 'universaliza' el problema. Las condiciones iniciales serán siempre x(0) = 1,  θ(0) = (π/2),  (OverDot[x])(0) = (OverDot[θ])(0) = 0.  Cada problema en particular se recupera rescaleando la variable temporal. 

Multiplicar el lagrangiano por una constante tampoco afecta las ecuaciones de movimiento, de manera que podemos concentrarnos en estudiar el siguiente lagrangiano 

L =(1/2)(1 + ϵ) ((OverDot[x])^2)+ (1/2)ϵ (x^2)((OverDot[θ])^2)+  x (ϵ Cos[θ] - 1).

Las ecuaciones de movimiento son 

(1 + ϵ)  (Overscript[x, ..]) = ϵ x ((OverDot[θ])^2) + ϵ Cos[θ] - 1,
x(Overscript[θ, ..]) + 2  (OverDot[x]) (OverDot[θ]) = -Sin[θ].