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$に対して異なって現れる。

コード

以下は藻類・動物プランクトンモデルをシミュレーションできるJuliaコードである。

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 ↩︎