Path: blob/main/latex-templates/templates/biology/population_dynamics.tex
51 views
unlisted
% Population Dynamics Template1% Topics: Lotka-Volterra predator-prey, stability analysis, limit cycles2% Style: Tutorial with analytical and numerical approaches34\documentclass[a4paper, 11pt]{article}5\usepackage[utf8]{inputenc}6\usepackage[T1]{fontenc}7\usepackage{amsmath, amssymb}8\usepackage{graphicx}9\usepackage{siunitx}10\usepackage{booktabs}11\usepackage{subcaption}12\usepackage[makestderr]{pythontex}1314% Theorem environments15\newtheorem{definition}{Definition}[section]16\newtheorem{theorem}{Theorem}[section]17\newtheorem{example}{Example}[section]18\newtheorem{remark}{Remark}[section]1920\title{Population Dynamics: Predator-Prey Models and Stability Analysis}21\author{Mathematical Biology Tutorial}22\date{\today}2324\begin{document}25\maketitle2627\begin{abstract}28This tutorial presents a comprehensive analysis of predator-prey population dynamics29using the Lotka-Volterra equations and their extensions. We examine the classical model,30perform stability analysis of equilibrium points, and explore modifications including31carrying capacity and functional responses. Computational analysis demonstrates phase32portraits, limit cycles, and the ecological implications of parameter variations.33\end{abstract}3435\section{Introduction}3637The Lotka-Volterra predator-prey model is a cornerstone of mathematical ecology,38describing the coupled dynamics of two interacting species. Despite its simplicity,39the model captures essential features of predator-prey oscillations observed in nature.4041\begin{definition}[Lotka-Volterra Equations]42The classical predator-prey model is:43\begin{align}44\frac{dx}{dt} &= \alpha x - \beta xy \\45\frac{dy}{dt} &= \delta xy - \gamma y46\end{align}47where $x$ is prey density, $y$ is predator density, $\alpha$ is prey growth rate,48$\beta$ is predation rate, $\delta$ is predator growth efficiency, and $\gamma$ is49predator death rate.50\end{definition}5152\section{Theoretical Framework}5354\subsection{Equilibrium Analysis}5556\begin{theorem}[Equilibrium Points]57The Lotka-Volterra system has two equilibrium points:58\begin{enumerate}59\item Trivial equilibrium: $(x^*, y^*) = (0, 0)$60\item Coexistence equilibrium: $(x^*, y^*) = (\gamma/\delta, \alpha/\beta)$61\end{enumerate}62\end{theorem}6364\begin{theorem}[Stability of Coexistence Equilibrium]65The Jacobian matrix at $(x^*, y^*)$ is:66\begin{equation}67J = \begin{pmatrix}680 & -\beta x^* \\69\delta y^* & 070\end{pmatrix}71\end{equation}72The eigenvalues are $\lambda = \pm i\sqrt{\alpha\gamma}$, indicating a center (neutral73stability). Trajectories form closed orbits around the equilibrium.74\end{theorem}7576\subsection{Extensions}7778\begin{definition}[Logistic Prey Growth]79Adding carrying capacity to prey growth:80\begin{align}81\frac{dx}{dt} &= \alpha x \left(1 - \frac{x}{K}\right) - \beta xy \\82\frac{dy}{dt} &= \delta xy - \gamma y83\end{align}84This creates a globally stable equilibrium (spiral sink) for appropriate parameters.85\end{definition}8687\begin{definition}[Holling Type II Functional Response]88Predator satiation is modeled by:89\begin{equation}90\frac{dx}{dt} = \alpha x - \frac{\beta xy}{1 + \beta h x}91\end{equation}92where $h$ is handling time per prey item.93\end{definition}9495\begin{remark}[Functional Responses]96Holling classified functional responses as:97\begin{itemize}98\item \textbf{Type I}: Linear (constant attack rate)99\item \textbf{Type II}: Saturating (handling time limitation)100\item \textbf{Type III}: Sigmoidal (learning or switching behavior)101\end{itemize}102\end{remark}103104\section{Computational Analysis}105106\begin{pycode}107import numpy as np108import matplotlib.pyplot as plt109from scipy.integrate import odeint110from scipy.linalg import eig111112np.random.seed(42)113114# Classic Lotka-Volterra115def lotka_volterra(y, t, alpha, beta, delta, gamma):116x, p = y117dxdt = alpha * x - beta * x * p118dpdt = delta * x * p - gamma * p119return [dxdt, dpdt]120121# With logistic prey growth122def lv_logistic(y, t, alpha, beta, delta, gamma, K):123x, p = y124dxdt = alpha * x * (1 - x/K) - beta * x * p125dpdt = delta * x * p - gamma * p126return [dxdt, dpdt]127128# With Type II functional response129def lv_type2(y, t, alpha, beta, delta, gamma, h):130x, p = y131functional = (beta * x) / (1 + beta * h * x)132dxdt = alpha * x - functional * p133dpdt = delta * functional * p - gamma * p134return [dxdt, dpdt]135136# Rosenzweig-MacArthur model137def rosenzweig_macarthur(y, t, r, K, a, h, e, d):138N, P = y139dNdt = r * N * (1 - N/K) - (a * N * P) / (1 + a * h * N)140dPdt = e * (a * N * P) / (1 + a * h * N) - d * P141return [dNdt, dPdt]142143# Parameters144alpha = 1.0145beta = 0.1146delta = 0.075147gamma = 1.5148K = 100149150# Initial conditions151x0, y0 = 10, 5152initial = [x0, y0]153154# Time array155t = np.linspace(0, 100, 2000)156157# Solve classic model158solution = odeint(lotka_volterra, initial, t, args=(alpha, beta, delta, gamma))159prey = solution[:, 0]160predators = solution[:, 1]161162# Equilibrium points163x_eq = gamma / delta164y_eq = alpha / beta165166# Solve logistic model167sol_logistic = odeint(lv_logistic, initial, t, args=(alpha, beta, delta, gamma, K))168169# Solve Type II model170h = 0.5171sol_type2 = odeint(lv_type2, initial, t, args=(alpha, beta, delta, gamma, h))172173# Rosenzweig-MacArthur with limit cycle174sol_rm = odeint(rosenzweig_macarthur, [10, 2], t, args=(1.0, 50, 0.1, 0.5, 0.5, 0.3))175176# Multiple initial conditions for phase portrait177ics = [[5, 2], [10, 5], [15, 3], [8, 8], [20, 6]]178trajectories = []179for ic in ics:180sol = odeint(lotka_volterra, ic, t, args=(alpha, beta, delta, gamma))181trajectories.append(sol)182183# Vector field for phase portrait184x_range = np.linspace(0.1, 40, 20)185y_range = np.linspace(0.1, 20, 20)186X, Y = np.meshgrid(x_range, y_range)187U = alpha * X - beta * X * Y188V = delta * X * Y - gamma * Y189speed = np.sqrt(U**2 + V**2)190U_norm = U / speed191V_norm = V / speed192193# Isoclines194x_iso = np.linspace(0.1, 40, 200)195prey_iso = alpha / beta * np.ones_like(x_iso)196pred_iso = gamma / delta * np.ones_like(x_iso)197198# Period estimation199prey_peaks = np.where((prey[1:-1] > prey[:-2]) & (prey[1:-1] > prey[2:]))[0] + 1200if len(prey_peaks) >= 2:201period = np.mean(np.diff(t[prey_peaks]))202else:203period = 0204205# Jacobian analysis206J_eq = np.array([[0, -beta * x_eq],207[delta * y_eq, 0]])208eigenvalues, eigenvectors = eig(J_eq)209210# Conservation quantity211H = delta * prey - gamma * np.log(prey) + beta * predators - alpha * np.log(predators)212H0 = H[0]213214# Create figure215fig = plt.figure(figsize=(14, 12))216217# Plot 1: Time series218ax1 = fig.add_subplot(3, 3, 1)219ax1.plot(t, prey, 'b-', linewidth=1.5, label='Prey')220ax1.plot(t, predators, 'r-', linewidth=1.5, label='Predators')221ax1.set_xlabel('Time')222ax1.set_ylabel('Population')223ax1.set_title('Classic Lotka-Volterra')224ax1.legend(fontsize=8)225226# Plot 2: Phase portrait227ax2 = fig.add_subplot(3, 3, 2)228ax2.quiver(X, Y, U_norm, V_norm, speed, cmap='viridis', alpha=0.6)229for traj in trajectories:230ax2.plot(traj[:, 0], traj[:, 1], linewidth=1)231ax2.plot(x_eq, y_eq, 'r*', markersize=12, label='Equilibrium')232ax2.axhline(y=y_eq, color='green', linestyle='--', alpha=0.5)233ax2.axvline(x=x_eq, color='blue', linestyle='--', alpha=0.5)234ax2.set_xlabel('Prey')235ax2.set_ylabel('Predator')236ax2.set_title('Phase Portrait')237ax2.set_xlim([0, 40])238ax2.set_ylim([0, 20])239240# Plot 3: Logistic prey growth241ax3 = fig.add_subplot(3, 3, 3)242ax3.plot(t, sol_logistic[:, 0], 'b-', linewidth=1.5, label='Prey')243ax3.plot(t, sol_logistic[:, 1], 'r-', linewidth=1.5, label='Predators')244ax3.set_xlabel('Time')245ax3.set_ylabel('Population')246ax3.set_title('With Logistic Prey Growth')247ax3.legend(fontsize=8)248249# Plot 4: Logistic phase space250ax4 = fig.add_subplot(3, 3, 4)251ax4.plot(sol_logistic[:, 0], sol_logistic[:, 1], 'g-', linewidth=1)252ax4.plot(sol_logistic[0, 0], sol_logistic[0, 1], 'ko', markersize=8)253ax4.plot(sol_logistic[-1, 0], sol_logistic[-1, 1], 'r*', markersize=12)254ax4.set_xlabel('Prey')255ax4.set_ylabel('Predator')256ax4.set_title('Logistic Model Phase Space')257258# Plot 5: Type II functional response259ax5 = fig.add_subplot(3, 3, 5)260ax5.plot(t, sol_type2[:, 0], 'b-', linewidth=1.5, label='Prey')261ax5.plot(t, sol_type2[:, 1], 'r-', linewidth=1.5, label='Predators')262ax5.set_xlabel('Time')263ax5.set_ylabel('Population')264ax5.set_title('Type II Functional Response')265ax5.legend(fontsize=8)266267# Plot 6: Rosenzweig-MacArthur limit cycle268ax6 = fig.add_subplot(3, 3, 6)269ax6.plot(sol_rm[500:, 0], sol_rm[500:, 1], 'purple', linewidth=1.5)270ax6.set_xlabel('Prey')271ax6.set_ylabel('Predator')272ax6.set_title('Rosenzweig-MacArthur Limit Cycle')273274# Plot 7: Conserved quantity275ax7 = fig.add_subplot(3, 3, 7)276ax7.plot(t, H, 'b-', linewidth=1.5)277ax7.axhline(y=H0, color='red', linestyle='--', alpha=0.7)278ax7.set_xlabel('Time')279ax7.set_ylabel('$H(x, y)$')280ax7.set_title('Conserved Quantity')281ax7.set_ylim([H0 - 1, H0 + 1])282283# Plot 8: Functional responses284ax8 = fig.add_subplot(3, 3, 8)285N_range = np.linspace(0, 50, 200)286type1 = beta * N_range287type2 = (beta * N_range) / (1 + beta * h * N_range)288type3 = (beta * N_range**2) / (1 + beta * h * N_range**2)289ax8.plot(N_range, type1, 'b-', linewidth=2, label='Type I')290ax8.plot(N_range, type2, 'g-', linewidth=2, label='Type II')291ax8.plot(N_range, type3, 'r-', linewidth=2, label='Type III')292ax8.set_xlabel('Prey density $N$')293ax8.set_ylabel('Predation rate')294ax8.set_title('Functional Responses')295ax8.legend(fontsize=8)296297# Plot 9: Parameter sensitivity298ax9 = fig.add_subplot(3, 3, 9)299alphas = [0.8, 1.0, 1.2]300colors = ['blue', 'green', 'red']301for a, c in zip(alphas, colors):302sol = odeint(lotka_volterra, initial, t, args=(a, beta, delta, gamma))303ax9.plot(t[:500], sol[:500, 0], color=c, linewidth=1.5, label=f'$\\alpha = {a}$')304ax9.set_xlabel('Time')305ax9.set_ylabel('Prey population')306ax9.set_title('Prey Growth Rate Sensitivity')307ax9.legend(fontsize=8)308309plt.tight_layout()310plt.savefig('population_dynamics_analysis.pdf', dpi=150, bbox_inches='tight')311plt.close()312\end{pycode}313314\begin{figure}[htbp]315\centering316\includegraphics[width=\textwidth]{population_dynamics_analysis.pdf}317\caption{Predator-prey dynamics analysis: (a) Classic Lotka-Volterra time series;318(b) Phase portrait with multiple trajectories and isoclines; (c-d) Logistic prey growth319model showing damped oscillations; (e) Type II functional response dynamics; (f)320Rosenzweig-MacArthur limit cycle; (g) Conserved quantity verification; (h) Comparison321of functional responses; (i) Sensitivity to prey growth rate.}322\label{fig:predprey}323\end{figure}324325\section{Results}326327\subsection{Model Parameters}328329\begin{pycode}330print(r"\begin{table}[htbp]")331print(r"\centering")332print(r"\caption{Lotka-Volterra Model Parameters and Results}")333print(r"\begin{tabular}{lcc}")334print(r"\toprule")335print(r"Parameter & Symbol & Value \\")336print(r"\midrule")337print(f"Prey growth rate & $\\alpha$ & {alpha} \\\\")338print(f"Predation rate & $\\beta$ & {beta} \\\\")339print(f"Predator efficiency & $\\delta$ & {delta} \\\\")340print(f"Predator death rate & $\\gamma$ & {gamma} \\\\")341print(r"\midrule")342print(f"Equilibrium prey & $x^*$ & {x_eq:.2f} \\\\")343print(f"Equilibrium predator & $y^*$ & {y_eq:.2f} \\\\")344print(f"Oscillation period & $T$ & {period:.2f} \\\\")345print(r"\bottomrule")346print(r"\end{tabular}")347print(r"\label{tab:parameters}")348print(r"\end{table}")349\end{pycode}350351\subsection{Stability Analysis}352353\begin{pycode}354print(r"\begin{table}[htbp]")355print(r"\centering")356print(r"\caption{Stability Analysis at Coexistence Equilibrium}")357print(r"\begin{tabular}{lc}")358print(r"\toprule")359print(r"Property & Value \\")360print(r"\midrule")361print(f"Eigenvalue 1 & ${eigenvalues[0]:.4f}$ \\\\")362print(f"Eigenvalue 2 & ${eigenvalues[1]:.4f}$ \\\\")363print(f"Angular frequency & $\\omega = {np.abs(eigenvalues[0].imag):.4f}$ \\\\")364print(f"Theoretical period & $T = 2\\pi/\\omega = {2*np.pi/np.abs(eigenvalues[0].imag):.2f}$ \\\\")365print(r"Stability type & Center (neutral) \\")366print(r"\bottomrule")367print(r"\end{tabular}")368print(r"\label{tab:stability}")369print(r"\end{table}")370\end{pycode}371372\section{Discussion}373374\begin{example}[Conservation Law]375The classical Lotka-Volterra system conserves the quantity:376\begin{equation}377H(x, y) = \delta x - \gamma \ln x + \beta y - \alpha \ln y378\end{equation}379This integral of motion ensures closed orbits in phase space.380\end{example}381382\begin{remark}[Structural Instability]383The classical model is structurally unstable: any perturbation to the equations384(such as adding density dependence) changes the qualitative behavior from neutral385cycles to either damped oscillations (stable spiral) or limit cycles.386\end{remark}387388\begin{example}[Paradox of Enrichment]389In the Rosenzweig-MacArthur model, increasing carrying capacity $K$ can destabilize390the equilibrium. Beyond a critical $K$, the system transitions from a stable spiral391to a limit cycle via a Hopf bifurcation. This counterintuitive result suggests that392enriching an ecosystem can lead to larger oscillations and potential extinction.393\end{example}394395\begin{remark}[Ecological Implications]396Predator-prey oscillations explain phenomena such as:397\begin{itemize}398\item Lynx-hare cycles in Canadian fur trade records399\item Phytoplankton-zooplankton dynamics in lakes400\item Host-parasitoid population cycles401\item Microbial predator-prey systems402\end{itemize}403The oscillation period depends on the geometric mean of growth and death rates.404\end{remark}405406\section{Conclusions}407408This analysis demonstrates the rich dynamics of predator-prey systems:409\begin{enumerate}410\item Classic Lotka-Volterra produces neutral oscillations with period $T \approx \py{f"{period:.1f}"}$411\item Equilibrium at $(x^*, y^*) = (\py{f"{x_eq:.1f}"}, \py{f"{y_eq:.1f}"}$) with eigenvalues $\lambda = \pm i\py{f"{np.abs(eigenvalues[0].imag):.3f}"}$412\item Adding logistic prey growth creates damped oscillations (stable spiral)413\item Type II functional response can generate limit cycles414\item The conserved quantity $H$ ensures orbit closure in the classic model415\end{enumerate}416417\section*{Further Reading}418419\begin{itemize}420\item Murray, J.D. \textit{Mathematical Biology I: An Introduction}, 3rd ed. Springer, 2002.421\item Edelstein-Keshet, L. \textit{Mathematical Models in Biology}. SIAM, 2005.422\item Kot, M. \textit{Elements of Mathematical Ecology}. Cambridge, 2001.423\end{itemize}424425\end{document}426427428