Dodatek Świąteczny

Dynamiczny GIF

Mathematica pozwala bardzo łatwo tworzyć animowane obrazki w formacie gif.
Wystarczy stworzyć listę obiektów graficznych, które mają pełnić rolę ramek animowanej grafiki i zapisać tę listę w pliku o rozszerzeniu “.gif”.

?Export

Zastosujemy ten sposób, by zilustrować oscylacje kształtu jądra wokół kształtu sferycznego.

Wezmiemy pod uwagę tylko deformacje kwadupolowe, co prowadzi do oscylacji typu β i/lub γ.

Oscylacje beta

Najpierw przywołujemy narzędzia do rysowania zdeformowanych jąder z wykładu “Kształty jader”. Zmieniamy trochę formatowanie funkcji pplot3D : usuwamy osie, tworzymy czarne tło.

Y[l_,m_]:=SphericalHarmonicY[l,m,θ,φ]

pplot3D[r_] := ParametricPlot3D[{Cos[φ]Sin[θ]r,Sin[φ]Sin[θ]r,Cos[θ]r},
     {θ,0,Pi},{φ,0,2Pi},
Axes->False,
PlotPoints->25,
Boxed->False,
Mesh->Full,
Background->Black,
ImageSize->{300,300}]

Definiujemy funkcję, która rysuje jedną ramkę graficzną:

plotframe[b_,g_]:=Module[{a20,a22,r2},
a20=b Cos[g Degree];
a22=b Sin[g Degree]/Sqrt[2];
r2=1+a20*Y[2,0]+a22(Y[2,2]+Y[2,-2]);
pplot3D[r2]]

plotframe[-0.5,30]

Tworzymy listę ramek, które się złożą na animowany obrazek. Parametr γ ustalamy na 0 (kształt osiowy), a parametr β oscyluje wokół 0 z amplitudą 0.6.

frames1=ParallelTable[
plotframe[0.6*Sin[2*Pi*t],0],{t,0,1,0.04}
];

Length[frames1]

frames1[[1]]

Wybieramy folder dyskowy do zapisania pliku:

SetDirectory["D:/Pfutzner/Teach/Mathematica4Nuclear/Dodatki"]

Directory[]

Exportujemy listę ramki do pliku .gif - automatycznie zostanie utworzony animowany gif.

(* Export["Beta_osc.gif",frames1] *)

Import["Beta_osc.gif","Animation"]

Oscylacje gamma

Powtarzamy te samą operację, tylko animujemy parametr γ, podczas gdy β jest stałe i równe 0.6:

frames2=ParallelTable[
plotframe[0.6,30*(1+Sin[2*Pi*t])],{t,0,1,0.04}
];

frames2[[1]]

(* Export["Gamma_osc.gif",frames2] *)

Import["Gamma_osc.gif","Animation"]

Oscylacje beta-gamma

Na koniec zmieniamy i β i γ jednocześnie. Dodatkowo wprowadzamy różnicę fazy między oscylacją β a oascylacją γ, która w dodatku też zależy od czasu. Powstaje animacja stosowna do prywatki sylwestrowej - pozostaje tylko dobrać odpowiednie tło muzyczne :-)

frames3=ParallelTable[
plotframe[0.6*Sin[2*Pi*t+Pi*t],30*(1+Sin[2*Pi*t])],{t,0,1,0.04}
];

frames3[[6]]

(* Export["BetaGamma_osc.gif",frames3] *)

Import["BetaGamma_Sylwester.gif","Animation"]

Choinka matematyczna

Inspirację do tego wykładu znalazlem poszukując w sieci choinek “matematycznych”. Na stronach “Wolfram Community” Vitalij Kaurov zaproponował choinkę zbudowaną na funkcji t * sin(t) .

PD=.5;s[t_,f_]:=t^.6-f;
dt[cl_,ps_,sg_,hf_,dp_,f_]:={PointSize[ps],Hue[cl,1,.6+sg .4 Sin[hf s[t,f]]],Point[{-sg s[t,f] Sin[s[t,f]],-sg s[t,f] Cos[s[t,f]],dp+s[t,f]}]};
frames4=ParallelTable[Graphics3D[Table[{dt[1,.01,-1,1,0,f],dt[.45,.01,1,1,0,f],dt[1,.005,-1,4,.2,f],dt[.45,.005,1,4,.2,f]},{t,0,200,PD}],ViewPoint->Left,BoxRatios->{1,1,1.3},ViewVertical->{0,0,-1},ViewCenter->{{0.5,0.5,0.5},{0.5,0.55}},Boxed->False,PlotRange->{{-20,20},{-20,20},{0,20}},Background->Black],{f,0,1,.01}];

Length[frames4]

frames4[[1]]

Uwaga! Zapis tych 100 ramek do pliku .gif trwa bardzo długo!

(* Export["tree.gif",frames4] *)

Ładniejsza choinka

W odpowiedzi Silvia Hao rozbudowała ten pomysł i powstało drzewko jeszcze bardziej efektowne.

PD=.5;
s[t_,f_]:=t^.6-f
dt[cl_,ps_,sg_,hf_,dp_,f_,flag_]:=Module[{sv,basePt},{PointSize[ps],sv=s[t,f];
Hue[cl (1+Sin[.02 t])/2,1,.3+sg .3 Sin[hf sv]],basePt={-sg s[t,f] Sin[sv],-sg s[t,f] Cos[sv],dp+sv};
Point[basePt],If[flag,{Hue[cl (1+Sin[.1 t])/2,1,.6+sg .4 Sin[hf sv]],PointSize[RandomReal[.01]],Point[basePt+1/2 RotationTransform[20 sv,{-Cos[sv],Sin[sv],0}][{Sin[sv],Cos[sv],0}]]},{}]}];
frames5=ParallelTable[Graphics3D[Table[{dt[1,.01,-1,1,0,f,True],dt[.45,.01,1,1,0,f,True],dt[1,.005,-1,4,.2,f,False],dt[.45,.005,1,4,.2,f,False]},{t,0,200,PD}],ViewPoint->Left,BoxRatios->{1,1,1.3},ViewVertical->{0,0,-1},ViewCenter->{{0.5,0.5,0.5},{0.5,0.55}},Boxed->False,PlotRange->{{-20,20},{-20,20},{0,20}},Background->Black],{f,0,1,.01}];

frames5[[2]]

Uwaga! Zapis 100 ramek do pliku .gif trwa bardzo długo!

(* Export["tree2.gif",frames5] *)