ポアンカレセクション
NDSolveをWhenEventと一緒に使ってポアンカレセクションを計算する.
周期的に動かされる平面の例では,ポワンカレセクションは定期的な時間間隔でサンプルして得ることができる.サンプリングは,NDSolveへの呼出しの周りに,囲まれたReapを持つSowのアクションと一緒に,WhenEventを使って行うことができる.
data = Block[{δ = 0.15, γ = 0.3}, Reap[NDSolve[{x''[t] + δ x'[t] - x[t] + x[t] ^ 3 == γ Cos[ t], x[0] == 0, x'[0] == 0, WhenEvent[Mod[t, 2π] == 0, Sow[{x[t], x'[t]}]]}, {}, {t, 0, 100000}, MaxSteps -> ∞]]][[-1, 1]];ListPlotを使って,これらのパラメータ値のストレンジアトラクタを可視化することができる:
ListPlot[data, ImageSize -> Medium, PlotRange -> {{-1.5, 1.5}, All}, PlotStyle -> PointSize[0.0025]]より高次の系については,ポアンカレセクションは事実上位相空間でのスライス上でサンプルを取る.これは通常解に依存する事象を必要とする.この例として,三次元オイラー方程式の層流のカオスをモデル化するのに使われるArnold–Beltrami–Childress (ABC)フローがある:
abc = {Derivative[1][x][t] == (3/4) Cos[y[t]] + Sin[z[t]], Derivative[1][y][t] == Cos[z[t]] + Sin[x[t]], Derivative[1][z][t] == Cos[x[t]] + (3/4) Sin[y[t]]};psect[{x0_, y0_, z0_}] := Reap[NDSolve[{abc, x[0] == x0, y[0] == y0, z[0] == z0, WhenEvent[y[t] == 0, Sow[{x[t], z[t]}]]}, {}, {t, 0, 1000}, MaxSteps -> ∞]][[-1, 1]]abcdata = Mod[Map[psect, {{4.267682454609692, 0, 0.9952906114885919}, {1.6790790859443243, 0, 2.1257099470901704}, {2.9189523719753327, 0, 4.939152797323216}, {3.1528896559036776, 0, 4.926744120488727}, {0.9829282640373566, 0, 1.7074633238173198}, {0.4090394012299985, 0, 4.170087631574883}, {6.090600411133905, 0, 2.3736566160602277}, {6.261716134007686, 0, 1.4987884558838156}, {1.005126683795467, 0, 1.3745418575363608}, {1.5880780704325377, 0, 1.3039536044289253}, {3.622408133554125, 0, 2.289597511313432}, {0.030948690635763183, 0, 4.306922133429981}, {5.906038850342371, 0, 5.000045498132029}}], 2 π];
ListPlot[abcdata, ImageSize -> Medium]