logo

解析学におけるヌルクライン 📂動力学

解析学におけるヌルクライン

定義

アイソクライン

曲線集合が与えられているとする。傾きが同じ点の集合アイソクラインisoclineという。

ヌルクライン

pp次元の常微分方程式x˙=f(x)\dot{\mathbf{x}} = \mathbf{f} \left( \mathbf{x} \right)のように与えられているとする。kk番目の座標xkx_{k}ごとに傾きが00のアイソクラインをヌルクラインnullclineという。さらに具体的には、kk番目のヌルクラインNkN_{k}は次のように定義できる。 Nk:={x=(x1,,xp)Rp:dxkdt=0} N_{k} := \left\{ \mathbf{x} = \left( x_{1} , \cdots , x_{p} \right) \in \mathbb{R}^{p} : {\frac{ d x_{k} }{ d t }} = 0 \right\}

説明

alt text

ヌルクラインは動力学系、特に2次元平面で視覚化できる場合にシステムを分析するための良い手段である1。もちろんヌルクラインですべてのシステムの詳細を把握することはできないが、おおまかな全体像を確認でき、すべてのヌルクラインの交集合固定点の集合でもある。 k=1pNk={x0:f(x0)=0} \bigcap_{k=1}^{p} N_{k} = \left\{ \mathbf{x}_{0} : \mathbf{f} \left( \mathbf{x}_{0} \right) = \mathbf{0} \right\}

実習

x˙=x+yy˙=μy+x2xy \begin{align*} \dot{x} =& x + y \\ \dot{y} =& \mu y + x^{2} - xy \end{align*}

次は、上記のように与えられた常微分方程式でμ=1.755\mu = - 1.755のときのヌルクラインを視覚化したものである。前述のようにヌルクラインを見るだけで2つの固定点が大まかにどこに位置するか推測でき、特に(x,y)=(0,0)(x,y) = (0,0)は自明な固定点として簡単に検証できる。

null_clines.png

具体的なプロセスは次の通りである。

  1. 数値的に、正確にx˙=0\dot{x} = 0またはy˙=0\dot{y} = 0の点を求めることはできないと仮定する。十分に多くのグリッドで平面を分割し、そのすべての点でベクトル(x˙,y˙)=f(x,y)\left( \dot{x} , \dot{y} \right) = \mathbf{f} (x,y)を計算する。
  2. x˙\dot{x}y˙\dot{y}それぞれについて正の領域と負の領域に分ける。おそらくその結果は真と偽から成る2つの行列になるだろう。
  3. 中間値定理によれば、正の領域と負の領域が接する場所にはx˙=0\dot{x} = 0またはy˙=0\dot{y} = 0を満たす点が存在する。真と偽から成る行列に差分を取ってその境界を得る。これを行方向および列方向で実施する。ここで行列に差分を取るとサイズが異なるので適切にパディングしなければならない。

全体コード

次は本ポストのヌルクラインを再現するジュリアコードである。

using Plots, LinearAlgebra
μ = -1.755
h = 0.1

f(v) = [v[1] + v[2], μ*v[2] + v[1]^2 - v[1]*v[2]]

pos = collect(Base.product(-1.5:0.001:.5, -.5:0.001:2))
dir = f.(pos)
x_ = first.(dir)
y_ = last.(dir)
null_x = .!iszero.([diff(x_ .> 0, dims = 1); zeros(Int64, 1, size(x_, 2))] +
[diff(x_ .> 0, dims = 2) zeros(Int64, size(x_, 1), 1)])
null_y = .!iszero.([diff(y_ .> 0, dims = 1); zeros(Int64, 1, size(y_, 2))] +
[diff(y_ .> 0, dims = 2) zeros(Int64, size(y_, 1), 1)])
plot(xlims = [-1.5,.5], ylims = [-.5,2], xlabel = "x", ylabel = "y", size = [600, 600])
scatter!(first.(pos[null_x]), last.(pos[null_x]), label = "dx/dt = 0", color =  :red, msw = 0, alpha = .5, ms = 0.5)
scatter!(first.(pos[null_y]), last.(pos[null_y]), label = "dy/dt = 0", color = :blue, msw = 0, alpha = .5, ms = 0.5)
png("null_clines.png")

  1. Strogatz. (2015). Nonlinear Dynamics And Chaos: With Applications To Physics, Biology, Chemistry, And Engineering(2nd Edition): p148. ↩︎