Программа анимации движений

Видеофрагмент 4. Параметризованная анимация движений диска

В видеофрагменте 4 демонстрируются возможности программы, создающей параметризованную анимацию движений диска. Меняя указателем мыши начальные условия движения, можно наблюдать различные движения диска, полученные по результатам численного интегрирования уравнений динамики. Опция Bookmarks позволяет выбирать весь набор параметров, определяющих какое-либо движение диска, например, одно из стационарных или физически нереализуемых.Текст программы анимации приведён ниже. Различные движения диска заданы в форме закладок.

Определим функцию DiskOnThePlane, строящую изображение плоскости, диска, траектории точки контакта, графика нормальной реакции плоскости в точке контакта по начальным условиям движения: θ0, ωψ0, ωθ0, ωφ0 - начальному углу нутации и начальным угловым скоростям прецессии, нутации и собственного вращения соответственно. Будем считать начальные значения координат центра масс x0, y0, угла прецессии ψ0 и угла собственного вращения φ0 диска равными нулю. Выполнения этих условий можно добиться надлежащим выбором систем координат.

Определение функции DiskOnThePlane

DiskOnThePlane[ НачальныйУголНутации : θ0_ , НачальныеУгловыеСкорости : { ωψ0_ , ωθ0_ , ωφ0_ } ,

РазмерОбластиРисунка : d_ , МаксимальноеВремяИнтегрирования : tf_ ] :=

With [ { m = .8 , ρ = .3 , g = 9.8 },

(* Определение диска и плоскости в виде графических объектов *)

disk = { EdgeForm [ Thin ] , { Cylinder [ { { 0 , 0 , 0 } , { 0 , 0 , .015 ρ } } , ρ ] } , Thin , Table [ Line [ { { .5 ρ Cos [ n Pi / 4 ] , .5 ρ Sin [ n Pi / 4 ] , z } , { ρ Cos [ n Pi / 4 ] , ρ Sin [ n Pi / 4 ] , z } } ] , { n , 0 , 8 } , { z , { 0 , .015 ρ } } ] } ;

Plane = {Line[{{{-d, 0, 0}, {d, 0, 0}}, {{0, -1.1 d, 0}, {0, 1.2 d, 0}}, {{0, 0, 0}, {0, 0, 1}}}],

Polygon[{{-d, 1.2 d, 0}, {-d, -1.1 d, 0}, {d, -1.1 d, 0}, {d, 1.2 d, 0}}]};

(* Определение системы уравнений, содержащей уравнения связи (4), уравнения динамики (10), начальные условия движения *)

eqns = { x'[ t ] == ρ ( Sin [ θ [ t ] ] Sin [ ψ [ t ] ] θ' [ t ] - Cos [ ψ [ t ] ]

φ' [ t ] - Cos [ θ [ t ] ] Cos [ ψ [ t ] ] ψ' [ t ] ) ,

y'[ t ] == - ρ ( Cos [ ψ [ t ] ] Sin [ θ [ t ] ] θ'[ t ] + Sin [ ψ [ t ] ] φ'[ t ] + Cos [ θ [ t ] ] Sin [ ψ [ t ] ] ψ' [ t ] ) ,

12 Cos [ θ [ t ] ] φ''[ t ]+ ( 5 Cos [ 2 θ [ t ] ] + 7) ψ'' [ t ] - 4 Sin [ θ [ t ] ] θ'[ t ] ( φ'[ t ] + 5 Cos [ θ [ t ] ] ψ'[ t ] ) == 0 ,

θ'' [ t ] + Cos [ θ [ t ] ] Sin [ θ [ t ] ] ψ'[ t ] ^ 2 + 6/5 Sin [ θ [ t ] ] φ' [ t ] ψ' [ t ] + 4/5 g/ ρ Cos [ θ [ t ] ] == 0 ,

3 ( φ''[ t ] + Cos [ θ [ t ] ] ψ'' [ t ] ) - 5 Sin [ θ [ t ] ] θ' [ t ] ψ' [ t ] == 0 ,

x [ 0 ] == 0 , y [ 0 ] == 0 , ψ [ 0 ] == 0 , θ [ 0 ] == θ0 , φ [ 0 ] == 0 ,

ψ'[ 0 ] == ωψ0 , θ'[ 0 ] == ωθ0 , φ' [ 0 ] == ωφ0 } ;

(* Численное интегрирование уравнений (4,10) на интервале времени [ 0 , tf ] *)

soln = Quiet [ NDSolve [ eqns , { x , y , ψ , θ , φ } , { t , 0 , tf } , MaxSteps->100000,

StoppingTest :> (Evaluate[Abs[ θ[t]]] > Pi - 10^-4 || Evaluate[θ[t]] < 10^-4) ]];

(* Определение момента прекращения интегрирования *)

te = soln 〚 1 , 1 , 2 , 1 , 1 , 2 〛 ;

(* Определение в момент времени te радиус - вектора центра масс диска по результатам интегрирования *)

posс = { x [ t ] , y [ t ] , ρ Sin [ θ [ t ] ] } /. t -> te /. soln 〚 1 〛 ;

(* Построение траектории точки контакта диска на интервале времени [ 0. , te ] *)

ContactPointTrajectory = ParametricPlot3D [ { x [ t ] + ρ Cos [ θ [ t ] ] Sin [ ψ [ t ] ] , y [ t ] - ρ Cos [ θ [ t ] ] Cos [ ψ [ t ] ] , 0 } /. soln 〚 1 〛 , { t , 0 , te } , MaxRecursion -> 8 ] ;

(* Построение графика нормальной реакции плоскости в точке контакта диска и плоскости на интервале времени [ 0. , te ] *)

NormalReaction = Plot [ m ( ρ Cos [ θ [ t ] ] θ'' [ t ] - ρ Sin [ θ [ t ] ] θ' [ t ] ^2 + g ) /. soln 〚 1 〛 , { t , 0. , te } ,

PlotRange -> { { 0. , te } , { -5 , 30 } } , AxesLabel -> {" t (s) " , "Rn (N)" } ] ;

(* Построение в момент времени te изображения плоскости , диска , а также траектории точки контакта и графика нормальной реакции плоскости в точке контакта на интервале времени [ 0. , te ] *)

Labeled [ Show [ Graphics3D [ { Plane , Translate [ Fold [ Rotate [ #1 , #2 〚1 〛 , #2 〚 2 〛 ] & , # , { { φ [ t ] , { 0 , 0 , 1 } } , { θ [ t ] , { 1 , 0 , 0 } } ,

{ ψ [ t ] , { 0 , 0 , 1 } } } ] , posс ] & /@ disk /. t -> te /. soln 〚 1 〛 } ] , ContactPointTrajectory , PlotRange -> { { - d , d } , { - 1.5 d , 1.2 d } , {0 , 2 ρ } } , ImageSize-> { 600 , 500 } , Boxed -> False ] ,

{ Show [ NormalReaction , ImageSize -> { 300 , 170 } ] } , { Right , Top } ] ]

Чтобы создать анимацию движения диска, параметризованную по начальным условиям θ0, ωψ0, ωθ0, ωφ0 и другим параметрам, следует обратиться к функции Manipulate.

Программа создания параметризованной анимации

Manipulate [ DiskOnThePlane [ θ0 , { ωψ0 , ωθ0 , ωφ0 } , d , tf ] ,

{ { tf , 0.001 , " Анимация" } , 0.001 , time , 0.0001 , ControlType-> Trigger , AnimationRate -> ar } ,

{ { ar , 0.17 , "Частота анимации ( с - 1 ) "}, 0.01, 5, 0.01, Appearance ->"Labeled"},

{ { time , 25 , "Длительность анимации ( с )" } , 1 , 70 , 1 , Appearance ->"Labeled"} ,

{ { θ0 , 1.918 , "Начальный угол нутации θ0 ( рад ) " } , 0.1 , Pi , Appearance -> "Labeled"} ,

{ { ωψ0 , 2.569 , "Начальная угловая скорость прецессии ωψ0 ( с - 1 ) "}, -20, 130, Appearance -> "Labeled"},

{ { ωθ0 , 3.0743 , "Начальная угловая скорость нутации ωθ0 ( с - 1 ) "},-5, 5, Appearance -> "Labeled"},

{ { ωφ0 , 0.1229 , "Начальная угловая скорость собственного вращения ωφ0( с - 1 ) "},-10,10, Appearance -> "Labeled" } ,

{ { d , 1.5 , "Размер области рисунка d (м) " } , 0.1 , 100 , Appearance-> "Labeled"} ,

ControlPlacement->Top , SaveDefinitions-> True , AutorunSequencing -> { 2 , 6 } ,

Bookmarks ->

{ " качение по прямой":> { ar = 0.17 , d = 1.5 , tf = 0.001 , time = 70 , θ0 = π / 2 , ωθ0 = 0 , ωψ0 = 0 , ωφ0 = 2 } ,

"устойчивое качение по окружности":> { ar = 0.3 , d = 1.7 , tf = 0.001 , time = 50 , θ0 = 1.3 , ωθ0 = 0 , ωψ0 = - 1.42009 , ωφ0 = 4.5739 } ,

"возмущённое устойчивое качение по окружности":> { ar = 0.3 , d = 1.8 , tf = 0.001 , time = 50 , θ0 = 1.3 , ωθ0 = .3 , ωψ0 = - 1.42009 , ωφ0 = 4.5739 },

"неустойчивое качение по окружности":> { ar = 0.3 , d = 1 , tf = 0.001 , time = 50 , θ0 = 1.3 , ωθ0 = 0 , ωψ0 = - 3.5437798 , ωφ0 = 2.4960103 },

"возмущённое неустойчивое качение по окружности":> { ar = 0.3 ,

d = 1.7 , tf = 0.001 , time = 25 , θ0 = 1.3 , ωθ0 = 0.3 , ωψ0 = - 3.5437798 , ωφ0 = 2.4960103 } ,

"верчение":> { ar = 0.25 , d = .5 , tf = 0.001 , time = 50 , θ0 = π / 2 , ωθ0 = 0 , ωψ0 = 5 , ωφ0 = 0 } ,

"нереализуемое движение 1":> { ar = 0.2 , d = 1.1 , tf = .001 , time = 8 , θ0 = 1.8636 , ωθ0 = 0.368231 , ωψ0 = 5.99433 , ωφ0 = 5.13811 } ,

"нереализуемое движение 2":> { ar = 0.12 , d = 1.1 , tf = .001 , time = 8 , θ0 = 1.506 , ωθ0 = 0.95 , ωψ0 = 5.99433 , ωφ0 = 5.13811 } ,

"падение 1" :> {ar = 0.09`, d = 1.1, tf = 0.001, time = 8, θ0 = Pi/3, ωθ0 = 4.376492656621857 , ωψ0 = 0.9099569926205975, ωφ0 = 0.35700518381037005 },

"падение 2" :> {ar = 0.09, d = 1.1, tf = 0.001, time = 8, θ0 = 2 Pi/3, ωθ0 = 1 , ωψ0 = 0, ωφ0 = 0 }} ]