{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "54d92fe8",
   "metadata": {},
   "source": [
    "# Choosing and Using Solvers\n",
    "\n",
    "`braincell.quad` ships a family of numerical integrators. This page shows how\n",
    "to discover them, the two ways to apply them, and — most importantly — how to\n",
    "choose one for the *stiff* dynamics that are typical of biophysical neurons."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "657ea5ec",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-05-25T08:59:25.036700Z",
     "iopub.status.busy": "2026-05-25T08:59:25.036408Z",
     "iopub.status.idle": "2026-05-25T08:59:28.311264Z",
     "shell.execute_reply": "2026-05-25T08:59:28.310481Z"
    }
   },
   "outputs": [],
   "source": [
    "import brainstate\n",
    "import brainunit as u\n",
    "import numpy as np\n",
    "import jax.numpy as jnp\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import braincell\n",
    "from braincell import DiffEqState, DiffEqModule"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c1f9e560",
   "metadata": {},
   "source": [
    "## The solver catalog\n",
    "\n",
    "Integrators are grouped into categories. We can read them straight out of the\n",
    "registry."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "27424c45",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-05-25T08:59:28.313786Z",
     "iopub.status.busy": "2026-05-25T08:59:28.313348Z",
     "iopub.status.idle": "2026-05-25T08:59:28.318000Z",
     "shell.execute_reply": "2026-05-25T08:59:28.317260Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    explicit : ['euler', 'heun2', 'heun3', 'midpoint', 'ralston2', 'ralston3', 'ralston4', 'rk2', 'rk3', 'rk4', 'ssprk3']\n",
      " exponential : ['exp_euler', 'exp_exp_euler', 'ind_exp_euler']\n",
      "    implicit : ['backward_euler', 'cn_exp_euler', 'cn_rk4', 'implicit_euler', 'implicit_exp_euler', 'implicit_rk4', 'splitting']\n",
      "   staggered : ['staggered']\n",
      "     voltage : ['dhs_voltage']\n"
     ]
    }
   ],
   "source": [
    "registry = braincell.quad.get_registry()\n",
    "\n",
    "by_cat = {}\n",
    "for name in registry.names():\n",
    "    entry = registry.entry(name)\n",
    "    by_cat.setdefault(entry.category, []).append(name)\n",
    "\n",
    "for category, names in sorted(by_cat.items()):\n",
    "    print(f\"{category:>12} : {sorted(names)}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b53c0ea2",
   "metadata": {},
   "source": [
    "The families, in rough order of how often you reach for them in neural\n",
    "modeling:\n",
    "\n",
    "| Category | Examples | Character |\n",
    "| --- | --- | --- |\n",
    "| `explicit` | `euler`, `midpoint`, `rk2/3/4`, `heun*`, `ralston*`, `ssprk3` | Classical Runge-Kutta. Cheap per step, high order available, but only *conditionally* stable — small `dt` required for stiff systems. |\n",
    "| `exponential` | `exp_euler`, `ind_exp_euler`, `exp_exp_euler` | Treat the fast linear part exactly. Stable at large `dt` for the stiff gating dynamics of Hodgkin-Huxley neurons. The workhorse for point neurons. |\n",
    "| `implicit` | `backward_euler`, `implicit_euler/rk4`, `cn_*`, `splitting` | Solve an implicit equation each step. Strong stability for very stiff problems at the cost of per-step linear solves. |\n",
    "| `staggered`, `voltage` | `staggered`, `dhs_voltage` | Specialised schemes for multi-compartment cable equations. |"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "53132646",
   "metadata": {},
   "source": [
    "## Two ways to apply a solver\n",
    "\n",
    "### 1. High-level: `solver=` on a cell\n",
    "\n",
    "For a full neuron model you simply name the solver at construction. `braincell`\n",
    "wires the lifecycle and stepping for you. Below is a minimal Hodgkin-Huxley\n",
    "point neuron (the same recipe used in the single-compartment examples)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "6a70b1a7",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-05-25T08:59:28.320027Z",
     "iopub.status.busy": "2026-05-25T08:59:28.319807Z",
     "iopub.status.idle": "2026-05-25T08:59:32.385464Z",
     "shell.execute_reply": "2026-05-25T08:59:32.384617Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk4AAAE1CAYAAAARVG9qAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAX19JREFUeJzt3Xl8U1X6P/BP9jZN0qY7hS7sqygWrQi4gVTEmVFRXFBB+aqjMC7ghjqK4yiKjOugIr+vyDg4uI1fR1TGyiYqIrIoi5S1tFLaUrqka5rmnt8fadKma5Le2zTt5/165VV6c5uc3l5yn3vOc56jEkIIEBEREVGH1MFuABEREVGoYOBERERE5CMGTkREREQ+YuBERERE5CMGTkREREQ+YuBERERE5CMGTkREREQ+YuBERERE5CMGTkREREQ+YuBERL3Gpk2boFKpsGnTpmA3hfwwe/ZspKWlBbsZRAAYOBG16p133oFKpcJPP/3U6vMXXXQRRo0a5bUtLS0NV1xxRav7uy/YH330kextpZ7voosuwuzZs4PdjB4nLS0NixYtCnYzKMQwcCIiIiLyEQMnImqTJEmora0NdjNCXlVVVbCbQA2EEKipqQl2MyiEMXAi6kbcQ3offPABnnnmGfTr1w9hYWGYNGkSDh8+3GL/bdu24bLLLkNkZCSMRiMuvPBCfPfdd177tJUfsmjRIqhUKq9tKpUK8+bNw+rVqzFy5EgYDAasW7cOALBr1y5MnToVFosFJpMJkyZNwg8//OD18+4hzu+++w7z589HXFwcIiIicNVVV+HUqVMBH5fXXnsNI0eOhNFohNVqxdixY/Hee+957eNL+5qbN28eTCYTqqurWzx3ww03IDExEU6n07Ptyy+/xMSJExEREQGz2Yxp06Zh3759Xj83e/ZsmEwmHDlyBJdffjnMZjNmzpwZ8O/eFrvdjieffBKDBg2CwWBAcnIyHnroIdjtds8+s2bNQlhYGH799Vevn83MzITVakV+fj6Axr/bN998gzvvvBMxMTGwWCy45ZZbUFpa6nfbTpw4gdtuuw0JCQkwGAwYOXIk3n77ba993O+Zk5Pjtd3XPDRJkvDyyy9j5MiRCAsLQ0JCAu68884W7XUPof/3v//F2LFjER4ejuXLl/v9OxG5aYPdAKLurLy8HMXFxS22OxyOVvd3OByt7l9eXu7X+z733HNQq9V44IEHUF5ejiVLlmDmzJnYtm2bZ58NGzZg6tSpSE9Px5NPPgm1Wo2VK1fikksuwZYtW3Duuef69Z5NX/eDDz7AvHnzEBsbi7S0NOzbtw8TJ06ExWLBQw89BJ1Oh+XLl+Oiiy7C5s2bkZGR4fUaf/rTn2C1WvHkk08iJycHL7/8MubNm4f333/f7/asWLEC99xzD6655hrce++9qK2txS+//IJt27bhxhtvBAC/2+d23XXXYdmyZfj8889x7bXXerZXV1fjs88+w+zZs6HRaAAA7777LmbNmoXMzEw8//zzqK6uxhtvvIEJEyZg165dXsFpfX09MjMzMWHCBCxduhRGo9Hzuq0Fac1pNBpYrdY2n5ckCb///e/x7bff4o477sDw4cOxZ88evPTSSzh48CD+7//+DwDwyiuvYMOGDZg1axa2bt0KjUaD5cuX46uvvsK7776LpKQkr9edN28eoqKisGjRImRnZ+ONN97A8ePHPcGMLwoLC3Heeed5gvC4uDh8+eWXmDNnDmw2G+677z6fXqcjd955J9555x3ceuutuOeee3Ds2DH8/e9/x65du/Ddd99Bp9N59s3OzsYNN9yAO++8E7fffjuGDh0qSxuolxJE1MLKlSsFgHYfI0eO9PqZ1NTUDn/mww8/bPd9N27cKACI4cOHC7vd7tn+yiuvCABiz549QgghJEkSgwcPFpmZmUKSJM9+1dXVon///uLSSy/1bJs1a5ZITU1t8V5PPvmkaP4RAECo1Wqxb98+r+1XXnml0Ov14siRI55t+fn5wmw2iwsuuKDFcZs8ebJXu+6//36h0WhEWVlZu79/a/7whz+0ONbN+do+9/HduHGjEMJ1HPv27SumT5/u9XoffPCBACC++eYbIYQQFRUVIioqStx+++1e+xUUFIjIyEiv7bNmzRIAxCOPPNKine5j3tGjtb9XU++++65Qq9Viy5YtXtvffPNNAUB89913nm3//e9/BQDx17/+VRw9elSYTCZx5ZVXev2c+++Wnp4u6urqPNuXLFkiAIhPP/203fY0NWfOHNGnTx9RXFzstf36668XkZGRorq62us9jx075rVf87+REC3P4S1btggAYvXq1V4/u27duhbb3f8v161b5/PvQNQe9jgRtWPZsmUYMmRIi+0LFizwGsJxy8jIwF//+tcW23/++Wc88MADPr/vrbfeCr1e7/l+4sSJAICjR49i1KhR2L17Nw4dOoTHH38cp0+f9vrZSZMm4d1334UkSVCr/R+Nv/DCCzFixAjP906nE1999RWuvPJKDBgwwLO9T58+uPHGG7FixQrYbDZYLBbPc3fccYdXD8XEiRPx0ksv4fjx4xg9erRf7YmKisJvv/2G7du345xzzmnxfCDtc1OpVLj22muxfPlyVFZWwmQyAQDef/999O3bFxMmTAAAZGVloaysDDfccINXj6JGo0FGRgY2btzY4rXvuuuuFttuueUWz2u2Jzw8vN3nP/zwQwwfPhzDhg3zas8ll1wCANi4cSPOP/98AMCUKVNw55134i9/+Qs++ugjhIWFtTlUdccdd3j11Nx111149NFH8cUXX+D3v/99h+0WQuDjjz/GjBkzIITwaltmZibWrFmDnTt3Yvz48R2+Vns+/PBDREZG4tJLL/V6j/T0dJhMJmzcuNHTGwkA/fv3R2ZmZqfek8iNgRNRO84991yMHTu2xXar1drqkFxsbCwmT57cYrtW699/tZSUlBbvB8CTv3Ho0CEArhyWtpSXl7c73NOW/v37e31/6tQpVFdXtzq8MXz4cEiShLy8PIwcOdLn9vvj4Ycfxtdff41zzz0XgwYNwpQpU3DjjTd6Lr6BtK+p6667Di+//DL+85//4MYbb0RlZSW++OIL3HnnnZ7gz3283YFJc82DMq1Wi379+rXYb8CAAV7BXaAOHTqEX3/9FXFxca0+X1RU5PX90qVL8emnn2L37t147733EB8f3+rPDR482Ot7k8mEPn36tMhDasupU6dQVlaGt956C2+99ZZPbQvEoUOHUF5e3ubv0fw9mp/TRJ3BwImoG3Ln1TQnhADgynEBgBdeeAFnnXVWq/u6e0/ayk1prccM6Li3wxcdtd8fw4cPR3Z2NtauXYt169bh448/xuuvv44nnngCTz31VGebivPOOw9paWn44IMPcOONN+Kzzz5DTU0NrrvuOs8+7uP97rvvIjExscVrNA+MDQZDq719lZWVqKys7LBNGo2mzaDI3Z4zzjgDL774YqvPJycne32/a9cuTzCxZ88e3HDDDR22IRDu43TTTTe1GdS7exz9PS+bv098fDxWr17d6vPNj50c5zSRGwMnohA0cOBAAK6ejtZ6uJqyWq0oKytrsf348eM+vVdcXByMRiOys7Nb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+vUYN25cEFvWcwghMG/ePHzyySfYsGED+vfv7/V8eno6dDqd198gOzsbubm5/BsEaNKkSdizZw92797teYwdOxYzZ870/JvHXF7jx49vUWbj4MGDSE1NBQD0798fiYmJXsfcZrNh27ZtPOYBqq6uhlrtfZnUaDSQJAkAj3lX8OUYjxs3DmVlZdixY4dnnw0bNkCSJGRkZMjfKNnTzamFNWvWCIPBIN555x2xf/9+cccdd4ioqChRUFAQ7Kb1CHfddZeIjIwUmzZtEidPnvQ8qqurPfv88Y9/FCkpKWLDhg3ip59+EuPGjRPjxo0LYqt7nqaz6oTgMZfbjz/+KLRarXjmmWfEoUOHxOrVq4XRaBT//Oc/Pfs899xzIioqSnz66afil19+EX/4wx9E//79RU1NTRBbHrpmzZol+vbtK9auXSuOHTsm/v3vf4vY2Fjx0EMPefbhMe+8iooKsWvXLrFr1y4BQLz44oti165d4vjx40II347xZZddJsaMGSO2bdsmvv32WzF48GBxww03KNJeBk5d5LXXXhMpKSlCr9eLc889V/zwww/BblKPAaDVx8qVKz371NTUiLvvvltYrVZhNBrFVVddJU6ePBm8RvdAzQMnHnP5ffbZZ2LUqFHCYDCIYcOGibfeesvreUmSxJ///GeRkJAgDAaDmDRpksjOzg5Sa0OfzWYT9957r0hJSRFhYWFiwIAB4rHHHhN2u92zD495523cuLHVz/BZs2YJIXw7xqdPnxY33HCDMJlMwmKxiFtvvVVUVFQo0l6VEE1KoBIRERFRm5jjREREROQjBk5EREREPmLgREREROQjBk5EREREPmLgREREROQjBk5EREREPmLgREREROQjBk5EREREPmLgRETd2qZNm6BSqVosGNxV1q9fj+HDh8PpdCr2Hueddx4+/vhjxV6fiOTDyuFE1G1cdNFFOOuss/Dyyy97ttXV1aGkpAQJCQlQqVRd3qb09HTMnz8fM2fOVOw91q5di/vvvx/Z2dktFpUlou6F/0OJqFvT6/VITEwMStD07bff4siRI5g+fbqi7zN16lRUVFTgyy+/VPR9iKjzGDgRUbcwe/ZsbN68Ga+88gpUKhVUKhVycnJaDNW98847iIqKwtq1azF06FAYjUZcc801qK6uxqpVq5CWlgar1Yp77rnHa3jNbrfjgQceQN++fREREYGMjAxs2rSp3TatWbMGl156KcLCwjzbFi1ahLPOOgtvv/02UlJSYDKZcPfdd8PpdGLJkiVITExEfHw8nnnmGc/PCCGwaNEipKSkwGAwICkpCffcc4/neY1Gg8svvxxr1qyR52ASkWK0wW4AEREAvPLKKzh48CBGjRqFv/zlLwCAuLg45OTktNi3uroar776KtasWYOKigpcffXVuOqqqxAVFYUvvvgCR48exfTp0zF+/Hhcd911AIB58+Zh//79WLNmDZKSkvDJJ5/gsssuw549ezB48OBW27RlyxbceOONLbYfOXIEX375JdatW4cjR47gmmuuwdGjRzFkyBBs3rwZ33//PW677TZMnjwZGRkZ+Pjjj/HSSy9hzZo1GDlyJAoKCvDzzz97vea5556L5557rpNHkYiUxsCJiLqFyMhI6PV6GI1GJCYmtruvw+HAG2+8gYEDBwIArrnmGrz77rsoLCyEyWTCiBEjcPHFF2Pjxo247rrrkJubi5UrVyI3NxdJSUkAgAceeADr1q3DypUr8eyzz7b6PsePH/fs35QkSXj77bdhNps975WdnY0vvvgCarUaQ4cOxfPPP4+NGzciIyMDubm5SExMxOTJk6HT6ZCSkoJzzz3X6zWTkpKQl5cHSZKY50TUjfF/JxGFHKPR6AmaACAhIQFpaWkwmUxe24qKigAAe/bsgdPpxJAhQ2AymTyPzZs348iRI22+T01NjdcwnVtaWhrMZrPXe40YMcIr4Gn6/tdeey1qamowYMAA3H777fjkk09QX1/v9Zrh4eGQJAl2u93Po0FEXYk9TkQUcnQ6ndf3KpWq1W2SJAEAKisrodFosGPHDmg0Gq/9mgZbzcXGxqK0tLTT75+cnIzs7Gx8/fXXyMrKwt13340XXngBmzdv9vxcSUkJIiIiEB4e3t6vTkRBxsCJiLoNvV6vSL2kMWPGwOl0oqioCBMnTvTr5/bv3y9LG8LDw/G73/0Ov/vd7zB37lwMGzYMe/bswdlnnw0A2Lt3L8aMGSPLexGRchg4EVG3kZaWhm3btiEnJwcmkwnR0dGyvO6QIUMwc+ZM3HLLLfjb3/6GMWPG4NSpU1i/fj1Gjx6NadOmtfpzmZmZWLVqVaff/5133oHT6URGRgaMRiP++c9/Ijw8HKmpqZ59tmzZgilTpnT6vYhIWcxxIqJu44EHHoBGo8GIESMQFxeH3Nxc2V575cqVuOWWW7BgwQIMHToUV155JbZv346UlJQ2f2bmzJnYt28fsrOzO/XeUVFRWLFiBcaPH4/Ro0fj66+/xmeffYaYmBgAwIkTJ/D999/j1ltv7dT7EJHyWDmciKgdDz74IGw2G5YvX67Yezz88MMoLS3FW2+9pdh7EJE82ONERNSOxx57DKmpqZ5EbyXEx8fj6aefVuz1iUg+7HEiIiIi8hF7nIiIiIh8xMCJiIiIyEcMnIiIiIh8xMCJiIiIyEcMnIiIiIh8xMCJiIiIyEcMnIiIiIh8xMCJiIiIyEcMnIiIiIh89P8BQ558Tmz2sGQAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 600x320 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "class HH(braincell.SingleCompartment):\n",
    "    def __init__(self, size, solver=\"exp_euler\"):\n",
    "        super().__init__(size, solver=solver)\n",
    "        self.na = braincell.ion.SodiumFixed(size, E=50. * u.mV)\n",
    "        self.na.add(INa=braincell.channel.Na_HH1952(size))\n",
    "        self.k = braincell.ion.PotassiumFixed(size, E=-77. * u.mV)\n",
    "        self.k.add(IK=braincell.channel.K_HH1952(size))\n",
    "        self.IL = braincell.channel.IL(size, E=-54.387 * u.mV,\n",
    "                                       g_max=0.03 * (u.mS / u.cm ** 2))\n",
    "\n",
    "\n",
    "def simulate(solver, dt=0.1, t_end=100.):\n",
    "    neuron = HH(1, solver=solver)\n",
    "    neuron.init_state()\n",
    "\n",
    "    def step(t):\n",
    "        with brainstate.environ.context(t=t):\n",
    "            neuron.update(10. * u.nA / u.cm ** 2)   # constant drive\n",
    "        return neuron.V.value\n",
    "\n",
    "    with brainstate.environ.context(dt=dt * u.ms):\n",
    "        times = u.math.arange(0. * u.ms, t_end * u.ms, brainstate.environ.get_dt())\n",
    "        vs = brainstate.transform.for_loop(step, times)\n",
    "    return np.asarray(times.to_decimal(u.ms)), np.asarray(u.math.squeeze(vs).to_decimal(u.mV))\n",
    "\n",
    "\n",
    "t, v = simulate(\"exp_euler\")\n",
    "plt.figure(figsize=(6, 3.2))\n",
    "plt.plot(t, v, lw=1.2)\n",
    "plt.xlabel(\"time (ms)\"); plt.ylabel(\"V (mV)\")\n",
    "plt.title(\"HH neuron, solver='exp_euler'\")\n",
    "plt.tight_layout(); plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "365097a5",
   "metadata": {},
   "source": [
    "### 2. Low-level: call the step function directly\n",
    "\n",
    "When you drive a bare `DiffEqModule` yourself (as in the\n",
    "[previous page](diffeq)), fetch the step function from the registry and call it\n",
    "inside an `environ` context. This path works with the **generic** explicit\n",
    "Runge-Kutta solvers, which make no assumption about the model being a neuron."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "9b9165e5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-05-25T08:59:32.388806Z",
     "iopub.status.busy": "2026-05-25T08:59:32.388330Z",
     "iopub.status.idle": "2026-05-25T08:59:33.418153Z",
     "shell.execute_reply": "2026-05-25T08:59:33.417124Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(50.0, 0.006737955845892429)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "class Decay(brainstate.nn.Dynamics, DiffEqModule):\n",
    "    def __init__(self, tau=10.0):\n",
    "        super().__init__(in_size=1)\n",
    "        self.tau = tau\n",
    "\n",
    "    def init_state(self, *args):\n",
    "        self.y = DiffEqState(jnp.ones(1))\n",
    "\n",
    "    def compute_derivative(self, *args):\n",
    "        self.y.derivative = -self.y.value / self.tau\n",
    "\n",
    "\n",
    "def run_decay(solver_name, dt=0.1, t_end=50.0):\n",
    "    model = Decay(tau=10.0)\n",
    "    brainstate.nn.init_all_states(model)\n",
    "    step = braincell.quad.get_integrator(solver_name)\n",
    "    n = int(t_end / dt)\n",
    "    with brainstate.environ.context(dt=dt):\n",
    "        for i in range(n):\n",
    "            with brainstate.environ.context(t=i * dt):\n",
    "                step(model)\n",
    "            last_t = (i + 1) * dt\n",
    "    return last_t, float(model.y.value[0])\n",
    "\n",
    "run_decay(\"rk4\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "edd09f01",
   "metadata": {},
   "source": [
    "## Accuracy: order matters\n",
    "\n",
    "On a smooth problem, a higher-order method reaches a given accuracy with far\n",
    "fewer, larger steps. Here is the global error at $t=50$ for the decay problem\n",
    "($y(50) = e^{-5}$) across three explicit schemes at the same `dt`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "160bc544",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-05-25T08:59:33.420585Z",
     "iopub.status.busy": "2026-05-25T08:59:33.420266Z",
     "iopub.status.idle": "2026-05-25T08:59:31.725411Z",
     "shell.execute_reply": "2026-05-25T08:59:31.724378Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    solver  order         y(50)     abs error\n",
      "     euler      1     5.921e-03     8.174e-04\n",
      "  midpoint      2     6.753e-03     1.459e-05\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "       rk4      4     6.738e-03     9.306e-10\n"
     ]
    }
   ],
   "source": [
    "exact = np.exp(-5.0)\n",
    "print(f\"{'solver':>10}  {'order':>5}  {'y(50)':>12}  {'abs error':>12}\")\n",
    "for name in [\"euler\", \"midpoint\", \"rk4\"]:\n",
    "    order = braincell.quad.get_registry().entry(name).order\n",
    "    _, y = run_decay(name, dt=0.5)\n",
    "    print(f\"{name:>10}  {order:>5}  {y:>12.3e}  {abs(y - exact):>12.3e}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0f61efec",
   "metadata": {},
   "source": [
    "First-order Euler trails the fourth-order RK4 by several orders of\n",
    "magnitude at the same step size. For smooth problems, prefer a higher-order\n",
    "explicit method."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a3afc350",
   "metadata": {},
   "source": [
    "## Stability: why neurons need special solvers\n",
    "\n",
    "Accuracy is not the whole story. Hodgkin-Huxley gating variables relax on a\n",
    "sub-millisecond timescale while the spike itself plays out over milliseconds —\n",
    "the system is **stiff**. Explicit methods are only conditionally stable: push\n",
    "`dt` past a threshold and they blow up, no matter their order.\n",
    "\n",
    "The demonstration below runs the *same* HH neuron at `dt = 0.1 ms` with an\n",
    "exponential integrator and with explicit RK4."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "f0df4ecc",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-05-25T08:59:31.728139Z",
     "iopub.status.busy": "2026-05-25T08:59:31.727901Z",
     "iopub.status.idle": "2026-05-25T08:59:32.514577Z",
     "shell.execute_reply": "2026-05-25T08:59:32.513709Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "exp_euler : max |V| = 76.6 mV | any NaN: False\n",
      "rk4       : max |V| = 158.2 mV | any NaN: True\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 600x320 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "t_exp, v_exp = simulate(\"exp_euler\", dt=0.1)\n",
    "t_rk4, v_rk4 = simulate(\"rk4\", dt=0.1)\n",
    "\n",
    "print(\"exp_euler : max |V| =\", f\"{np.nanmax(np.abs(v_exp)):.1f} mV\",\n",
    "      \"| any NaN:\", bool(np.isnan(v_exp).any()))\n",
    "print(\"rk4       : max |V| =\", f\"{np.nanmax(np.abs(v_rk4)):.1f} mV\"\n",
    "      if not np.isnan(v_rk4).all() else \"nan\",\n",
    "      \"| any NaN:\", bool(np.isnan(v_rk4).any()))\n",
    "\n",
    "plt.figure(figsize=(6, 3.2))\n",
    "plt.plot(t_exp, v_exp, lw=1.2, label=\"exp_euler (stable)\")\n",
    "plt.xlabel(\"time (ms)\"); plt.ylabel(\"V (mV)\")\n",
    "plt.title(\"Same neuron, same dt=0.1 ms\")\n",
    "plt.legend(); plt.tight_layout(); plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5f4a5404",
   "metadata": {},
   "source": [
    "At `dt = 0.1 ms` `exp_euler` produces a clean spike train, while explicit\n",
    "RK4 diverges to `NaN`. This is why exponential integrators (`exp_euler`, `ind_exp_euler`) are the\n",
    "recommended choice for point neurons: they remain stable at the step sizes that\n",
    "make large simulations affordable. (The `SingleCompartment` default is the\n",
    "explicit `rk2`, so for stiff models you will usually want to pass `solver=...`\n",
    "explicitly.)\n",
    "\n",
    "For a side-by-side comparison of several integrators on a neuron — including how\n",
    "the spike timing shifts between methods — see the worked example\n",
    "[*Effects of Different Integration Methods on HH Neuron Dynamics*](../examples/integration_methods)."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d3192c52",
   "metadata": {},
   "source": [
    "## Choosing a solver — rules of thumb\n",
    "\n",
    "- **Point neurons (single compartment):** start with `exp_euler` or\n",
    "  `ind_exp_euler`. They are stable at `dt = 0.1 ms` and accurate enough for\n",
    "  spike-level fidelity.\n",
    "- **Very stiff or near-equilibrium dynamics:** an `implicit` method\n",
    "  (`backward_euler`, `implicit_exp_euler`) trades per-step cost for robustness.\n",
    "- **Smooth, non-stiff sub-systems you drive yourself:** the explicit\n",
    "  Runge-Kutta family (`rk4`, `midpoint`) is simplest and works on any\n",
    "  `DiffEqModule`.\n",
    "- **Multi-compartment cables:** see the `staggered` / `dhs_voltage` schemes,\n",
    "  which exploit the tree structure of the morphology.\n",
    "\n",
    "The [next page](advanced) covers mixing solvers across sub-systems, the\n",
    "stochastic `diffusion` slot, and registering your own integrator."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
