해석학에서의 널클라인
정의
아이소클라인
곡선의 집합이 주어져 있다고 하자. 기울기가 같은 점들의 집합을 아이소클라인isocline이라 한다.
널클라인
차원 상미분방정식이 과 같이 주어져 있다고 하자. 번째 좌표 마다 기울기가 인 아이소클라인을 널클라인nullcline이라 한다. 더 구체적으로는, 번째 널클라인 을 다음과 같이 정의할 수 있다.
설명
널클라인은 동역학계, 특히 2차원 평면으로 시각화 할 수 있을 때 시스템을 분석하기 위한 좋은 수단이다1. 물론 널클라인으로 시스템의 디테일한 부분을 모두 파악할 수 있는 건 아니지만, 대략적으로 전체적인 양상을 볼 수 있고 모든 널클라인의 교집합은 고정점의 집합이기도 하기 때문이다.
실습
다음은 위와 같이 주어진 상미분방정식에서 일 때의 널클라인을 시각화한 것이다. 앞서 언급했듯 널클라인을 보는 것만으로 두 개의 고정점이 대략적으로 어디에 위치하는지 짐작할 수 있고, 특히 은 자명한 고정점으로써 쉽게 검증할 수 있다.
구체적인 프로세스는 다음과 같다:
- 수치적으로, 정확히 혹은 인 점은 구할 수 없다고 가정한다. 충분히 많은 수의 그리드로 평면을 쪼개고, 그 모든 점에서 벡터 를 계산한다.
- 와 각각에 대해 양수인 영역과 음수인 영역으로 나눈다. 아마 그 결과는 참과 거짓으로 이루어진 두 개의 행렬이 될 것이다.
- 중간값 정리에 따라 양수인 영역과 음수의 영역이 만나는 곳에는 혹은 을 만족하는 점이 존재한다. 참과 거짓으로 이루어진 행렬에 차분을 취해 그 경계션을 얻는다. 이를 행의 방향으로도, 열의 방향으로도 실시한다. 여기서 행렬에 차분을 취하면 사이즈가 달라지므로 적절하게 패딩을 해주어야 한다.
전체코드
다음은 본 포스트의 널클라인을 재현하는 줄리아 코드다.
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. ↩︎