解析学におけるヌルクライン
定義
アイソクライン
曲線の集合が与えられているとする。傾きが同じ点の集合をアイソクラインisoclineという。
ヌルクライン
次元の常微分方程式がのように与えられているとする。番目の座標ごとに傾きがのアイソクラインをヌルクラインnullclineという。さらに具体的には、番目のヌルクラインは次のように定義できる。
説明
ヌルクラインは動力学系、特に2次元平面で視覚化できる場合にシステムを分析するための良い手段である1。もちろんヌルクラインですべてのシステムの詳細を把握することはできないが、おおまかな全体像を確認でき、すべてのヌルクラインの交集合は固定点の集合でもある。
実習
次は、上記のように与えられた常微分方程式でのときのヌルクラインを視覚化したものである。前述のようにヌルクラインを見るだけで2つの固定点が大まかにどこに位置するか推測でき、特には自明な固定点として簡単に検証できる。
具体的なプロセスは次の通りである。
- 数値的に、正確にまたはの点を求めることはできないと仮定する。十分に多くのグリッドで平面を分割し、そのすべての点でベクトルを計算する。
- とそれぞれについて正の領域と負の領域に分ける。おそらくその結果は真と偽から成る2つの行列になるだろう。
- 中間値定理によれば、正の領域と負の領域が接する場所にはまたはを満たす点が存在する。真と偽から成る行列に差分を取ってその境界を得る。これを行方向および列方向で実施する。ここで行列に差分を取るとサイズが異なるので適切にパディングしなければならない。
全体コード
次は本ポストのヌルクラインを再現するジュリアコードである。
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")
Strogatz. (2015). Nonlinear Dynamics And Chaos: With Applications To Physics, Biology, Chemistry, And Engineering(2nd Edition): p148. ↩︎