logo

해석학에서의 널클라인 📂동역학

해석학에서의 널클라인

정의

아이소클라인

곡선집합이 주어져 있다고 하자. 기울기가 같은 점들의 집합아이소클라인isocline이라 한다.

널클라인

$p$차원 상미분방정식이 $\dot{\mathbf{x}} = \mathbf{f} \left( \mathbf{x} \right)$ 과 같이 주어져 있다고 하자. $k$번째 좌표 $x_{k}$ 마다 기울기가 $0$ 인 아이소클라인을 널클라인nullcline이라 한다. 더 구체적으로는, $k$번째 널클라인 $N_{k}$ 을 다음과 같이 정의할 수 있다. $$ 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. 물론 널클라인으로 시스템의 디테일한 부분을 모두 파악할 수 있는 건 아니지만, 대략적으로 전체적인 양상을 볼 수 있고 모든 널클라인의 교집합고정점의 집합이기도 하기 때문이다. $$ \bigcap_{k=1}^{p} N_{k} = \left\{ \mathbf{x}_{0} : \mathbf{f} \left( \mathbf{x}_{0} \right) = \mathbf{0} \right\} $$

실습

$$ \begin{align*} \dot{x} =& x + y \\ \dot{y} =& \mu y + x^{2} - xy \end{align*} $$

다음은 위와 같이 주어진 상미분방정식에서 $\mu = - 1.755$ 일 때의 널클라인을 시각화한 것이다. 앞서 언급했듯 널클라인을 보는 것만으로 두 개의 고정점이 대략적으로 어디에 위치하는지 짐작할 수 있고, 특히 $(x,y) = (0,0)$ 은 자명한 고정점으로써 쉽게 검증할 수 있다.

null_clines.png

구체적인 프로세스는 다음과 같다:

  1. 수치적으로, 정확히 $\dot{x} = 0$ 혹은 $\dot{y} = 0$ 인 점은 구할 수 없다고 가정한다. 충분히 많은 수의 그리드로 평면을 쪼개고, 그 모든 점에서 벡터 $\left( \dot{x} , \dot{y} \right) = \mathbf{f} (x,y)$ 를 계산한다.
  2. $\dot{x}$ 와 $\dot{y}$ 각각에 대해 양수인 영역과 음수인 영역으로 나눈다. 아마 그 결과는 참과 거짓으로 이루어진 두 개의 행렬이 될 것이다.
  3. 중간값 정리에 따라 양수인 영역과 음수의 영역이 만나는 곳에는 $\dot{x} = 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. ↩︎