{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "interactive-link",
   "metadata": {},
   "source": [
    "> **This is a saved, working copy.** Sliders here are frozen at their\n",
    "> starting value — there's no marimo runtime in plain Jupyter to drive them.\n",
    "> For the live, drag-the-sliders (and edit-the-code) version, see\n",
    "> [Welcome Week Activity — interactive](https://math4120.pages.dev/wasm/welcome_week.html).\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "ipython-import",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:40.294939Z",
     "iopub.status.busy": "2026-09-29T20:23:40.294678Z",
     "iopub.status.idle": "2026-09-29T20:23:40.299302Z",
     "shell.execute_reply": "2026-09-29T20:23:40.298433Z"
    }
   },
   "outputs": [],
   "source": [
    "from IPython.display import Markdown, HTML\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "bkHC",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:40.301659Z",
     "iopub.status.busy": "2026-09-29T20:23:40.301427Z",
     "iopub.status.idle": "2026-09-29T20:23:40.624511Z",
     "shell.execute_reply": "2026-09-29T20:23:40.623211Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "BYtC",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:40.627541Z",
     "iopub.status.busy": "2026-09-29T20:23:40.627070Z",
     "iopub.status.idle": "2026-09-29T20:23:40.631744Z",
     "shell.execute_reply": "2026-09-29T20:23:40.630791Z"
    }
   },
   "outputs": [],
   "source": [
    "def make_L_mask(n):\n",
    "    mask = np.ones((n, n), dtype=bool)\n",
    "    half = n // 2\n",
    "    mask[half:, half:] = False\n",
    "    return mask"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "Kclp",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:40.633603Z",
     "iopub.status.busy": "2026-09-29T20:23:40.633434Z",
     "iopub.status.idle": "2026-09-29T20:23:40.636739Z",
     "shell.execute_reply": "2026-09-29T20:23:40.635611Z"
    }
   },
   "outputs": [],
   "source": [
    "def make_hot_spot(n, i0, j0, value):\n",
    "    u0 = np.zeros((n, n))\n",
    "    u0[i0, j0] = value\n",
    "    return u0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "Hstk",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:40.638426Z",
     "iopub.status.busy": "2026-09-29T20:23:40.638271Z",
     "iopub.status.idle": "2026-09-29T20:23:40.642919Z",
     "shell.execute_reply": "2026-09-29T20:23:40.642189Z"
    }
   },
   "outputs": [],
   "source": [
    "def plot_field(ax, u, mask, title, vmax=None):\n",
    "    disp = np.where(mask, u, np.nan)\n",
    "    if vmax is None:\n",
    "        vmax = np.nanmax(np.abs(disp))\n",
    "    if vmax == 0:\n",
    "        vmax = 1.0\n",
    "    cmap = plt.get_cmap(\"RdBu_r\").copy()\n",
    "    cmap.set_bad(\"#dddddd\")\n",
    "    n_side = u.shape[0]\n",
    "    im = ax.imshow(disp, cmap=cmap, vmin=-vmax, vmax=vmax, origin=\"lower\", interpolation=\"nearest\")\n",
    "    ax.set_xticks(np.arange(-0.5, n_side, 1), minor=True)\n",
    "    ax.set_yticks(np.arange(-0.5, n_side, 1), minor=True)\n",
    "    ax.grid(which=\"minor\", color=\"#888888\", linewidth=0.3, alpha=0.6)\n",
    "    ax.tick_params(which=\"minor\", size=0)\n",
    "    ax.set_title(title, fontsize=12)\n",
    "    ax.set_xticks([])\n",
    "    ax.set_yticks([])\n",
    "    return im"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "iLit",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:40.644769Z",
     "iopub.status.busy": "2026-09-29T20:23:40.644597Z",
     "iopub.status.idle": "2026-09-29T20:23:40.648335Z",
     "shell.execute_reply": "2026-09-29T20:23:40.647296Z"
    }
   },
   "outputs": [],
   "source": [
    "def laplacian(u, dx):\n",
    "    lap = np.zeros_like(u)\n",
    "    lap[1:-1, 1:-1] = (\n",
    "        u[2:, 1:-1] + u[:-2, 1:-1] + u[1:-1, 2:] + u[1:-1, :-2] - 4 * u[1:-1, 1:-1]\n",
    "    ) / dx**2\n",
    "    return lap"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "ROlb",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:40.650506Z",
     "iopub.status.busy": "2026-09-29T20:23:40.650308Z",
     "iopub.status.idle": "2026-09-29T20:23:40.653685Z",
     "shell.execute_reply": "2026-09-29T20:23:40.652848Z"
    }
   },
   "outputs": [],
   "source": [
    "def heat_step(u, mask, alpha, dt, dx, laplacian):\n",
    "    u_new = u + dt * alpha * laplacian(u, dx)\n",
    "    u_new[~mask] = 0.0\n",
    "    return u_new"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "TqIu",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:40.655688Z",
     "iopub.status.busy": "2026-09-29T20:23:40.655520Z",
     "iopub.status.idle": "2026-09-29T20:23:40.659243Z",
     "shell.execute_reply": "2026-09-29T20:23:40.658401Z"
    }
   },
   "outputs": [],
   "source": [
    "def run_heat_partial(u0, mask, alpha, T, N, step, dx, laplacian, heat_step):\n",
    "    dt = T / N\n",
    "    u = u0.copy()\n",
    "    for _ in range(step):\n",
    "        u = heat_step(u, mask, alpha, dt, dx, laplacian)\n",
    "    return u"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "Vxnm",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:40.661246Z",
     "iopub.status.busy": "2026-09-29T20:23:40.661100Z",
     "iopub.status.idle": "2026-09-29T20:23:40.663770Z",
     "shell.execute_reply": "2026-09-29T20:23:40.662966Z"
    }
   },
   "outputs": [],
   "source": [
    "alpha = 1.0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "aLJB",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:40.665790Z",
     "iopub.status.busy": "2026-09-29T20:23:40.665597Z",
     "iopub.status.idle": "2026-09-29T20:23:40.669048Z",
     "shell.execute_reply": "2026-09-29T20:23:40.668220Z"
    }
   },
   "outputs": [],
   "source": [
    "def nearest_grid_point(x, y, n):\n",
    "    j = int(np.clip(round(x * (n - 1)), 0, n - 1))\n",
    "    i = int(np.clip(round(y * (n - 1)), 0, n - 1))\n",
    "    return i, j"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "xXTn",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:40.670674Z",
     "iopub.status.busy": "2026-09-29T20:23:40.670534Z",
     "iopub.status.idle": "2026-09-29T20:23:40.673164Z",
     "shell.execute_reply": "2026-09-29T20:23:40.672425Z"
    }
   },
   "outputs": [],
   "source": [
    "x0_task1 = 0.15\n",
    "y0_task1 = 0.75"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "TXez",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:40.674845Z",
     "iopub.status.busy": "2026-09-29T20:23:40.674660Z",
     "iopub.status.idle": "2026-09-29T20:23:40.678343Z",
     "shell.execute_reply": "2026-09-29T20:23:40.677333Z"
    }
   },
   "outputs": [],
   "source": [
    "def make_two_hot_spots(n, i0, j0, i1, j1, value):\n",
    "    u0 = np.zeros((n, n))\n",
    "    u0[i0, j0] = value\n",
    "    u0[i1, j1] = 0.0  # complete this\n",
    "    return u0"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "Hbol",
   "metadata": {
    "marimo": {
     "config": {
      "hide_code": true
     },
     "md_prefix": "r"
    }
   },
   "source": [
    "# Welcome week: can a computer get a simulation wrong?\n",
    "## MATH4120 orientation-week activity\n",
    "\n",
    "**MATH4120 — Mathematical Modelling and Programming** Lancaster University, 2026–27\n",
    "\n",
    "---\n",
    "\n",
    "Picture a metal plate shaped like a thick letter L: a square with one corner sliced off. Heat one point on it to 100°C, hold every edge (including the edge of that missing corner) at a cold 0°C, and let a computer work out what happens next.\n",
    "\n",
    "Before any explanation, here's what a real, localised point of heat on a piece of metal actually looks like."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "MJUe",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:40.680336Z",
     "iopub.status.busy": "2026-09-29T20:23:40.680150Z",
     "iopub.status.idle": "2026-09-29T20:23:40.687548Z",
     "shell.execute_reply": "2026-09-29T20:23:40.686696Z"
    },
    "jupyter": {
     "source_hidden": true
    },
    "marimo": {
     "config": {
      "hide_code": true
     }
    },
    "tags": [
     "remove-input"
    ]
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/buildhome/.asdf/installs/python/3.13.3/lib/python3.13/site-packages/IPython/core/display.py:448: UserWarning: Consider using IPython.display.IFrame instead\n",
      "  warnings.warn(\"Consider using IPython.display.IFrame instead\")\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<iframe width=\"100%\" height=\"400\" src=\"https://www.youtube.com/embed/byvr-dwwao4?start=291\" title=\"Thermal camera imaging of soldering vs spot welding\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen></iframe>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "HTML(\n",
    "    '<iframe width=\"100%\" height=\"400\" '\n",
    "    'src=\"https://www.youtube.com/embed/byvr-dwwao4?start=291\" '\n",
    "    'title=\"Thermal camera imaging of soldering vs spot welding\" frameborder=\"0\" '\n",
    "    'allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" '\n",
    "    'allowfullscreen></iframe>'\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "vblA",
   "metadata": {
    "marimo": {
     "config": {
      "hide_code": true
     },
     "md_prefix": "r"
    }
   },
   "source": [
    "A thermal camera comparing soldering and spot welding, two ways of heating a small, localised point on a piece of metal, the kind of thing used to connect battery tabs. Same idea as the plate you're about to see, just on a real workbench.\n",
    "\n",
    "Now here's a simplified computer model of exactly this. Try the sliders."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "PKri",
   "metadata": {
    "marimo": {
     "config": {
      "hide_code": true
     },
     "md_prefix": "r"
    }
   },
   "source": [
    "Three independent controls: how fine the grid is, how many steps the computer takes to reach a fixed moment in time, and which of those steps you're currently looking at. Move each one on its own and see what changes."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "Xref",
   "metadata": {
    "marimo": {
     "config": {
      "hide_code": true
     },
     "md_prefix": "r"
    }
   },
   "source": [
    "## Before you go any further: discuss in your group\n",
    "\n",
    "Leave every slider at its starting position for a moment, so you're looking at $t = 0$: just the plate and the hot spot.\n",
    "\n",
    "**Discuss with your group, then agree on a prediction, before you touch a slider:**\n",
    "\n",
    "- As you drag the step slider forward, what do you expect the plate to look like? Remember every edge is held at 0°C.\n",
    "- Could any cell on the plate ever end up colder than 0°C? Why or why not?\n",
    "- If you force the same final moment in time to be reached using only a handful of much bigger steps, what do you expect happens to the picture?\n",
    "\n",
    "Write your prediction down, then go and test it."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "SFPL",
   "metadata": {
    "marimo": {
     "config": {
      "hide_code": true
     },
     "md_prefix": "r"
    }
   },
   "source": [
    "## How this actually works\n",
    "\n",
    "Now the machinery behind the plate you've been dragging sliders on. The plate is a grid of points. The function below marks which points are actually part of the plate: it starts with a full square and removes the top right quarter, leaving an L shape, at whatever resolution it's asked for."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "RGSE",
   "metadata": {
    "marimo": {
     "config": {
      "hide_code": true
     },
     "md_prefix": "r"
    }
   },
   "source": [
    "Next, a function that builds a starting temperature grid at that same resolution: one point heated to some value, everywhere else at zero. Zero here just means as cold as the edges of the plate."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "emfo",
   "metadata": {
    "marimo": {
     "config": {
      "hide_code": true
     },
     "md_prefix": "r"
    }
   },
   "source": [
    "And the function that draws it: red for hot, blue for colder than the edges, white sitting exactly at 0°C, with faint lines marking every individual grid cell. Anything outside the L shape is greyed out."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "nWHF",
   "metadata": {
    "marimo": {
     "config": {
      "hide_code": true
     },
     "md_prefix": "r"
    }
   },
   "source": [
    "Heat flowing through a surface obeys an equation relating how fast a point's temperature changes to the temperatures of its four neighbours. The function below computes that quantity at every cell of the grid in one go."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ZHCJ",
   "metadata": {
    "marimo": {
     "config": {
      "hide_code": true
     },
     "md_prefix": "r"
    }
   },
   "source": [
    "From here it's the same idea as Euler's method for a single number, just applied at every cell of the grid at once: take the current temperature, add a small step times the rate of change, repeat. Anywhere off the plate is held fixed at 0°C."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "qnkX",
   "metadata": {
    "marimo": {
     "config": {
      "hide_code": true
     },
     "md_prefix": "r"
    }
   },
   "source": [
    "And the function driving the plate above: it aims for a fixed total time $T$, splits it into $N$ equal steps, then runs however many of those steps you ask for. Run all $N$ of them and you get the final picture; stop partway and you get a snapshot mid way through."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "DnEU",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:40.689625Z",
     "iopub.status.busy": "2026-09-29T20:23:40.689467Z",
     "iopub.status.idle": "2026-09-29T20:23:40.692388Z",
     "shell.execute_reply": "2026-09-29T20:23:40.691518Z"
    }
   },
   "outputs": [],
   "source": [
    "n_slider = type('_W', (), {'value': 20})()  # static default"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "ulZA",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:40.694508Z",
     "iopub.status.busy": "2026-09-29T20:23:40.694353Z",
     "iopub.status.idle": "2026-09-29T20:23:40.697200Z",
     "shell.execute_reply": "2026-09-29T20:23:40.696366Z"
    }
   },
   "outputs": [],
   "source": [
    "N_slider = type('_W', (), {'value': 25})()  # static default"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "ecfG",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:40.698941Z",
     "iopub.status.busy": "2026-09-29T20:23:40.698794Z",
     "iopub.status.idle": "2026-09-29T20:23:40.701490Z",
     "shell.execute_reply": "2026-09-29T20:23:40.700717Z"
    }
   },
   "outputs": [],
   "source": [
    "step_slider = type('_W', (), {'value': 0})()  # static default"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "lEQa",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:40.703482Z",
     "iopub.status.busy": "2026-09-29T20:23:40.703321Z",
     "iopub.status.idle": "2026-09-29T20:23:40.928110Z",
     "shell.execute_reply": "2026-09-29T20:23:40.926909Z"
    },
    "jupyter": {
     "source_hidden": true
    },
    "marimo": {
     "config": {
      "hide_code": true
     }
    },
    "tags": [
     "remove-input"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhwAAAHNCAYAAABVdKJrAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjIsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvgI3uAAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAQ9BJREFUeJzt3Xl0VFW+9vGnKoEASQoZZJJRBBoMCCrIoAIiYgsoMoNiyyS04tx4HboNrX2dpyva6tXYiAwiOIAoYqOIqIgKirQIgqBGAkoQSYWEKbXfP3ipa5EQUlX7kMo5389atVbn1K7n7J3C5sfe+5zjM8YYAQAAOMhf3h0AAADuR8EBAAAcR8EBAAAcR8EBAAAcR8EBAAAcR8EBAAAcR8EBAAAcR8EBAAAcR8ERhU8++UTjxo3T9u3bj9l2w4YNGjdunL7++uvj0DO4iTFGL730km6++WaNGzdOn332WXl3CQDillzeHahINm3apKysLP3lL39RvXr1Sm27bds2ZWVlafDgwTr11FNLbbtjxw4tWLBA33zzjVJSUpSRkaHBgwerUqVKJbbfsGGDXn75ZW3fvl1NmjTRZZddppNOOinmcZX3+Y/lww8/1LRp03TvvffqxBNPdOw8ZXE8xj5p0iS9/PLLuuWWW9S6dWvVqlXrqG3L+t3t2LFDt912W4kZQ4cO1QUXXBB1PxPhe4n3+4jm8xWtLZBomOGIQpcuXfTss8+qfv361jLvu+8+NWzYUM8995zq1aunKlWq6LbbblObNm20fv36Yu1nzZqldu3a6dtvv1Xr1q21fPlytW7dWh988EGFPH9ZrF+/XllZWdq9e7dj5yiL4zH2oqIiPffcc5owYYImT56scePG6eSTTy6xbTTf3e7du5WVlaV9+/apc+fOEa9Y/zyX9/cS7/cRzecrWlsgIRk4YunSpUaSWbRoUantRo8ebZ566qmIY7m5uaZu3bqmS5cuEce3bt1qqlWrZq666qqI43369DENGzY0hYWFUfezvM9fFs8++6yRZDZu3OhIflkcr7Fv3brVSDKPP/74MdtG891t3LjRSCrWPh7l+b3E+31E8/mK1hZIVJ4pOPbv32+ef/55M2nSJJOZmWk2b95s1q9fb8aOHWv+85//hNu99957ZuzYsebXX381X3/9tfnb3/5mxo0bZ4qKisyKFSvM2LFjzbZt24plT5s2LSK7rAXHL7/8UuLxoUOHGklmz5494WP333+/kWS++uqriLZvvPGGkWTmzp1rjDHmwIED5qabbjJ33HGHCYVCEW3/+c9/mvHjx4fP68T5o/XFF1+Yu+++20yaNMncd9995osvvgi/99prr5mzzz7bSDJDhgwxY8eONWPHjjVr1qyJyFi5cqXJzMw0f/7zn81dd91lvvnmm4j3f/+9fvnll+bWW281119/vXn99dfL1EcbYw+FQmbhwoVm8uTJ5pprrjGPPvqo2b59e/j9mTNnmmHDhhlJpkuXLmbs2LHm2muvPWpeNN+d7YKjrN+LU+L9PqL5fEVrCyQqTyyp7NmzR+ecc45uuukmpaWlqUqVKrriiiv01ltvKSsrS9nZ2eG2X3/9tbKysjR37lxNmjRJaWlp2rJli0KhUHgPx2+//RZuX1BQoB49euj6669XamqqUlJSdPnll+uLL74oU9+Otvb9/fffq3LlyhFr8R999JGqVq2qjIyMiLZnnXVW+H1JSk5OVteuXfXf//3fuvfee8PtFi5cqGuuuUb169cPn9eJ80fj8ccfV8eOHfXTTz+pVatWCgaDGj9+vKZOnSpJatSokZo3by5J6tChQ3gZoEaNGpIObbC86qqr1K1bN23dulUtW7bUxo0b1bZtW73wwgvh8xz+XufMmaMbb7xRtWrVUlFRkYYMGaIRI0bIHOOhyfGOfd++ferTp4+GDh2qoqIiNWnSRLNnz1aLFi307rvvSpKaNWumDh06hP93586d1bFjx6NmRvPdHfbWW2/pmmuu0Y033qh//etfCgaDpfb7aI71vZQkJydH48aNK9Nr0aJFpZ4/3u8jms9XtLZAwirviud4uP32243f74/4l/OePXvMGWecUWwWYurUqUaS6d+/vzl48GC4bSgUMi+++KKRFPGv57/+9a/G5/OZVatWhY8Fg0Fz2mmnlWmGoySH/9UyfPjwiOOnn366adq0aYmfSUpKMoMHD444duONN5qkpCTz7rvvms2bN5saNWqY888/3xQVFR2X85dFw4YNzcSJEyOOhUIhs3nz5vDPpU3dP/7440aSWbBgQcTxv//97yYlJcVkZ2cbY/7ve7344ovD36sxxsyePdtIMtOnTy+1n/GO/c477zSSzNKlS8PH9u/fb7p27Wpq165t8vPzjTHGbNmyxUgyU6dOLTXvaI723W3cuNHUrFnTTJgwwTz22GPmL3/5i6ldu7apV6+e+fTTT2M6V7RLKmvXrjWSyvS69957S82K9/uI5vMVrS2QqDxxlcrs2bPVs2dPtW/fPnysWrVquuyyy7Rq1aoSPzNmzBglJSWF2x7NzJkz1bNnT51++unhY2lpaRo1apTWrFkTdV+/++47XXnllapdu7YeeuihiPf27t171CtHKleurMLCwohjDzzwgD799FONGDFC9evXV2pqqmbNmiW//+gTWzbPXxY+n09fffWVdu3aFf7Xsc/nU7Nmzcr0+aefflodOnRQ//79I45fc801yszM1GuvvaZrr702fHzcuHHh71WShg0bpltuuUUzZszQqFGjjnqeeMc+Y8YMnXXWWerRo0f4WKVKlXTzzTdr0KBBWrRokQYPHlxqxrGU9t3Vq1dPmzZtipiBuOWWW9S+fXsNGjRImzZtUuXKleM6/7GcdNJJevbZZ8vUtlOnTqW+H+/3Ec3nK1pbIFG5vuAIhUL6/vvv1adPn2LvtWjR4qifa9myZVzZrVq1iq6jkrZu3arevXvrwIEDWrJkSbHL3dLS0pSTk1NiP/bu3au0tLSI48nJyZo9e7aaN2+uX375RcuWLSv18kXb5y+Lhx56SGPGjFH9+vV19tlnq3v37howYIDatm17zM8aY7R+/XqdfPLJmjhxYnhZxBzam6SkpCRt2bIl4jNHfq8+n08tW7bUd999V+q54hl7KBTSli1bdM455xR7r3Xr1pIOXXIdj7J8d0c68cQTde211+q2227Txx9/HFEMOaFGjRoaN26clax4/yxG8/mK1hZIVK4vOHw+n/x+v/bv31/svZKOHRYIBMqcvW/fvmLvlXSsNNu3b9d5552n3NxcLV68uMS1++bNm2v16tU6cOBAxL92fvrpJxljwmvqv5eVlaUDBw7I7/frtdde07nnnntcz38sQ4cOVe/evbV48WJ9+OGHeuGFF5SZmak777xTU6ZMOebn/X6/6tSpozPPPLPYe2eddVaxe6Ac7btKTi79P4V4xu7z+ZSUlFTin7fD/Tnav17Loizf3dE0atRI0qH7dDgtJydHd955Z5naDho0SH/84x+P+n68fxaj+XxFawskKtdvGvX5fMrIyChxeSOWJY+Ssr/88sti75V106gk5ebm6vzzz1dOTo4WLVqkLl26lNiuZ8+eOnjw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RhMDMxwAAMBxzHAAAFyN+3AkBgoOAIC7WSo4RMERF5ZUAACA45jhAAC4WsgY+Sxc0hristi4RFVwBINBKye1leNkphf76MUxO5GZ6HlOZHqxj14csxOZTvQRiYkZDgCAqxljadMoMxxxiargSE9PVyAQsHZym1lOZXqxj14csxOZiZ7nRKYX++jFMdvMPB4zHFylkhjYNAoAABzHkgoAwNVCIcln5U6jFjrjYRQcAABX4+FtiYElFQAA4DhmOAAArmZCh142chA7Cg4AABLAmjVrtGvXrmLHU1NT1bFjR0nS9u3btX79+mJtzjnnHCUlJTnex3hQcAAAXC0UMpY2jTq7h2P69OlatWpVxLEVK1bo7LPP1rvvvitJevvttzVhwgR16dIlot2iRYtUtWpVR/sXLwoOAICrVZT7cDz88MMRP3/33Xdq0aKFrrzyyojjJ554ot5//31H++IECg4AABJQVlaWqlevrsGDB0ccD4VC+vLLL+Xz+dSyZcuEn9k4jIIDAOBqtmc48vLyIo6npKQoJSUl7vzfKyoq0gsvvKDLL7+8WEGxfft2XXbZZdq/f79ycnI0ZcoUTZ482er5nUDBAQBwNdtPi23UqFHE8czMTE2ZMqVY+5ycHH377belZrZu3Vp169YtdnzRokXKycnR+PHjI463bNlS69at0x/+8AdJ0quvvqrBgwfr5JNP1qBBg6IZznFHwQEAQBSys7MjniVztNmNzz//XI888kipWXfccYd69+5d7HhWVpbOOusstWvXLuJ4165dI34eOHCgzj//fM2ZM4eCAwCA8mR7SSUQCJTp4XUXX3yxLr744qjP8/PPP2vhwoV6+umny9T+xBNP1A8//BD1eY437jQKAEACmT59uqpWraphw4YVe+/Ip+sWFBRo+fLlatu27fHqXsyY4QAAuJoxlmY4jtOzVJ5//nmNGDFCaWlpxd4bPny42rZtq86dO6ugoEBTp07VgQMHdOuttx6XvsWDGQ4AgKuZkFHIwsvp+3BIh+69UbduXU2cOLHE91955RU1aNBAL774ol5//XX169dP69evV5MmTRzvW7yY4QAAIEE0b9681Jt6ValSRdddd52uu+6649cpS6IqOI5cO4qVrRwnM73YRy+O2YnMRM9zItOLffTimJ3IdKKPR+Lx9ImBJRUAAOC4qGY40tPTy3QpUFnZzHIq04t99OKYnchM9DwnMr3YRy+O2WbmcZnhqCDPUnE79nAAAFwtFDJSBXharNuxpAIAABzHDAcAwNVMqEgmVGQlB7Gj4AAAuBoFR2JgSQUAADiOGQ4AgKuZUMjSDEfIQm+8ixkOAADgOGY4AACuZoqKZIoszHBYyPAyCg4AgKsZY2nTqKHgiAdLKgAAwHHMcAAAXI3LYhMDMxwAAMBxzHAAAFyNGY7EQMEBAHA1Co7EwJIKAABwHDMcAABX406jiYGCAwDgaqFQkWSh4AixpBKXqAqOYDBo5aS2cpzM9GIfvThmJzITPc+JTC/20YtjdiLTiT4iMTHDAQBwNTaNJoaoCo709HQFAgFrJ7eZ5VSmF/voxTE7kZnoeU5kerGPXhyzzUxmOLyDGQ4AgKsxw5EYKDgAAO5WVCTjt1As8LTYuHAfDgAA4DhmOAAArmaMnctieTx9fJjhAAAAjmOGAwDgaiYUsjPDwZ1G40LBAQBwNWPpTqNcpRIfllQAAIDjmOEAALjaoSWV+JdDWFKJDwUHAMDVWFJJDCypAAAAxzHDAQBwNWY4EgMzHAAAwHHMcAAAXC0UKpKPGY5yR8EBAHA1UxSSfBYKjiKuUokHSyoAAMBxzHAAAFyNh7clBgoOAAASyI8//qgVK1aoXbt2at26dYltvv76a3377bdq3LixzjjjjJjbHE9lKjiMMZKknJwcBYPBuE96OMNGllOZXuyjF8fsRGai5zmR6cU+enHMTmRu27ZN0v/9PeMEEyqys4fD4U2j3377rSZPnqw1a9bo559/VmZmZrGCwxijcePGad68eercubNWr16tM888U6+99pqqVKlS5jbloUwFx+E/WB1OP93RzgAAvCkYDKp69eqOZFeUgmP37t0aM2aM+vXrpyZNmpTYZubMmZo9e7Y+//xztWnTRjk5OerQoYMefvhh3XHHHWVuUx7KVHA0aNBA2dnZSk9Pl8/nc7pPAACPMMYoGAyqQYMG5d2VctexY8djtpkxY4YuvPBCtWnTRtKhv5+HDx+uGTNmhIuJsrQpD2UqOPx+vxo2bOh0XwAAHuTUzMZh5sBeO7MTRQckSXl5eRGHU1JSlJKSEn9+Gaxdu1Zjx46NONa2bVtNnTpV+/fvV+XKlcvUpjywaRQA4EqVK1dWvXr1tH3dy9Yy09LS1KhRo4hjmZmZmjJlSrG23333nT777LNS87p06XLU5ZOS7N69WzVr1ow4VqtWLRljlJeXp9q1a5epTXmg4AAAuFKVKlW0ZcsW7d+/31qmMabY1oKjzW5s2bJFr7/+eql5DRs2jKrgSElJUX5+fsSxwz8f3hBaljblgYIDAOBaVapUKbe/ZM8//3ydf/75VjObN2+uH3/8MeLYDz/8oBNPPFFpaWllblMeuNMoAAAVxEUXXaSFCxeqsLBQklRUVKR58+apb9++UbUpDz7j5MXPAACgTILBoN58801J0jXXXKM+ffro4osvVv369dW9e3dJ0m+//aYzzzxTJ510koYPH663335bH3/8sT799FM1a9aszG3KAwUHAAAJICcnRzfddFOx4+3bt9ett94a/vnXX3/VU089pQ0bNqhx48aaOHFisStJy9LmeKPgAAAAjmMPBwAAcBwFBwAAcBwFBwAAcBwFBwAAcBwFBwAAcBwFBwAAcBwFBwAAcBwFBwAAcBwFBwAAcBwFBwAAcBwFBwAAcBwFBwAAcNz/A3wmScIsuHfJAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 550x550 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "_n = n_slider.value\n",
    "_N = N_slider.value\n",
    "_step = step_slider.value\n",
    "_T = 0.0125\n",
    "_mask = make_L_mask(_n)\n",
    "_u0 = make_hot_spot(_n, _n // 4, _n // 4, 100.0)\n",
    "_dx = 1.0 / (_n - 1)\n",
    "_u = run_heat_partial(_u0, _mask, alpha, _T, _N, _step, _dx, laplacian, heat_step)\n",
    "_t_elapsed = _step * (_T / _N)\n",
    "\n",
    "_fig, _ax = plt.subplots(figsize=(5.5, 5.5))\n",
    "_im = plot_field(_ax, _u, _mask, f\"grid {_n}x{_n}, step {_step} of {_N}, t = {_t_elapsed:.5f}\")\n",
    "_cbar = plt.colorbar(_im, ax=_ax, fraction=0.046)\n",
    "_cbar.set_label(\"Temperature (°C)\")\n",
    "_fig.tight_layout()\n",
    "_fig;"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "Pvdt",
   "metadata": {
    "marimo": {
     "config": {
      "hide_code": true
     },
     "md_prefix": "r"
    }
   },
   "source": [
    "## Discuss\n",
    "\n",
    "- Did dragging the step slider forward match your group's prediction?\n",
    "- The colour never turns blue while $N$ is large enough. Push $N$ down while keeping the grid resolution fixed: at some point it does. What does that mean physically?\n",
    "- Now push the grid resolution $n$ up while keeping $N$ fixed at a value that looked safe before. Does it stay safe? A finer grid means smaller cells, which means the same $N$ covers less real time per step... or does it? Work out with your group what's actually changing.\n",
    "- Check the actual numbers printed on the colour scale: how do they compare with the 0 to 100°C range you started with?\n",
    "- So why not simply always run the finest grid and the smallest steps, every time? Drag both $n$ and $N$ right up together and notice how much longer the plot takes to redraw. What's actually being traded off here, and why might a scientist or engineer sometimes deliberately choose a coarser, faster simulation over this safest one?\n",
    "\n",
    "We're leaving the precise explanation open for now. You'll get it, condition and all, in Chapter 6 (taught in Week 7), for the single number version of exactly this idea."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ZBYS",
   "metadata": {
    "marimo": {
     "config": {
      "hide_code": true
     },
     "md_prefix": "r"
    }
   },
   "source": [
    "## Now it's your turn\n",
    "\n",
    "Everything below runs directly in your browser, and unlike the demo above, these are cells you can edit yourself. Press **Ctrl+Enter** (or **Shift+Enter**) to run a cell after changing it. Both tasks below give you the same three sliders as the demo above, this time on a plate you've placed the hot spots on yourself.\n",
    "\n",
    "Rather than a grid index, you'll place hot spots using real coordinates: $x$ and $y$ both running from 0 (the left or bottom edge) to 1 (the right or top edge), regardless of how fine the grid is. The function below rounds whatever $x, y$ you pick to the nearest actual grid point."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "nHfw",
   "metadata": {
    "marimo": {
     "config": {
      "hide_code": true
     },
     "md_prefix": "r"
    }
   },
   "source": [
    "### Task 1: change a number yourself\n",
    "\n",
    "`x0_task1` and `y0_task1` below set where the hot spot starts, as real coordinates from 0 to 1. Right now it sits in the arm of the L, away from the corner.\n",
    "\n",
    "**Edit those two numbers** to move the hot spot somewhere else on the plate (anywhere works, except where both $x$ and $y$ are above 0.5, since that's the missing corner). Run the cell and the one below it, then try the three sliders exactly as you did above, on your own hot spot this time."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "AjVT",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:40.930580Z",
     "iopub.status.busy": "2026-09-29T20:23:40.930367Z",
     "iopub.status.idle": "2026-09-29T20:23:40.933964Z",
     "shell.execute_reply": "2026-09-29T20:23:40.932947Z"
    }
   },
   "outputs": [],
   "source": [
    "n_slider_task1 = type('_W', (), {'value': 20})()  # static default"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "pHFh",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:40.935924Z",
     "iopub.status.busy": "2026-09-29T20:23:40.935767Z",
     "iopub.status.idle": "2026-09-29T20:23:40.939137Z",
     "shell.execute_reply": "2026-09-29T20:23:40.938133Z"
    }
   },
   "outputs": [],
   "source": [
    "N_slider_task1 = type('_W', (), {'value': 25})()  # static default"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "NCOB",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:40.941094Z",
     "iopub.status.busy": "2026-09-29T20:23:40.940878Z",
     "iopub.status.idle": "2026-09-29T20:23:40.944450Z",
     "shell.execute_reply": "2026-09-29T20:23:40.943213Z"
    }
   },
   "outputs": [],
   "source": [
    "step_slider_task1 = type('_W', (), {'value': N_slider_task1.value})()  # static default"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "aqbW",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:40.946258Z",
     "iopub.status.busy": "2026-09-29T20:23:40.946106Z",
     "iopub.status.idle": "2026-09-29T20:23:41.147578Z",
     "shell.execute_reply": "2026-09-29T20:23:41.146612Z"
    },
    "jupyter": {
     "source_hidden": true
    },
    "marimo": {
     "config": {
      "hide_code": true
     }
    },
    "tags": [
     "remove-input"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhwAAAHPCAYAAAAYvANgAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjIsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvgI3uAAAAAAlwSFlzAAAPYQAAD2EBqD+naQAATidJREFUeJzt3Xl4U1X+P/D3vdnapkktRSiUls2RRSzIVhYVEMoiDA4DI4orOozrz2Ucv+iMj+DMuH3HdfyO4ogLi4jKprIIqCwuYFGQ4oIVwbYsClRoszVpcs/vj04zxC4k4VyS9r5fz5MHenPzvic3SfPpOefeqwghBIiIiIh0pCa6AURERNTyseAgIiIi3bHgICIiIt2x4CAiIiLdseAgIiIi3bHgICIiIt2x4CAiIiLdseAgIiIi3TWrgsPn82Hr1q04evRooptCAHbu3IkDBw4kuhmU5I4dO4ZPP/0UyXCOwUAggK1bt+Lw4cNRrb9161aUl5fr3CoiY1Ca05lGv/zyS5x77rlYsGABrrzySimZfr8fO3bsQNeuXXHmmWdKydSDXu2MN3f79u0YOHAgPv/8c/Tu3Vtae6JVWVmJffv2ITMzEx07doz58R6PB19++SXsdjt69erV4Do7duyA3++vtzwzMxPdunWLeZunUzz75+eff0ZJSUmj95955pno2rVr+Odo909lZSU6d+6MJ554Atdee230T0IH+/fvR25uLp577jnceOONJ11fURTMnDkTjzzyyEnXFUKgrKwMXq8XnTt3RkpKSpPrn+p7ONm2T3RSohnZtWuXACAWLFggLfO7774TAMQLL7wgLVMPerUz3txhw4aJKVOmSG1LNAKBgLjhhhtESkqKyM/PF5mZmaJfv37i66+/jurxb7/9tpgyZYo488wzhdVqFf369Wt03ZycHJGVlSUKCgoibnfddZespyPdqeyfDz74oN5zLSgoEJ06dRIAxM033xyxfiz7569//ato166d8Hq90p5rPA4fPiwKCgrEsmXLolofgJg5c2aT65SVlYn/9//+n8jMzBQ5OTmie/fuwmq1imuvvVb89NNP9dY/1fdwsm2fKFosOFhwxJz72WefCQBi3bp1UtsSjVtuuUXY7Xbx+eefCyGE8Hq9YuTIkaJDhw7C5XKd9PF33323eOONN4TX6xUdO3Y8acExdepUaW0/HU51/zTksssuEwDExx9/HLE8lv1z4MABoaqqePHFF+NqQ6JEU3C88MILon379uLtt98OLysuLhZt2rQR5513nggGgxHry36NEr19omg164Lj8OHDYseOHaKysrLJx5WXl4vPP/9cHDhwIGJ5ZWWlePPNNwUAce+994otW7aILVu2iNLS0pO25dixY6K4uFiUlZUJTdMi7vN6vWLLli3iyJEjQgghfvzxR7Fjxw5RVVV1WttZt96WLVvE559/Lg4fPiwl94YbbhBt27YVoVAoYvkXX3whioqK6q1//PhxsWXLFlFWVtZk7skcOnRImEwm8cc//jFied374vHHH48p73QWHHXviYMHDzZ4/86dO8WXX355StuQvX+EEOLnn38WNptNnHPOOfXui3X/DB8+XBQUFMTchhOFQiHx9ddfi927d4c/d798b/3y83f06FGxbds2UVlZKfx+v9iyZUuDf/k3lB1NwfHhhx82+Lo+9NBDAoD45JNPwstieY2i/TzptX0i2ZplwTFv3jxxxx13iE6dOonc3FxhtVrFE088UW/97du3i759+wqbzSZ69OghrFarKCgoEF999ZUQQoiioiLRp08fAUB06dIl3CX8z3/+s9E2uN1uMXny5PAv4S5duojc3FyxcOHCeu18+eWXxe9//3vRsWNH0b59e5GSkiIefPDB09LOYDAY0c3dvXt3YbFYxPDhw8X+/fvjzhVCiM6dO4tJkybVW/7KK68IABGPD4VCYtSoUSIzM1Ps27cvvPyzzz6LKIgau33zzTfhx8ybN08AEGvWrKm37Xbt2omRI0c22e5fiqbgmDRpkvjyyy/Fjh07xPHjx2PKP1EgEBDt2rUTEyZMqHffwYMHhdlsjhiKSIb9I4QQzzzzjAAgnnrqqXr3xbp/7r//fqGqqvj5559jbocQQmzevFl07NhRpKWliR49eog+ffqEe+hOLArqPn+vvPKKuOmmm0THjh1Fq1atxPr160V5ebkAIJ577rmI7I8++kh07tw5nN27d+8Gs2Px9NNPCwBi5cqV4WWxvEaxfJ702D6RbM2y4CgoKBBvvPFGePntt98uTCaT+O6778LLDh48KFq1aiWGDh0qKioqhBC1PSL9+/cX2dnZ4ujRo0KI2IcUZs6cKTIzM8UPP/wQsa3HHnusXjv79u0rFi9eHF5e98v7xG3p1c6GHDhwQPTu3VsU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+vTpE7E8mn03ceJEVFZW4q233opY/uqrrzb6mGhNnDgRVVVVWL58ecTy+fPnR52xbt06/O53v8OAAQPw7rvvNjhHAoj9NYr286TX9omkStx81dg1deKvrKwscf3114d/1jRNTJo0SaSkpIiHH35YrFu3Tvz1r38VFotFXHHFFRGP7d69u+jXr59Yu3btSc9DMWbMGHHVVVeJefPmiY0bN4pFixaJc845R/To0SN8FsW6dt5+++1i7NixYtmyZeLNN98U/fr1E1lZWaKkpET3dm7dulWYTCYxadIksW7dOjFv3jzRt29f8cc//lEAiDicMpZcIWoPt7NYLPXO6/Hee+8JVVUjDu88dOiQyM7OFoMGDRKBQKDJ3Gi8++67wmKxiOnTp4sPPvhAzJkzRzidTjF9+vR667Zt21Z069YtYtn3338fPqQ0OztbdO/ePfzziedyePXVV8XgwYPF//3f/4l169aJpUuXho+IuPPOO+tta8yYMQKA8Pl8J30OlZWVIj09XQAQ3bt3j2MvNO5U948QtUdoKIoiLr/88ka3E+v+0TRN5OXlieuuu67efdHsu1AoJEaPHi2cTqd4+umnxbp168Q999wj/vKXvwgA4p577gmv29TviYaOUgmFQmLMmDHC4XCIJ598Uqxdu1bcfffd4t57743qKJWtW7eKtLQ00b59e7Fu3bp6hy7/8nMS7WsU7edJr+0TydasCo7vv/9eFBQUiHfffbfefWPGjBEPPfRQxLJgMCheeeUV8dvf/lacf/75YsqUKeLVV1+td6Kur7/+Wlx33XXiggsuOOl5KAKBgFi0aJG45pprxPDhw8XkyZPFU089FXFSrxN/4X366afisssuExdeeKG46aabGjx2Xo92ClF7QqQrrrhCDB8+XFx//fXiyy+/FCtXrhQFBQURh2bGmnv8+HFht9vF008/HV7m9XrFxIkTxdSpU0VNTU3E+hs3bhQFBQXi5ZdfbjI3Wl988YX4/e9/Ly688EJxySWXiHnz5tXbV0IIcfHFF9c7MdVDDz3U4Om7CwoKxL/+9a+IdXfs2CHuuOMOMXr0aDFixAhxww03iA0bNjTYpj59+ohu3bo12I6GzJgxQwAQ//jHP6J70jE4lf0jhBALFiwQBQUF9c4s+kux7J8NGzYIAGLbtm317ot231VXV4vHHntMFBYWirFjx4rnn39e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iIgIAHD//ffD6/Vi1qxZ+POf/xxx38iRI/Hqq69CjbNXhwUHEREZC6+l0ihVVfG///u/uPPOO/HBBx/gxx9/hMPhwMCBA9GnT59TymbBQURExsKC46TatWuHK664Qmom53AQERERAODo0aNYsGABdu3aJT2bBQcRERmKoqpSby2Fx+PBkCFDUFxcjN/+9rfYuHGj1HwOqRARERE2b96Ms846C//4xz/wq1/9Cq+99lrch8A2JKaCw+VySduwy+WCqBEANCl57hqBaqtNSladaqsNNelpUjNr0tMQ1ITUPH9qirQ8APCnpsCrWqTleVUL3EFpcQAAdxCw+AJSM12+ADSPV16exwuvT877u47XK699emWyjcmb2RzaCAA+n096ZgRF4hwOpeXM4cjJycGePXvgdruxY8eOk551NFYJ7eFQs9rCZJPzxab6a9Cqew7sCEnJAwAPTDCnmpAalPfF5jNboQUFUmr8UvKqLTaktXYiTauRkgfUFgjOLu2QbpJTGFlCCkxZ2TDb5L3dTP4glNR0KGnyii0F1YDJDJgkFVsmMwC5RRERSaAo8q7yqihycpJAfn4+ZsyYgfPOOw/5+fl49NFHpebH9A3gcDjgdDqlbVyxWZCRIu8v6RBCSJdYcABATTCANEnFQZ1QjYa0gLzMNK0GdokFBwCkmwSckgoOALDZzFJfawAwpaUgw54qNTNktyPDkS4tz6OZYbfbpeXVaQ6ZbGPyZiZ7G91ut7Qsis3dd9+Nu+++W5dszuEgIiJjUVSJPRwtY9KopmkxndAr1vUBHqVCRERkeEuXLsVVV12Fb775psn1Kioq8OCDD+Lmm2+OeRvs4SAiIkMRigohqWdCVk6iTZgwAV9//TX69++Pc889FyNGjEDPnj2RmZkJj8eDffv24aOPPsL69esxYcIEPP744zFvgwUHEREZC4dU6klNTcWsWbNw66234qWXXsLKlSvxr3/9Cy6XC1arFWeffTZGjRqFRx99FOecc05c22DBQURERACArKysiImjgUAAVqtVSjYLDiIiMhZFkXc4aws6LLYhsooNgJNGiYiI6DRgDwcRERmLqtbeZGVRVFhwEBGRofAolcTgniIiIiLdseAgIiJjqTssVtathXr33Xcxc+ZMzJkzBwBw5MgRbN68Oe68lruniIiIKC7/8z//g2nTpmH9+vXYuHEjACAj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",
      "text/plain": [
       "<Figure size 550x550 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "_n = n_slider_task1.value\n",
    "_N = N_slider_task1.value\n",
    "_step = step_slider_task1.value\n",
    "_T = 0.0125\n",
    "_mask = make_L_mask(_n)\n",
    "_i0, _j0 = nearest_grid_point(x0_task1, y0_task1, _n)\n",
    "_u0 = make_hot_spot(_n, _i0, _j0, 100.0)\n",
    "_dx = 1.0 / (_n - 1)\n",
    "_u = run_heat_partial(_u0, _mask, alpha, _T, _N, _step, _dx, laplacian, heat_step)\n",
    "_fig, _ax = plt.subplots(figsize=(5.5, 5.5))\n",
    "_im = plot_field(_ax, _u, _mask, f\"hot spot at (x={x0_task1}, y={y0_task1}), grid {_n}x{_n}\")\n",
    "_cbar = plt.colorbar(_im, ax=_ax, fraction=0.046)\n",
    "_cbar.set_label(\"Temperature (°C)\")\n",
    "_fig.tight_layout()\n",
    "_fig;"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "TRpd",
   "metadata": {
    "marimo": {
     "config": {
      "hide_code": true
     },
     "md_prefix": "r"
    }
   },
   "source": [
    "### Task 2: write a line yourself\n",
    "\n",
    "The function below is meant to place **two** hot spots instead of one. It already places the first one; the second line is left for you to finish.\n",
    "\n",
    "**Complete the marked line** so the second spot is set to `value` too, the same way the line above it does it. Then run the cell and the one below it, and try the sliders again."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "dNNg",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:41.150024Z",
     "iopub.status.busy": "2026-09-29T20:23:41.149784Z",
     "iopub.status.idle": "2026-09-29T20:23:41.154189Z",
     "shell.execute_reply": "2026-09-29T20:23:41.152941Z"
    }
   },
   "outputs": [],
   "source": [
    "n_slider_task2 = type('_W', (), {'value': 20})()  # static default"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "yCnT",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:41.156403Z",
     "iopub.status.busy": "2026-09-29T20:23:41.156220Z",
     "iopub.status.idle": "2026-09-29T20:23:41.159793Z",
     "shell.execute_reply": "2026-09-29T20:23:41.158655Z"
    }
   },
   "outputs": [],
   "source": [
    "N_slider_task2 = type('_W', (), {'value': 25})()  # static default"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "wlCL",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:41.161686Z",
     "iopub.status.busy": "2026-09-29T20:23:41.161444Z",
     "iopub.status.idle": "2026-09-29T20:23:41.164448Z",
     "shell.execute_reply": "2026-09-29T20:23:41.163670Z"
    }
   },
   "outputs": [],
   "source": [
    "step_slider_task2 = type('_W', (), {'value': N_slider_task2.value})()  # static default"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "kqZH",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-09-29T20:23:41.166429Z",
     "iopub.status.busy": "2026-09-29T20:23:41.166256Z",
     "iopub.status.idle": "2026-09-29T20:23:41.341252Z",
     "shell.execute_reply": "2026-09-29T20:23:41.339942Z"
    },
    "jupyter": {
     "source_hidden": true
    },
    "marimo": {
     "config": {
      "hide_code": true
     }
    },
    "tags": [
     "remove-input"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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1z322GMqGo3mbPvzn/+sAKjly5fnjLN///7qgw8+yD7ulVdeUbquq5/97Gei48xnTEopddttt6mZM2eqdDq9y9f35ptvKl3X1RVXXJHd1tjYqKZNm7bLRaOt/TxaWzTanD1r1qzstkQioc4888y8F41edtllCoC67rrr2n3sMccco2pqatTWrVuz22bMmKEqKirU559/nt1mWZY6+uijVdeuXbOLPOfMmaM0TVOPPvqo4/snInksODqgM888U0UiEXX++eermTNntvgAPvjggxUA9atf/Sq7LRqNKp/PpwCof//73y0y77nnHhUKhdTw4cPVBRdcoIYMGaIikYh64IEH2hxLIQVHIftp7zXu7Je//KXq06eP+u53v6suueQSNWnSJBUMBnO+oJvHefPNN6sjjzxSnX766eqUU05RFRUV6rjjjlOJREJ0nPmMSammL0AAqrGxsY13WalbbrlFeb1eNXr0aHXBBReo4cOHq6eeekoByCmWCi04lFLq1ltvVV6vV40aNUqdf/75aujQodns9gqOv/3tbwqA6tmzp5o5c2aLW21tbc7jN2zYoIYPH65qamrUxRdfrI466igVDofVI488kvO4a665Rmmapp544onsNsuy1DHHHKOqq6vVp59+6uj+iUieplQBfWsqC5Zl4dlnn8WqVauQSqVw2GGH5ZxQ6qmnnsKKFStw0kknoV+/ftntCxYswNatW3HRRRe1ukBu27ZtePbZZ7Mnujr66KPbXQuwbds2zJ8/H8cee2yLBZm33347+vfv32KhXz77ae81ft2OHTtQW1uLNWvWoFu3bhg9enTOtNH777+PIUOGYP78+Zg6dSqefPJJrF+/HoMGDcLYsWN3+dp2Z5ztjQkAevXqhdGjR+PBBx/c5Wtr9vnnn+PZZ5+FYRj4zne+A13Xsc8++2DevHnZaYS2fh7RaBR33nknjj76aAwZMiTnvjVr1uCZZ56Brus45phj0LNnT9x444345je/2eap0P/73/+2mKLY2cSJE1tMyVmWheeffz57LZOJEyeiW7du2fsTiQTuuOMO9O7dG1OmTMl57tatW7FgwQIMHjwYEyZMcGT/ROQMFhzkCjsXHOecc06phwMAWLFiBYYMGYL33nuvqKNCnn76aXznO9/B448/juOPP96BERIRyeGiUaIS0XUd//znP/MqNmpra3OOJmloaMDcuXPRq1evNg8VJSIqF7yWClGJHHTQQXmfL2P58uU455xzMHLkSABNV0m1LAuPPPJIqyeyIiIqN5xSIVdoa21DR7Fu3Tq89tpr2Lx5M3r37o3x48e3OGEXEbUtmUwilUqJZvp8vhYn5qOWWHAQEZErJJNJdAtUIo7WT+xXrB49euCzzz5j0dEOTqkQEZErpFIpxGHhbPSCT2gJYwo2/rFxHVKpFAuOdrDgICIiVwlAh0+TKTgMzhHkLa+Cw7ZtrF+/HuFwOHuFUSIiIicopWCaJnr27Jm9xpEkQ9NgCH2XGdAAFh15yavgWL9+PXr37u30WIiIiLLq6upQU1NT6mGQkLwKjnA4DAD4ZNWq7H/vLtM0c7LLLa+jZHKM5ZtpmiY2b9kieiRJPB4HgLLO5BjLN7MjjBEAtmzZgokTJ4r++96ZrgGGULNeB9jhyFNeBUfzNEo4HEYkEhEdQLnndZRMjrE8M+OJRKunkS9Wc3u5nDM5xvLN7AhjBP5XxHAKv3PholEiInIV8TUclBcWHERE5CqG4JSKIRPjCryWChERETmOHQ4iInIVTqmUBjscRERE5Dh2OIiIyFW4hqM0WHAQEZGrcEqlNDilQkRERI5jh4OIiFxFg9xf2+xv5I8dDiIiInIcOxxEROQqXMNRGiw4iIjIVXiUSmlwSoWIiIgcxw4HERG5SlOHQ2pKhfLFgoOIiFyFUyqlwSkVIiIiclxBHQ7TNMV2LJnlRF5HyeQYyzfTNE3E43HRTOk8JzI5xvLN7AhjBIBEIiGeubNSHqWSTqexaNEi/OUvf8FLL72EX//617jqqqvafM69996LCy64oMX2HTt2IBQKFbT/UmKHg4iIaA955JFHcP/992P27NnYe++9Ydt2u8+xbRs9evRAMpnMuXWkYgMosMMRDocRiUREB1DueR0lk2Msz8x4IuHIh0JHyOQYyzez3McYjUbFslqjC67hKPSv9tNPPx2nn346AEArsMvi8XTsZZfscBARkas0T6lI3faETZs2Ya+99kL37t0xceJEvP7663tkv5JYcBAREe2mhoaGnFtjY6NYdjgcxo033oj33nsP//3vf3HggQdi7NixePfdd8X2sSew4CAiIldpPixW6gYAvXv3RlVVVfY2b948sfGecsopuPTSS7Hvvvuib9++uOWWWzBw4EDceOONYvvYEzr2hBAREVEZqKury1n/5ff7HduXpmkYOnQoVq1a5dg+nMCCg4iIXMWJE39FIhFHFrHvygcffID+/fvvsf1J4JQKERG5SrkvGr377rvh8XgQi8UAABdffDGWLl2KaDSKzZs344orrsA777yDyy67THzfTmLBQUREtId8/PHH8Hg88Hg8WLduHa655hp4PB4cf/zx2cfYtg3LsqCUAgDMmDEDN998M2pqajBgwAC8+eabeO655zB27NhSvYyicEqFiIhcxYDglIoq7PEHHXQQkslki+26/r+//6dPn47zzjsve96N4cOH47HHHtutcZYDFhxERER7UHsn8NI0rcOf5Ks1ne8VERERtUEXXHuh76ETf3UGLDiIiMhVRI9SYb2RNy4aJSIiIsexw0FERK4ienl6TqnkjQUHERG5CqdUSoNTKkREROQ4djiIiMhVOKVSGuxwEBERkePY4SAiIlfRNU3s/Bk8D0f+Cio4TNMU27FklhN5HSWTYyzfTNM0EY/HRTOl85zI5BjLN7MjjBEAEomEeObONEODpssUChoLjrxxSoWIiIgcV1CHIxwOIxKJiA6g3PM6SibHWJ6Z8UQCoVBILK9ZR8jkGMs3s9zHGI1GxbJaoxsadKEOB6dU8scOBxERETmOi0aJiMhdDB2aLvT3tlbg9eldjAUHERG5iqZr0IROEaqBUyr54pQKEREROY4dDiIichXd0KALdTh0djjyxg4HEREROY4dDiIichVNl1s0qikuGs0XCw4iInIVTqmUBqdUiIiIyHHscBARkatoBg+LLQV2OIiIiMhx7HAQEZGrNHU4hBaNwhbJcQMWHERE5CpcNFoanFIhIiIix7HDQURErqJpGjShy9NrNjsc+WLBQURErqIbOnShNRy64kRBvvhOERERkePY4SAiIlcRPQ+H4pRKvgoqOEzTFNuxZJYTeR0lk2Ms30zTNBGPx0UzpfOcyOQYyzezI4wRABKJhHgmlR47HERE5CrscJRGQQVHOBxGJBIRHUC553WUTI6xPDPjiQRCoZBYXrOOkMkxlm9muY8xGo2KZbWGi0ZLg+8UEREROY5TKkRE5C6CUyrglEre2OEgIiIix7HDQURErqJrGnShM43qGjsc+WLBQURErqIZutzVYm1OFOSL7xQRERE5jh0OIiJyFdHL0/PibXljh4OIiIgcxw4HERG5iuiZRtnhyBsLDiIichUuGi0NvlNERETkOHY4iIjIVXQDgotGRWJcgQUHERG5iqZr0IRO/CWV4wacUiEiIiLHscNBRESuouuCl6e3+Hd7vvhOERER7WHxeByvv/461q9fn/dz6uvr8dZbb2HLli0Ojsw5LDiIiMhVms/DIXUrxPr16zFz5kwccMABGDNmDO699968nverX/0KPXr0wBlnnIGamhpccsklsO2OtWK1oCkV0zTFdiyZ5UReR8nkGMs30zRNxONx0UzpPCcyOcbyzewIYwSARCIhnrkz0fNwFJjz8ccfY//998eHH36IwYMH5/Wcxx9/HL/85S/x7LPPYsyYMVixYgVGjRqFwYMH47LLLitm2CXBDgcREdEeMm7cOMycORPV1dV5P+fOO+/E+PHjMWbMGADAwIEDcdppp+Guu+5yaJTOKKjDEQ6HEYlERAdQ7nkdJZNjLM/MeCKBUCgkltesI2RyjOWbWe5jjEajYlmt0XQdmi7U4RDKacubb76JadOm5WwbOXIk7rnnHmQyGXg8HeP4j44xSiIiojLW0NCQ8/9+vx9+v18k+8svv0TXrl1ztnXr1g2ZTAY7duxAt27dRPbjNE6pEBGRq+iGLnoDgN69e6Oqqip7mzdvnth4vV4vGhsbc7Y1r3Pxer1i+3EaOxxEROQugotG8VVOXV1dznSsVHcDAPr27dvi8Nn169ejurrakWllp7DDQUREtJsikUjObXcKji1btuC1117LHvZ69NFH48knn4RlWdnHPPbYYzj66KN3e9x7EjscRETkKpoueFhsgYtGk8kk3n77bQBAKpVCXV0dXnvtNVRXV2PAgAEAgEcffRQXXXQRTNNEZWUlrrjiCsyfPx9nn302vve97+GJJ57AG2+8gddee03kNewp7HAQERHtIZs2bcKsWbMwa9Ys7L///njjjTcwa9Ys3H777dnH7L333hg5ciQMwwAA9OzZE7W1tQiHw5g3bx7q6+vx8ssvY+jQoaV6GUVhh4OIiFyllIfF9u3bt93OxKRJkzBp0qScbf3798cdd9xR8PjKCQsOIiJylaYzjRpCWVb7DyIAnFIhIiKiPYAdDiIicpVSXkvFzfhOERERkePY4SAiIlfRdR260KJRqRw3YMFBRESuwimV0uA7RURERI5jh4OIiFyFHY7SYMFBRESuommCJ/7SWHDki+8UEREROY4dDiIi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FRAsMAFowQpUVQbF8uxgEFVh2Q8D5alAVUTuwx0A4PGK/tuGpsvmOZQpPsYOklnuY5Tspu8pdXV1Oe9Ba90NAKiqqsKXX36Zs23btm3QNG2X72Exz9ldkyZNwhdffIHevXtjzZo1GDVqFJ566ikkk0mcc845RWVyDQcREbmKUk03qSygqeDK58t/6NCheP/993O2vffeezjooIPg87X+B1Qxz9kd7777Lt555x2sXr0ajz32GBYtWoS///3viEajOPLIIxEMFvdHGU/8RURErmIrJXorxNlnn43FixdjxYoVAIANGzZg4cKFOV2D5557DmeccQYav1pDmM9zJK1evRojR45EMBiE3+9HLNa03rKyshIXX3wxnn766aJyWXAQERHtIeeccw7OOOMMjBo1Ct/5zndwyCGHYPjw4bjiiiuyj1m9ejXuu+8+pNPpvJ8jqbGxERUVFQCAXr164YMPPsjeV19fD9u2i8rllAoREbmK+uomlVUITdNw991344orrsDHH3+MPn364PDDD895zPjx4/Gvf/0r+6Wfz3Occvjhh0PXdXz3u9/FN77xDdx999249957i8piwUFERLSHDRo0CIMGDWr1vv333x/7779/Qc+RdOyxx2L06NEAmq4Su3TpUvzmN7/B559/jptuugknn3xyUbksOIiIyFVs1XSTyupsDMOA1/u/w/n79euHv/71r7udyzUcRETkKkop0Vtns3jxYvz4xz8Wz2XBQURERFk1NTVYs2aNeC4LDiIicpXmKRWpW2czcuRIBAIBXH/99dlDYiWw4CAiIqKsRYsW4fXXX8dVV12FyspKVFVVobq6OnubPn16UblcNEpERK7TCRsTYkaMGIF77rlnl/d//box+WLBQURErsKjVNpWU1ODU089VTyXBQcRERG1kEwmsWLFCui6jkMOOWS387iGg4iIXIWHxbZvyZIl2G+//XDooYdi3rx5AIB169bh4IMPzl7jpVAsOIiIyFVs4Vtn09DQgLPPPhvXXXcd/v73v2e39+rVC2PGjCn61OYsOIiIiCjrjTfewMCBAzF9+vTs9VyaHXrooaitrS0ql2s4iIjIVZRquklldTamaSIYDAJounDczrZv355z2vNCsMNBREREWYcffjhqa2uxdu3anIJjw4YNuPXWWzFmzJiicgvqcJimWdROdpWlx+JyebE4tERK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",
      "text/plain": [
       "<Figure size 550x550 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "_n = n_slider_task2.value\n",
    "_N = N_slider_task2.value\n",
    "_step = step_slider_task2.value\n",
    "_T = 0.0125\n",
    "_mask = make_L_mask(_n)\n",
    "_i0, _j0 = nearest_grid_point(0.25, 0.25, _n)\n",
    "_i1, _j1 = nearest_grid_point(0.75, 0.15, _n)\n",
    "_u0 = make_two_hot_spots(_n, _i0, _j0, _i1, _j1, 100.0)\n",
    "_dx = 1.0 / (_n - 1)\n",
    "_u = run_heat_partial(_u0, _mask, alpha, _T, _N, _step, _dx, laplacian, heat_step)\n",
    "_fig, _ax = plt.subplots(figsize=(5.5, 5.5))\n",
    "_im = plot_field(_ax, _u, _mask, f\"two hot spots, grid {_n}x{_n}\")\n",
    "_cbar = plt.colorbar(_im, ax=_ax, fraction=0.046)\n",
    "_cbar.set_label(\"Temperature (°C)\")\n",
    "_fig.tight_layout()\n",
    "_fig;"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "wAgl",
   "metadata": {
    "marimo": {
     "config": {
      "hide_code": true
     },
     "md_prefix": "r"
    }
   },
   "source": [
    "If you still see only one glow above, the marked line hasn't been completed yet. Once it has, you should see two separate patches of warmth, each spreading out from its own point."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "rEll",
   "metadata": {
    "marimo": {
     "config": {
      "hide_code": true
     },
     "md_prefix": "r"
    }
   },
   "source": [
    "## Wrap-up\n",
    "\n",
    "- Real heat never flows somewhere and makes it colder than the coldest thing around. Whenever this simulation showed blue, that's exactly what it claimed happened: a clear sign the answer has gone wrong in a fundamental way.\n",
    "- A simulation going wrong isn't always a matter of getting slightly less accurate. Sometimes it turns into something qualitatively different from the thing it's supposed to be modelling.\n",
    "- This is a real, well known phenomenon called **numerical instability**. It shows up whenever a method takes steps that are too large relative to the grid it's running on, in any equation, on any grid.\n",
    "- Everything here, the update rule, the instability, the grid itself, is built from the same single idea you'll meet properly in Chapter 6 (taught in Week 7): Euler's method. There, it's one number changing in time. Here, it's every cell of a grid changing at once. Same rule, much bigger picture."
   ]
  }
 ],
 "metadata": {
  "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.3"
  },
  "marimo": {
   "app_config": {
    "app_title": "Welcome week: can a computer get a simulation wrong?",
    "width": "medium"
   },
   "marimo_version": "0.25.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
