Двойная маятниковая анимация - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь получить анимированный двойной маятник.Хотя я могу получить анимацию для любой (одной) массы, я не могу получить ее для обеих.

restart; 
with(DEtools, odeadvisor); 
with(plots); 
with(plottools); 
Sys := [2*(diff(T1(t), t, t))+cos(T1(t)-T2(t))*(diff(T2(t), t, t))+sin(T1(t)-T2(t))*(diff(T2(t), t))^2+19.6*sin(T1(t)) = 0, diff(T2(t), t, t)+cos(T1(t)-T2(t))*(diff(T1(t), t, t))-sin(T1(t)-T2(t))*(diff(T1(t), t))+9.8*sin(T2(t)) = 0, T1(0) = 1, (D(T1))(0) = 0, T2(0) = 1, (D(T2))(0) = 1];
sol := dsolve(Sys, type = numeric, range = 0 .. 20, output = listprocedure);
odeplot(sol, [T1(t), T2(t)], 0 .. 20, refine = 1); 
TT1, TT2 := op(subs(sol, [T1(t), T2(t)])); 
f := proc (t) options operator, arrow; pointplot([cos(TT1(t)), sin(TT1(t))], color = blue, symbol = solidcircle, symbolsize = 25) end proc; 
p := proc (t) options operator, arrow; pointplot([cos(TT2(t)), sin(TT2(t))], color = red, symbol = solidcircle, symbolsize = 25) end proc;

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 29 января 2019

Вы не предоставили объяснения того, как ваши уравнения предназначены для моделирования физической системы, но это бесполезно.

Итак, я сделал некоторые предположения о ваших намерениях и вашей модели.Пожалуйста, не вините меня, если мои догадки не на высоте.

restart;
with(plots):

Sys := [2*(diff(T1(t), t, t))+cos(T1(t)-T2(t))*(diff(T2(t), t, t))
    +sin(T1(t)-T2(t))*(diff(T2(t), t))^2+19.6*sin(T1(t)) = 0,
    diff(T2(t), t, t)+cos(T1(t)-T2(t))*(diff(T1(t), t, t))
    -sin(T1(t)-T2(t))*(diff(T1(t), t))+9.8*sin(T2(t)) = 0,
    T1(0) = 1, (D(T1))(0) = 0, T2(0) = 1, (D(T2))(0) = 1]:

sol := dsolve(Sys, numeric, range = 0 .. 20, output = listprocedure):

TT1, TT2 := op(subs(sol, [T1(t), T2(t)])):

fp := t -> plots:-display(
          pointplot([sin(TT1(t))+sin(TT2(t)), -cos(TT1(t))-cos(TT2(t))],
                    color = red, symbol = solidcircle, symbolsize = 25),
          pointplot([sin(TT1(t)), -cos(TT1(t))],
                    color = blue, symbol = solidcircle, symbolsize = 25),
          plottools:-line([0,0],[sin(TT1(t)), -cos(TT1(t))]),
          plottools:-line([sin(TT1(t)), -cos(TT1(t))],
                          [sin(TT1(t))+sin(TT2(t)), -cos(TT1(t))-cos(TT2(t))]),
          scaling=constrained
       ):

animate(fp, [t], t=0..10, frames=200);

enter image description here

Я не знаю, является ли этот вид с накоплениемэто то, что вы ищете, как представление о положении "обеих" масс.Не совсем понятно, что вы подразумеваете под этим.

Но, возможно, ключевым моментом является то, что если двухэлементные списки, которые вы используете в своих вызовах pointplot, представляют (смещения) векторы, то вы можете получитьсоставной / совокупный эффект на вторую массу, добавляя эти два вектора поэлементно.Вот как красная точка получает свою позицию в моей анимации.Надеемся, что это позволит вам получить кумулятивный эффект с обеими массами, по вашему выбору представления.

...