logo

동역학계로써의 조류-동물성플랑크톤 모델 📂동역학

동역학계로써의 조류-동물성플랑크톤 모델

모델 1

$$ \begin{align*} \dot{A} =& r A \left( 1 - \frac{A}{K} \right) - g Z \frac{A}{A + h_{A}} + i \left( K - A \right) \\ \dot{Z} =& e g Z \frac{A}{A + h_{A}} - m Z - F {\frac{ Z^{2} }{ Z + h_{Z} }} \end{align*} $$

변수

  • $A$: 조류algae의 밀도
  • $Z$: 동물성플랑크톤zooplankton의 밀도

파라미터

  • $r = 0.5$: 조류의 성장률
  • $K = 6$: 조류의 환경수용력carrying capacity
  • $g = 0.4$: 동물성플랑크톤의 섭식률grazing rate
  • $h_{A} = 0.6$: 조류의 반포화상수half-saturation constant
  • $i = 0.1$: 조류의 유입률inflow rate
  • $e = 0.6$: 동물성플랑크톤의 섭식효율grazing efficiency
  • $m = 0.15$: 동물성플랑크톤의 자연사망률natural mortality rate
  • $F$: 물고기 집단fish community에 의한 손실
  • $h_{Z} = 0.5$: 동물성플랑크톤의 반포화상수

설명

조류-동물성플랑크톤 모델algae-zooplankton model은 전형적인 롯카-볼테라 포식자-피식자 모델의 변형으로써, 수중에서 조류와 동물성플랑크톤의 상호작용을 설명하는 수리적 모델이다.

본문의 모델에서 항은 다음과 같은 의미를 가진다.

  • $\dot{A} = \cdots$
  • $\dot{Z} = \cdots$
    • $e g Z \frac{A}{A + h_{A}}$: 조류에 의한 동물성플랑크톤의 성장, 섭식 효율 $e \le 1$ 에 영향을 받는다.
    • $m Z$: 동물성플랑크톤의 자연사망이다.
    • $F {\frac{ Z^{2} }{ Z + h_{Z} }}$: 물고기에 의해 먹히는 동물성플랑크톤을 의미하며, 홀링타입 2 함수형 반응을 따른다.

B-티핑

alt text

주어진 방정식은 $F$ 의 변화에 따라 위와 유사한 바이퍼케이션 다이어그램을 보인다. 두 종류의 새들-노드 바이퍼케이션이 있어 이력현상을 보이며, 자연스럽게 B-티핑이 발생한다.

alt text

이러한 바이퍼케이션 다이어그램은 위 그림에서 (a) $K = 4, 6, 8, 10$, (b) $i = 0.025, 0.05, 0.075, 0.1$, (c) $g = 0.35, 0.40, 0.45, 0.50$, (d) $m = 0.10, 0.12, 0.14, 0.16$ 에 대해 다르게 나타난다.

코드

다음은 조류-동물성플랑크톤 모델을 시뮬레이션 할 수 있는 줄리아 코드다.

using DataFrames, DifferentialEquations, OrdinaryDiffEqLowOrderRK

function factory_algaezooplankton(F::Number; ic = [5, 5], saveat = 0:1e-2:100)
      r, K,   g,  hA,   i,   e,    m,  hZ = (
    0.5, 6, 0.4, 0.6, 0.1, 0.6, 0.15, 0.5 )
    function sys(du, u, p, t)
        A,Z = u
        F = p[1]

        du[1] = r*A*(1 - frac(A,K)) - g*Z*frac(A, A + hA) + i*(K - A)
        du[2] = e*g*Z*frac(A, A + hA) - m*Z - F*frac(Z^2, Z^2 + hZ^2)
        return du
    end
    sol = solve(ODEProblem(sys, ic, (0, last(saveat)), [F]), RK4(), dt = saveat.step.hi, adaptive=false, maxiters = 1e+7)
    matrix = Matrix([sol.t'; sol[:, :]; stack([sys(zeros(2), u, [F], 0) for u in sol.u])]')
    return matrix[sol.t .≥ first(saveat), :][1:end-1, :]
end
factory_algaezooplankton(T::Type, args...; kargs...) =
DataFrame(factory_algaezooplankton(args...; kargs...), ["t", "A", "Z", "dA", "dZ"])

  1. Chattopadhyay, S. N., & Gupta, A. K. (2024). B-tipping points in plankton dynamics: Stochasticity and early warning signals. Physical Review E, 110(6), 064218. https://doi.org/10.1103/PhysRevE.110.064218 ↩︎