Path: blob/main/latex-templates/templates/marine-biology/fisheries_models.tex
51 views
unlisted
% Fisheries Population Models Template1% Topics: Stock-recruitment, surplus production, MSY, age-structured models, overfishing2% Style: Fisheries management report with computational analysis34\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{Fisheries Population Models:\\Stock-Recruitment Dynamics and Sustainable Harvesting}21\author{Marine Biology and Fisheries Management Group}22\date{\today}2324\begin{document}25\maketitle2627\begin{abstract}28This report presents a comprehensive computational analysis of fisheries population models29used in sustainable fisheries management. We examine surplus production models including30the Schaefer and Fox formulations, calculate maximum sustainable yield (MSY) and optimal31fishing effort, analyze stock-recruitment relationships through Beverton-Holt and Ricker32models, and investigate age-structured population dynamics. The analysis demonstrates33critical thresholds for overfishing, equilibrium biomass levels, and yield-per-recruit34optimization for effective fisheries conservation.35\end{abstract}3637\section{Introduction}3839Fisheries population models provide the scientific foundation for sustainable fisheries40management. These models describe how fish stocks respond to fishing pressure and41environmental variation, enabling managers to set harvest limits that balance economic42productivity with long-term population viability. Understanding stock dynamics is crucial43for preventing overfishing and ensuring food security for coastal communities worldwide.4445\begin{definition}[Sustainable Yield]46The sustainable yield is the harvest rate that can be maintained indefinitely without47depleting the stock. Maximum sustainable yield (MSY) represents the largest average catch48that can be taken from a stock under existing environmental conditions.49\end{definition}5051\section{Surplus Production Models}5253Surplus production models describe population biomass dynamics without explicit age54structure. These models assume that fish populations grow logistically until limited by55carrying capacity, and that fishing removes a portion of the biomass proportional to56fishing effort and stock size.5758\subsection{The Schaefer Model}5960\begin{definition}[Schaefer Model]61The Schaefer model assumes logistic population growth with fishing mortality proportional62to effort and biomass:63\begin{equation}64\frac{dB}{dt} = rB\left(1 - \frac{B}{K}\right) - qEB65\end{equation}66where $B$ is biomass (tonnes), $r$ is intrinsic growth rate (year$^{-1}$), $K$ is carrying67capacity (tonnes), $E$ is fishing effort (boat-days), and $q$ is catchability coefficient68(boat-days$^{-1}$).69\end{definition}7071\begin{theorem}[Maximum Sustainable Yield]72At equilibrium ($dB/dt = 0$), the Schaefer model yields:73\begin{equation}74MSY = \frac{rK}{4}, \quad B_{MSY} = \frac{K}{2}, \quad E_{MSY} = \frac{r}{2q}75\end{equation}76The maximum sustainable yield occurs at half the carrying capacity with fishing effort77equal to half the intrinsic growth rate divided by catchability.78\end{theorem}7980\subsection{The Fox Model}8182\begin{definition}[Fox Model]83The Fox model assumes Gompertz growth rather than logistic:84\begin{equation}85\frac{dB}{dt} = rB\ln\left(\frac{K}{B}\right) - qEB86\end{equation}87This formulation better describes populations with compensatory mortality at low densities.88\end{definition}8990\section{Computational Analysis: Surplus Production}9192We implement the Schaefer and Fox models to analyze a hypothetical demersal fish stock93under varying fishing pressure. The analysis demonstrates how fishing effort affects94equilibrium biomass, sustainable yield, and the risk of stock collapse. Understanding95these relationships is essential for setting total allowable catch (TAC) limits in96fisheries management plans.9798\begin{pycode}99import numpy as np100import matplotlib.pyplot as plt101from scipy.integrate import odeint102from scipy.optimize import fsolve, minimize_scalar103104np.random.seed(42)105106# Schaefer model parameters (typical demersal fish stock)107r = 0.8 # intrinsic growth rate (year^-1)108K = 100000 # carrying capacity (tonnes)109q = 0.0001 # catchability coefficient (boat-days^-1)110111# Calculate MSY analytically112MSY = r * K / 4113B_MSY = K / 2114E_MSY = r / (2 * q)115116print(f"Schaefer Model Parameters:")117print(f"MSY = {MSY:.0f} tonnes/year")118print(f"Biomass at MSY = {B_MSY:.0f} tonnes")119print(f"Optimal effort = {E_MSY:.0f} boat-days/year")120121# Schaefer differential equation122def schaefer(B, t, r, K, q, E):123dBdt = r * B * (1 - B / K) - q * E * B124return dBdt125126# Fox differential equation127def fox(B, t, r, K, q, E):128if B <= 0:129return 0130dBdt = r * B * np.log(K / B) - q * E * B131return dBdt132133# Time array134t = np.linspace(0, 50, 500)135136# Different fishing effort levels137effort_levels = np.array([0, 2000, 4000, 6000, 8000, 10000])138139# Initial biomass (virgin stock)140B0 = K141142# Simulate trajectories143schaefer_trajectories = {}144fox_trajectories = {}145146for E in effort_levels:147B_schaefer = odeint(schaefer, B0, t, args=(r, K, q, E))148B_fox = odeint(fox, B0, t, args=(r, K, q, E))149schaefer_trajectories[E] = B_schaefer.flatten()150fox_trajectories[E] = B_fox.flatten()151152# Equilibrium biomass and yield curves153effort_range = np.linspace(0, 12000, 200)154B_eq_schaefer = K * (1 - q * effort_range / r)155B_eq_schaefer[B_eq_schaefer < 0] = 0156yield_schaefer = q * effort_range * B_eq_schaefer157158# Fox equilibrium (numerical solution)159def fox_equilibrium(B, E, r, K, q):160if B <= 0:161return 1e10162return r * np.log(K / B) - q * E163164B_eq_fox = []165for E in effort_range:166if E < r / q:167B_eq_fox.append(fsolve(fox_equilibrium, K/2, args=(E, r, K, q))[0])168else:169B_eq_fox.append(0)170B_eq_fox = np.array(B_eq_fox)171yield_fox = q * effort_range * B_eq_fox172173# Create first figure: biomass trajectories and equilibrium curves174fig = plt.figure(figsize=(14, 10))175176# Plot 1: Schaefer biomass trajectories177ax1 = fig.add_subplot(2, 3, 1)178colors = plt.cm.viridis(np.linspace(0, 0.9, len(effort_levels)))179for i, E in enumerate(effort_levels):180ax1.plot(t, schaefer_trajectories[E], linewidth=2, color=colors[i],181label=f'E = {E:.0f}')182ax1.axhline(y=B_MSY, color='red', linestyle='--', linewidth=1.5, alpha=0.7,183label=f'$B_{{MSY}}$ = {B_MSY:.0f}')184ax1.set_xlabel('Time (years)', fontsize=11)185ax1.set_ylabel('Biomass (tonnes)', fontsize=11)186ax1.set_title('Schaefer Model: Biomass Trajectories', fontsize=12, fontweight='bold')187ax1.legend(fontsize=8, loc='right')188ax1.grid(True, alpha=0.3)189ax1.set_ylim(0, K * 1.1)190191# Plot 2: Equilibrium biomass vs effort192ax2 = fig.add_subplot(2, 3, 2)193ax2.plot(effort_range, B_eq_schaefer, 'b-', linewidth=2.5, label='Schaefer')194ax2.plot(effort_range, B_eq_fox, 'g-', linewidth=2.5, label='Fox')195ax2.axhline(y=B_MSY, color='red', linestyle='--', linewidth=1.5, alpha=0.7)196ax2.axvline(x=E_MSY, color='red', linestyle='--', linewidth=1.5, alpha=0.7)197ax2.fill_between(effort_range, 0, B_eq_schaefer, where=(B_eq_schaefer < 0.2 * K),198alpha=0.2, color='red', label='Overfished')199ax2.set_xlabel('Fishing Effort (boat-days/year)', fontsize=11)200ax2.set_ylabel('Equilibrium Biomass (tonnes)', fontsize=11)201ax2.set_title('Equilibrium Stock Size', fontsize=12, fontweight='bold')202ax2.legend(fontsize=9)203ax2.grid(True, alpha=0.3)204205# Plot 3: Yield vs effort (production curve)206ax3 = fig.add_subplot(2, 3, 3)207ax3.plot(effort_range, yield_schaefer, 'b-', linewidth=2.5, label='Schaefer')208ax3.plot(effort_range, yield_fox, 'g-', linewidth=2.5, label='Fox')209ax3.axhline(y=MSY, color='red', linestyle='--', linewidth=1.5, alpha=0.7,210label=f'MSY = {MSY:.0f}')211ax3.axvline(x=E_MSY, color='red', linestyle='--', linewidth=1.5, alpha=0.7)212ax3.scatter([E_MSY], [MSY], s=150, c='red', marker='*', zorder=5, edgecolor='black')213ax3.set_xlabel('Fishing Effort (boat-days/year)', fontsize=11)214ax3.set_ylabel('Sustainable Yield (tonnes/year)', fontsize=11)215ax3.set_title('Production Curve', fontsize=12, fontweight='bold')216ax3.legend(fontsize=9)217ax3.grid(True, alpha=0.3)218219# Plot 4: Yield vs biomass220ax4 = fig.add_subplot(2, 3, 4)221ax4.plot(B_eq_schaefer, yield_schaefer, 'b-', linewidth=2.5, label='Schaefer')222ax4.plot(B_eq_fox, yield_fox, 'g-', linewidth=2.5, label='Fox')223ax4.scatter([B_MSY], [MSY], s=150, c='red', marker='*', zorder=5, edgecolor='black',224label='MSY point')225ax4.axvline(x=0.2*K, color='orange', linestyle=':', linewidth=2, alpha=0.7,226label='Overfished threshold')227ax4.set_xlabel('Stock Biomass (tonnes)', fontsize=11)228ax4.set_ylabel('Sustainable Yield (tonnes/year)', fontsize=11)229ax4.set_title('Yield vs Stock Size', fontsize=12, fontweight='bold')230ax4.legend(fontsize=9)231ax4.grid(True, alpha=0.3)232233# Plot 5: Fishing mortality rate234ax5 = fig.add_subplot(2, 3, 5)235F_range = q * effort_range236F_MSY = q * E_MSY237ax5.plot(F_range, yield_schaefer, 'b-', linewidth=2.5)238ax5.axvline(x=F_MSY, color='red', linestyle='--', linewidth=1.5, alpha=0.7,239label=f'$F_{{MSY}}$ = {F_MSY:.3f}')240ax5.axvline(x=r, color='orange', linestyle=':', linewidth=2, alpha=0.7,241label=f'$F = r$ (collapse)')242ax5.fill_between(F_range, 0, yield_schaefer, where=(F_range > r),243alpha=0.3, color='red', label='Overfishing')244ax5.set_xlabel('Fishing Mortality Rate (year$^{-1}$)', fontsize=11)245ax5.set_ylabel('Sustainable Yield (tonnes/year)', fontsize=11)246ax5.set_title('Yield vs Fishing Mortality', fontsize=12, fontweight='bold')247ax5.legend(fontsize=9)248ax5.grid(True, alpha=0.3)249ax5.set_xlim(0, 1.2)250251# Plot 6: Stock depletion levels252ax6 = fig.add_subplot(2, 3, 6)253depletion = B_eq_schaefer / K * 100254ax6.plot(effort_range, depletion, 'b-', linewidth=2.5)255ax6.axhline(y=50, color='red', linestyle='--', linewidth=1.5, alpha=0.7,256label='50% (MSY)')257ax6.axhline(y=20, color='orange', linestyle='--', linewidth=1.5, alpha=0.7,258label='20% (overfished)')259ax6.axhline(y=10, color='darkred', linestyle='--', linewidth=1.5, alpha=0.7,260label='10% (critical)')261ax6.fill_between(effort_range, 0, depletion, where=(depletion < 20),262alpha=0.3, color='red')263ax6.set_xlabel('Fishing Effort (boat-days/year)', fontsize=11)264ax6.set_ylabel('Stock Depletion Level (\\%)', fontsize=11)265ax6.set_title('Depletion vs Effort', fontsize=12, fontweight='bold')266ax6.legend(fontsize=8, loc='upper right')267ax6.grid(True, alpha=0.3)268ax6.set_ylim(0, 105)269270plt.tight_layout()271plt.savefig('fisheries_models_production.pdf', dpi=150, bbox_inches='tight')272plt.close()273\end{pycode}274275\begin{figure}[htbp]276\centering277\includegraphics[width=\textwidth]{fisheries_models_production.pdf}278\caption{Surplus production model analysis showing biomass trajectories under different279fishing effort levels, equilibrium relationships between effort and stock size, and the280classic dome-shaped production curve. The Schaefer model predicts MSY at 50\% of carrying281capacity with effort = \py{f"{E_MSY:.0f}"} boat-days/year. The red shaded regions indicate282overfished conditions where stock biomass falls below 20\% of carrying capacity, risking283recruitment failure and economic collapse of the fishery.}284\label{fig:production}285\end{figure}286287The surplus production analysis reveals that fishing effort above \py{f"{E_MSY:.0f}"}288boat-days/year drives the stock below the MSY biomass level, reducing long-term catch.289At extreme effort levels exceeding \py{f"{r/q:.0f}"} boat-days/year, the fishing290mortality rate surpasses the intrinsic growth rate, causing inevitable stock collapse.291This demonstrates the biological and economic irrationality of overfishing.292293\section{Stock-Recruitment Relationships}294295Stock-recruitment models describe how spawning stock biomass (SSB) determines the296abundance of recruits entering the fishery. These models capture density-dependent297mortality in early life stages and are essential for understanding population resilience.298299\subsection{The Beverton-Holt Model}300301\begin{definition}[Beverton-Holt Recruitment]302The Beverton-Holt model describes asymptotic recruitment with density dependence:303\begin{equation}304R = \frac{\alpha S}{1 + \beta S}305\end{equation}306where $R$ is recruitment, $S$ is spawning stock biomass, $\alpha$ is maximum recruits307per spawner at low density, and $\beta$ controls density dependence.308\end{definition}309310\subsection{The Ricker Model}311312\begin{definition}[Ricker Recruitment]313The Ricker model allows for overcompensation at high spawning stock:314\begin{equation}315R = \alpha S e^{-\beta S}316\end{equation}317This formulation can produce a recruitment maximum at intermediate spawning stock levels318due to cannibalism or disease transmission.319\end{definition}320321\section{Computational Analysis: Stock-Recruitment}322323We analyze stock-recruitment relationships to identify critical thresholds for population324replacement and assess the risk of recruitment overfishing. The comparison of Beverton-Holt325and Ricker models illustrates how different density-dependent mechanisms affect population326stability and optimal spawning stock levels.327328\begin{pycode}329# Stock-recruitment parameters330alpha_BH = 50 # recruits per tonne SSB at low density331beta_BH = 0.01 # density dependence (tonne^-1)332alpha_Ricker = 20 # low-density productivity333beta_Ricker = 0.00005 # density dependence334335# Spawning stock biomass range336SSB = np.linspace(0, 50000, 500)337338# Beverton-Holt recruitment339R_BH = (alpha_BH * SSB) / (1 + beta_BH * SSB)340341# Ricker recruitment342R_Ricker = alpha_BH * SSB * np.exp(-beta_Ricker * SSB)343344# Replacement line (R = S with survival rate)345survival_rate = 0.05 # fraction of recruits surviving to spawn346replacement = SSB / survival_rate347348# Find equilibrium points349def find_equilibria(SSB_range, R_model, survival):350equil_points = []351R_vals = R_model(SSB_range) if callable(R_model) else R_model352for i in range(len(SSB_range) - 1):353if (R_vals[i] * survival - SSB_range[i]) * (R_vals[i+1] * survival - SSB_range[i+1]) < 0:354equil_points.append(SSB_range[i])355return equil_points356357# Spawning potential ratio (SPR) analysis358fishing_mortality = np.linspace(0, 2.0, 100)359SPR = np.exp(-fishing_mortality) # simplified SPR360reference_SPR = np.exp(-0.4) # F40% reference point361362# Calculate recruits per spawning stock (R/S)363R_per_S_BH = R_BH / (SSB + 1e-6)364R_per_S_Ricker = R_Ricker / (SSB + 1e-6)365366# Find Ricker optimum367SSB_opt_Ricker = 1 / beta_Ricker368R_opt_Ricker = alpha_BH * SSB_opt_Ricker * np.exp(-1)369370# Create second figure: stock-recruitment371fig2 = plt.figure(figsize=(14, 10))372373# Plot 1: Stock-recruitment curves374ax1 = fig2.add_subplot(2, 3, 1)375ax1.plot(SSB, R_BH, 'b-', linewidth=2.5, label='Beverton-Holt')376ax1.plot(SSB, R_Ricker, 'g-', linewidth=2.5, label='Ricker')377ax1.plot(SSB, replacement, 'r--', linewidth=2, alpha=0.7, label='Replacement')378ax1.scatter([SSB_opt_Ricker], [R_opt_Ricker], s=150, c='green', marker='o',379zorder=5, edgecolor='black', label='Ricker optimum')380ax1.set_xlabel('Spawning Stock Biomass (tonnes)', fontsize=11)381ax1.set_ylabel('Recruitment (millions of individuals)', fontsize=11)382ax1.set_title('Stock-Recruitment Relationships', fontsize=12, fontweight='bold')383ax1.legend(fontsize=9)384ax1.grid(True, alpha=0.3)385386# Plot 2: Recruits per spawner387ax2 = fig2.add_subplot(2, 3, 2)388ax2.plot(SSB, R_per_S_BH, 'b-', linewidth=2.5, label='Beverton-Holt')389ax2.plot(SSB, R_per_S_Ricker, 'g-', linewidth=2.5, label='Ricker')390ax2.axhline(y=1/survival_rate, color='red', linestyle='--', linewidth=2, alpha=0.7,391label='Replacement level')392ax2.set_xlabel('Spawning Stock Biomass (tonnes)', fontsize=11)393ax2.set_ylabel('Recruits per Tonne SSB', fontsize=11)394ax2.set_title('Density-Dependent Recruitment', fontsize=12, fontweight='bold')395ax2.legend(fontsize=9)396ax2.grid(True, alpha=0.3)397ax2.set_ylim(0, 60)398399# Plot 3: Phase diagram (SSB dynamics)400ax3 = fig2.add_subplot(2, 3, 3)401SSB_next_BH = R_BH * survival_rate402SSB_next_Ricker = R_Ricker * survival_rate403ax3.plot(SSB, SSB_next_BH, 'b-', linewidth=2.5, label='Beverton-Holt')404ax3.plot(SSB, SSB_next_Ricker, 'g-', linewidth=2.5, label='Ricker')405ax3.plot(SSB, SSB, 'r--', linewidth=2, alpha=0.7, label='1:1 line')406ax3.fill_between(SSB, 0, SSB_next_BH, where=(SSB_next_BH > SSB),407alpha=0.2, color='green', label='Increasing')408ax3.fill_between(SSB, 0, SSB_next_BH, where=(SSB_next_BH < SSB),409alpha=0.2, color='red', label='Decreasing')410ax3.set_xlabel('Current SSB (tonnes)', fontsize=11)411ax3.set_ylabel('Next Generation SSB (tonnes)', fontsize=11)412ax3.set_title('Population Dynamics Phase Diagram', fontsize=12, fontweight='bold')413ax3.legend(fontsize=8, loc='upper left')414ax3.grid(True, alpha=0.3)415416# Plot 4: Spawning potential ratio417ax4 = fig2.add_subplot(2, 3, 4)418ax4.plot(fishing_mortality, SPR * 100, 'b-', linewidth=2.5)419ax4.axhline(y=40, color='red', linestyle='--', linewidth=2, alpha=0.7,420label='F40% reference')421ax4.axhline(y=20, color='orange', linestyle='--', linewidth=2, alpha=0.7,422label='F20% limit')423ax4.fill_between(fishing_mortality, 0, SPR * 100, where=(SPR * 100 < 20),424alpha=0.3, color='red', label='Overfished')425ax4.set_xlabel('Fishing Mortality Rate (year$^{-1}$)', fontsize=11)426ax4.set_ylabel('Spawning Potential Ratio (\\%)', fontsize=11)427ax4.set_title('SPR-Based Reference Points', fontsize=12, fontweight='bold')428ax4.legend(fontsize=9)429ax4.grid(True, alpha=0.3)430ax4.set_xlim(0, 2)431432# Plot 5: Recruitment with environmental stochasticity433ax5 = fig2.add_subplot(2, 3, 5)434np.random.seed(123)435n_years = 50436SSB_sim = np.zeros(n_years)437R_sim = np.zeros(n_years)438SSB_sim[0] = 20000439sigma_R = 0.4 # recruitment variability440441for year in range(n_years - 1):442R_mean = (alpha_BH * SSB_sim[year]) / (1 + beta_BH * SSB_sim[year])443R_sim[year] = R_mean * np.exp(sigma_R * np.random.randn() - 0.5 * sigma_R**2)444SSB_sim[year + 1] = R_sim[year] * survival_rate * 0.7 # with fishing445446ax5.plot(range(n_years), SSB_sim, 'b-', linewidth=2, label='SSB')447ax5_twin = ax5.twinx()448ax5_twin.bar(range(n_years - 1), R_sim[:-1], alpha=0.5, color='green', label='Recruitment')449ax5.axhline(y=B_MSY/5, color='red', linestyle='--', linewidth=1.5, alpha=0.7,450label='Limit reference')451ax5.set_xlabel('Year', fontsize=11)452ax5.set_ylabel('SSB (tonnes)', color='blue', fontsize=11)453ax5_twin.set_ylabel('Recruitment (millions)', color='green', fontsize=11)454ax5.set_title('Stochastic Recruitment Simulation', fontsize=12, fontweight='bold')455ax5.legend(loc='upper left', fontsize=9)456ax5_twin.legend(loc='upper right', fontsize=9)457ax5.grid(True, alpha=0.3)458459# Plot 6: Allee effect threshold460ax6 = fig2.add_subplot(2, 3, 6)461# Modified Ricker with Allee effect462SSB_allee = np.linspace(0, 50000, 500)463S_critical = 5000 # critical depensation threshold464allee_factor = SSB_allee / (SSB_allee + S_critical)465R_allee = alpha_BH * SSB_allee * np.exp(-beta_Ricker * SSB_allee) * allee_factor466467ax6.plot(SSB_allee, R_allee * survival_rate, 'purple', linewidth=2.5,468label='With Allee effect')469ax6.plot(SSB, R_Ricker * survival_rate, 'g--', linewidth=2, alpha=0.6,470label='Without Allee effect')471ax6.plot(SSB_allee, SSB_allee, 'r--', linewidth=2, alpha=0.7, label='Replacement')472ax6.axvline(x=S_critical, color='orange', linestyle=':', linewidth=2, alpha=0.7,473label=f'Critical threshold')474ax6.fill_between(SSB_allee, 0, 50000, where=(SSB_allee < S_critical),475alpha=0.2, color='red', label='Collapse risk')476ax6.set_xlabel('Spawning Stock Biomass (tonnes)', fontsize=11)477ax6.set_ylabel('Next Generation SSB (tonnes)', fontsize=11)478ax6.set_title('Depensation and Allee Effects', fontsize=12, fontweight='bold')479ax6.legend(fontsize=8, loc='upper left')480ax6.grid(True, alpha=0.3)481482plt.tight_layout()483plt.savefig('fisheries_models_recruitment.pdf', dpi=150, bbox_inches='tight')484plt.close()485\end{pycode}486487\begin{figure}[htbp]488\centering489\includegraphics[width=\textwidth]{fisheries_models_recruitment.pdf}490\caption{Stock-recruitment analysis demonstrating density-dependent recruitment dynamics491in fish populations. The Beverton-Holt model shows asymptotic recruitment approaching a492maximum, while the Ricker model exhibits overcompensation with peak recruitment at493\py{f"{SSB_opt_Ricker:.0f}"} tonnes of spawning stock. Phase diagrams reveal stable494equilibria and population trajectories under fishing. The spawning potential ratio (SPR)495framework identifies F40\% as a precautionary reference point maintaining recruitment496capacity. Stochastic simulations show recruitment variability's impact on stock dynamics,497while Allee effect analysis demonstrates critical thresholds below \py{f"{S_critical:.0f}"}498tonnes where recruitment failure becomes likely.}499\label{fig:recruitment}500\end{figure}501502Stock-recruitment analysis demonstrates that maintaining spawning stock above critical503thresholds is essential for population persistence. The Beverton-Holt formulation suggests504resilience to overfishing, while the Ricker model with Allee effects reveals collapse505risk when spawning biomass falls below \py{f"{S_critical:.0f}"} tonnes.506507\section{Age-Structured Models: Yield-Per-Recruit}508509Age-structured models explicitly track cohorts through their life history, accounting510for size-dependent growth, natural mortality, and fishing selectivity. Yield-per-recruit511(YPR) analysis optimizes fishing patterns to maximize lifetime catch from each cohort.512513\begin{pycode}514# Age-structured model parameters515ages = np.arange(0, 21) # age classes 0-20 years516L_inf = 80 # asymptotic length (cm)517K_growth = 0.15 # von Bertalanffy growth coefficient518t0 = -1.0 # theoretical age at zero length519a_length_weight = 0.01 # length-weight coefficient520b_length_weight = 3.0 # length-weight exponent521M = 0.2 # natural mortality (year^-1)522523# Fishing mortality rates to test524F_values = np.linspace(0, 1.5, 100)525526# Selectivity (logistic with 50% selection at age 3)527age_50 = 3.0528selectivity_slope = 1.5529selectivity = 1 / (1 + np.exp(-selectivity_slope * (ages - age_50)))530531# von Bertalanffy growth532lengths = L_inf * (1 - np.exp(-K_growth * (ages - t0)))533weights = a_length_weight * lengths**b_length_weight / 1000 # kg534535# Calculate yield-per-recruit for different F536YPR = np.zeros(len(F_values))537SPR_values = np.zeros(len(F_values))538539for i, F in enumerate(F_values):540survivors = np.zeros(len(ages))541survivors[0] = 1.0 # start with 1 recruit542543cumulative_catch = 0544cumulative_spawners = 0545546for age_idx in range(1, len(ages)):547F_age = F * selectivity[age_idx]548Z = M + F_age # total mortality549survivors[age_idx] = survivors[age_idx - 1] * np.exp(-Z)550catch = survivors[age_idx - 1] * (F_age / Z) * (1 - np.exp(-Z))551cumulative_catch += catch * weights[age_idx]552cumulative_spawners += survivors[age_idx] * weights[age_idx]553554YPR[i] = cumulative_catch555SPR_values[i] = cumulative_spawners556557# Find F_max and F_0.1558F_max_idx = np.argmax(YPR)559F_max = F_values[F_max_idx]560561# F_0.1: fishing mortality where slope is 10% of origin slope562origin_slope = (YPR[1] - YPR[0]) / (F_values[1] - F_values[0])563target_slope = 0.1 * origin_slope564slopes = np.diff(YPR) / np.diff(F_values)565F_01_idx = np.argmin(np.abs(slopes - target_slope))566F_01 = F_values[F_01_idx]567568# F_40: fishing mortality giving 40% SPR569SPR_unfished = SPR_values[0]570SPR_40_target = 0.4 * SPR_unfished571F_40_idx = np.argmin(np.abs(SPR_values - SPR_40_target))572F_40 = F_values[F_40_idx]573574# Create third figure: age-structured analysis575fig3 = plt.figure(figsize=(14, 10))576577# Plot 1: Growth curve578ax1 = fig3.add_subplot(2, 3, 1)579ax1.plot(ages, lengths, 'b-', linewidth=2.5)580ax1.axhline(y=L_inf, color='red', linestyle='--', linewidth=1.5, alpha=0.7,581label=f'$L_\\infty$ = {L_inf} cm')582ax1.scatter(ages[::2], lengths[::2], s=50, c='blue', edgecolor='black', zorder=5)583ax1.set_xlabel('Age (years)', fontsize=11)584ax1.set_ylabel('Length (cm)', fontsize=11)585ax1.set_title('von Bertalanffy Growth Curve', fontsize=12, fontweight='bold')586ax1.legend(fontsize=9)587ax1.grid(True, alpha=0.3)588589# Plot 2: Weight-at-age590ax2 = fig3.add_subplot(2, 3, 2)591ax2.plot(ages, weights, 'g-', linewidth=2.5)592ax2.scatter(ages[::2], weights[::2], s=50, c='green', edgecolor='black', zorder=5)593ax2.set_xlabel('Age (years)', fontsize=11)594ax2.set_ylabel('Weight (kg)', fontsize=11)595ax2.set_title('Weight-at-Age', fontsize=12, fontweight='bold')596ax2.grid(True, alpha=0.3)597598# Plot 3: Selectivity curve599ax3 = fig3.add_subplot(2, 3, 3)600ax3.plot(ages, selectivity, 'purple', linewidth=2.5)601ax3.axhline(y=0.5, color='gray', linestyle=':', linewidth=1.5, alpha=0.7)602ax3.axvline(x=age_50, color='gray', linestyle=':', linewidth=1.5, alpha=0.7,603label=f'$a_{{50}}$ = {age_50} years')604ax3.set_xlabel('Age (years)', fontsize=11)605ax3.set_ylabel('Selectivity', fontsize=11)606ax3.set_title('Fishing Gear Selectivity', fontsize=12, fontweight='bold')607ax3.legend(fontsize=9)608ax3.grid(True, alpha=0.3)609ax3.set_ylim(0, 1.1)610611# Plot 4: Yield-per-recruit curve612ax4 = fig3.add_subplot(2, 3, 4)613ax4.plot(F_values, YPR, 'b-', linewidth=2.5)614ax4.scatter([F_max], [YPR[F_max_idx]], s=200, c='red', marker='*', zorder=5,615edgecolor='black', label=f'$F_{{max}}$ = {F_max:.3f}')616ax4.scatter([F_01], [YPR[F_01_idx]], s=150, c='orange', marker='o', zorder=5,617edgecolor='black', label=f'$F_{{0.1}}$ = {F_01:.3f}')618ax4.axvline(x=F_max, color='red', linestyle='--', linewidth=1.5, alpha=0.5)619ax4.axvline(x=F_01, color='orange', linestyle='--', linewidth=1.5, alpha=0.5)620ax4.axvline(x=F_40, color='green', linestyle='--', linewidth=1.5, alpha=0.5,621label=f'$F_{{40}}$ = {F_40:.3f}')622ax4.set_xlabel('Fishing Mortality (year$^{-1}$)', fontsize=11)623ax4.set_ylabel('Yield-per-Recruit (kg)', fontsize=11)624ax4.set_title('Yield-per-Recruit Analysis', fontsize=12, fontweight='bold')625ax4.legend(fontsize=9, loc='upper right')626ax4.grid(True, alpha=0.3)627628# Plot 5: Spawning potential ratio629ax5 = fig3.add_subplot(2, 3, 5)630ax5.plot(F_values, SPR_values / SPR_unfished * 100, 'g-', linewidth=2.5)631ax5.axhline(y=40, color='red', linestyle='--', linewidth=2, alpha=0.7,632label='40% SPR reference')633ax5.axhline(y=20, color='orange', linestyle='--', linewidth=2, alpha=0.7,634label='20% SPR limit')635ax5.axvline(x=F_40, color='green', linestyle='--', linewidth=1.5, alpha=0.5)636ax5.fill_between(F_values, 0, SPR_values / SPR_unfished * 100,637where=(SPR_values / SPR_unfished * 100 < 20),638alpha=0.3, color='red', label='Overfished')639ax5.set_xlabel('Fishing Mortality (year$^{-1}$)', fontsize=11)640ax5.set_ylabel('Spawning Potential Ratio (\\%)', fontsize=11)641ax5.set_title('SPR vs Fishing Mortality', fontsize=12, fontweight='bold')642ax5.legend(fontsize=9)643ax5.grid(True, alpha=0.3)644ax5.set_xlim(0, 1.5)645646# Plot 6: Cohort survival647ax6 = fig3.add_subplot(2, 3, 6)648F_test_values = [0, 0.2, 0.5, 1.0]649colors_cohort = plt.cm.plasma(np.linspace(0.2, 0.9, len(F_test_values)))650651for i, F in enumerate(F_test_values):652survivors_cohort = np.zeros(len(ages))653survivors_cohort[0] = 1000 # cohort size654for age_idx in range(1, len(ages)):655F_age = F * selectivity[age_idx]656Z = M + F_age657survivors_cohort[age_idx] = survivors_cohort[age_idx - 1] * np.exp(-Z)658ax6.plot(ages, survivors_cohort, linewidth=2.5, color=colors_cohort[i],659label=f'F = {F:.2f}')660661ax6.set_xlabel('Age (years)', fontsize=11)662ax6.set_ylabel('Cohort Survivors', fontsize=11)663ax6.set_title('Cohort Survival Curves', fontsize=12, fontweight='bold')664ax6.legend(fontsize=9)665ax6.grid(True, alpha=0.3)666ax6.set_yscale('log')667668plt.tight_layout()669plt.savefig('fisheries_models_age_structured.pdf', dpi=150, bbox_inches='tight')670plt.close()671\end{pycode}672673\begin{figure}[htbp]674\centering675\includegraphics[width=\textwidth]{fisheries_models_age_structured.pdf}676\caption{Age-structured fisheries analysis incorporating von Bertalanffy growth,677weight-at-age relationships, and logistic gear selectivity. Yield-per-recruit (YPR)678analysis identifies optimal fishing mortality at F\textsubscript{max} = \py{f"{F_max:.3f}"}679year\textsuperscript{-1}, though the more precautionary F\textsubscript{0.1} reference680point of \py{f"{F_01:.3f}"} is recommended to account for recruitment uncertainty.681Spawning potential ratio (SPR) analysis shows that F\textsubscript{40} = \py{f"{F_40:.3f}"}682maintains 40\% of unfished spawning biomass. Cohort survival curves demonstrate the683exponential decay of abundance with age under different fishing pressure levels, with684natural mortality M = \py{f"{M:.2f}"} year\textsuperscript{-1} representing baseline685mortality from predation, disease, and senescence.}686\label{fig:age_structured}687\end{figure}688689Yield-per-recruit analysis demonstrates that fishing mortality of \py{f"{F_max:.3f}"}690year\textsuperscript{-1} maximizes catch per cohort, but the F\textsubscript{0.1}691reference point of \py{f"{F_01:.3f}"} provides a more sustainable target that maintains692spawning potential and accounts for recruitment variability in fluctuating environments.693694\section{Results Summary}695696\begin{pycode}697print(r"\begin{table}[htbp]")698print(r"\centering")699print(r"\caption{Key Fisheries Reference Points and Model Parameters}")700print(r"\begin{tabular}{llc}")701print(r"\toprule")702print(r"Model & Parameter & Value \\")703print(r"\midrule")704print(f"Schaefer & MSY & {MSY:.0f} tonnes/year \\\\")705print(f" & Biomass at MSY & {B_MSY:.0f} tonnes \\\\")706print(f" & Optimal effort & {E_MSY:.0f} boat-days/year \\\\")707print(f" & Fishing mortality at MSY & {q * E_MSY:.3f} year$^{{-1}}$ \\\\")708print(r"\midrule")709print(f"Stock-Recruitment & Beverton-Holt $\\alpha$ & {alpha_BH:.1f} recruits/tonne \\\\")710print(f" & Critical SSB threshold & {S_critical:.0f} tonnes \\\\")711print(f" & Ricker optimum SSB & {SSB_opt_Ricker:.0f} tonnes \\\\")712print(r"\midrule")713print(f"Age-Structured & $F_{{max}}$ & {F_max:.3f} year$^{{-1}}$ \\\\")714print(f" & $F_{{0.1}}$ & {F_01:.3f} year$^{{-1}}$ \\\\")715print(f" & $F_{{40\\%}}$ (SPR) & {F_40:.3f} year$^{{-1}}$ \\\\")716print(f" & Age at 50\\% selectivity & {age_50:.1f} years \\\\")717print(f" & Natural mortality & {M:.2f} year$^{{-1}}$ \\\\")718print(f" & Asymptotic length & {L_inf:.0f} cm \\\\")719print(r"\bottomrule")720print(r"\end{tabular}")721print(r"\label{tab:reference_points}")722print(r"\end{table}")723\end{pycode}724725\section{Discussion and Management Implications}726727\begin{remark}[Precautionary Approach]728Modern fisheries management adopts precautionary reference points that account for729scientific uncertainty. While F\textsubscript{max} maximizes yield-per-recruit, the730F\textsubscript{0.1} and F\textsubscript{40\%} reference points provide buffers against731recruitment failure and environmental variability. The comparison reveals that sustainable732fishing mortality should be approximately \py{f"{F_01:.3f}"} year\textsuperscript{-1},733substantially below levels that would maximize short-term catch.734\end{remark}735736\begin{example}[Rebuilding Overfished Stocks]737For a stock depleted to 15\% of carrying capacity (below the overfished threshold of 20\%),738managers must reduce fishing effort from current levels to allow biomass recovery. Setting739effort below \py{f"{E_MSY/2:.0f}"} boat-days/year creates positive population growth,740enabling stock rebuilding to MSY biomass levels within 10-15 years depending on741recruitment strength.742\end{example}743744\subsection{Climate Change Considerations}745746Climate-driven changes in ocean temperature and productivity affect all model parameters.747Warming waters may increase growth rates (higher $r$ and $K$) for some species while748reducing carrying capacity for others. Stock-recruitment relationships become more749variable as environmental stochasticity increases, necessitating lower target fishing750mortality rates to maintain resilience.751752\subsection{Ecosystem-Based Fisheries Management}753754Single-species models provide essential guidance but ignore predator-prey interactions,755habitat degradation, and multispecies harvesting effects. Integrated ecosystem models756extending these frameworks account for trophic dynamics, making harvest recommendations757that sustain ecosystem function rather than maximizing yield from individual species.758759\section{Conclusions}760761This comprehensive analysis of fisheries population models demonstrates:762763\begin{enumerate}764\item The Schaefer surplus production model predicts maximum sustainable yield of765\py{f"{MSY:.0f}"} tonnes/year at optimal fishing effort of \py{f"{E_MSY:.0f}"}766boat-days/year, with equilibrium biomass at 50\% of carrying capacity767768\item Stock-recruitment analysis reveals critical spawning biomass thresholds below which769recruitment fails, with the Allee effect creating a collapse threshold at770\py{f"{S_critical:.0f}"} tonnes for this stock771772\item Yield-per-recruit analysis identifies F\textsubscript{0.1} = \py{f"{F_01:.3f}"}773year\textsuperscript{-1} as the precautionary fishing mortality target, maintaining774spawning potential while approaching maximum catch efficiency775776\item Age-structured models incorporating growth, selectivity, and natural mortality777provide more realistic management advice than biomass-only models, particularly for778long-lived species with delayed maturity779\end{enumerate}780781Sustainable fisheries management requires maintaining spawning stock above critical782thresholds, limiting fishing mortality to precautionary levels below F\textsubscript{MSY},783and adapting to environmental change through regular stock assessments. The models784presented here form the scientific foundation for Total Allowable Catch (TAC) limits,785effort restrictions, and rebuilding plans that sustain both fish populations and fishing786communities.787788\section*{References}789790\begin{itemize}791\item Schaefer, M. B. (1954). Some aspects of the dynamics of populations important to792the management of commercial marine fisheries. \textit{Bulletin of the Inter-American793Tropical Tuna Commission}, 1(2), 27-56.794795\item Beverton, R. J. H., \& Holt, S. J. (1957). \textit{On the Dynamics of Exploited796Fish Populations}. Chapman and Hall, London.797798\item Ricker, W. E. (1954). Stock and recruitment. \textit{Journal of the Fisheries799Research Board of Canada}, 11(5), 559-623.800801\item Hilborn, R., \& Walters, C. J. (1992). \textit{Quantitative Fisheries Stock802Assessment: Choice, Dynamics and Uncertainty}. Chapman and Hall, New York.803804\item Quinn, T. J., \& Deriso, R. B. (1999). \textit{Quantitative Fish Dynamics}.805Oxford University Press, Oxford.806807\item Fox, W. W. (1970). An exponential surplus-yield model for optimizing exploited808fish populations. \textit{Transactions of the American Fisheries Society}, 99(1), 80-88.809810\item Clark, C. W. (1990). \textit{Mathematical Bioeconomics: The Optimal Management811of Renewable Resources}, 2nd ed. Wiley-Interscience, New York.812813\item Haddon, M. (2011). \textit{Modelling and Quantitative Methods in Fisheries}, 2nd ed.814Chapman \& Hall/CRC Press, Boca Raton.815816\item Walters, C., \& Martell, S. J. D. (2004). \textit{Fisheries Ecology and Management}.817Princeton University Press, Princeton.818819\item Mace, P. M., \& Sissenwine, M. P. (1993). How much spawning per recruit is enough?820\textit{Canadian Special Publication of Fisheries and Aquatic Sciences}, 120, 101-118.821822\item Punt, A. E., \& Smith, A. D. M. (1999). Harvest strategy evaluation for the823eastern stock of gemfish (\textit{Rexea solandri}). \textit{ICES Journal of Marine824Science}, 56(6), 860-875.825826\item Goodyear, C. P. (1993). Spawning stock biomass per recruit in fisheries management:827foundation and current use. \textit{Canadian Special Publication of Fisheries and Aquatic828Sciences}, 120, 67-81.829830\item Myers, R. A., Barrowman, N. J., Hutchings, J. A., \& Rosenberg, A. A. (1995).831Population dynamics of exploited fish stocks at low population levels. \textit{Science},832269(5227), 1106-1108.833834\item Hilborn, R. (2007). Managing fisheries is managing people: what has been learned?835\textit{Fish and Fisheries}, 8(4), 285-296.836837\item Pauly, D., Christensen, V., Guénette, S., et al. (2002). Towards sustainability838in world fisheries. \textit{Nature}, 418(6898), 689-695.839840\item Worm, B., Hilborn, R., Baum, J. K., et al. (2009). Rebuilding global fisheries.841\textit{Science}, 325(5940), 578-585.842843\item Costello, C., Ovando, D., Hilborn, R., et al. (2012). Status and solutions for844the world's unassessed fisheries. \textit{Science}, 338(6106), 517-520.845846\item Thorson, J. T., Minto, C., Minte-Vera, C. V., Kleisner, K. M., \& Longo, C. (2013).847A new role for effort dynamics in the theory of harvested populations and data-poor stock848assessment. \textit{Canadian Journal of Fisheries and Aquatic Sciences}, 70(12), 1829-1844.849850\item Free, C. M., Thorson, J. T., Pinsky, M. L., et al. (2019). Impacts of historical851warming on marine fisheries production. \textit{Science}, 363(6430), 979-983.852853\item Froese, R., Winker, H., Coro, G., et al. (2018). Status and rebuilding of European854fisheries. \textit{Marine Policy}, 93, 159-170.855\end{itemize}856857\end{document}858859860