From 7c8f1ab476d390325683f6e60f42f3f7f43dbc9d Mon Sep 17 00:00:00 2001
From: Ulrich <ulrich.kerzel@rwth-aachen.de>
Date: Mon, 17 Mar 2025 11:38:41 +0100
Subject: [PATCH] add continuous casting exercise

---
 .../ContinuousCasting_ConicSteelVessel.ipynb  | 703 ++++++++++++++++++
 1 file changed, 703 insertions(+)
 create mode 100644 datascienceintro/ContinuousCasting_ConicSteelVessel.ipynb

diff --git a/datascienceintro/ContinuousCasting_ConicSteelVessel.ipynb b/datascienceintro/ContinuousCasting_ConicSteelVessel.ipynb
new file mode 100644
index 0000000..c0fbecd
--- /dev/null
+++ b/datascienceintro/ContinuousCasting_ConicSteelVessel.ipynb
@@ -0,0 +1,703 @@
+{
+  "cells": [
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "ROkOel9qfsfr"
+      },
+      "source": [
+        "# Continuous Casting with Conic Supply Vessel\n",
+        "\n",
+        "In the following example, we consider a continuous steel casting production plant that is supplied with a conic vessel holding molten steel.\n",
+        "To ensure operations of the production plant, we require a througput of 6000 kg/min of molten steel and changing the vessels takes 60 seconds.\n",
+        "The height of the liquid steel inside the vessel is 2 metres initially and the radius at the bottom is $R_1 = 0.9$, the radius at the top is $R_2 = 1.2$ m.\n",
+        "The vessel has an outlet of radius $r$ and we need to optimise the radius such that we can maintain the required throughput and include the 60 second change-over time as well.\n",
+        "\n",
+        "The geometry of the vessel looks like this:\n",
+        "\n",
+        "![image.png](data:image/png;base64,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)\n",
+        "\n",
+        "N.B. This is the same example as discussed in the lecture \"Numerische Modellierung in der Prozesstechnik\" and we discuss this example here to apply the methods of this course to the same example.\n",
+        "\n"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "JvESDWsUhe94"
+      },
+      "source": [
+        "## Torrielli's Law\n",
+        "\n",
+        "We model this using Torricelli's law, assuming\n",
+        "\n",
+        "- laminar and continuous flow\n",
+        "- ignorign the effects of viscosity\n",
+        "- incompressible liqued with uniform density\n",
+        "- $r << R_1, R_2$\n",
+        "- no effects from the geometry of the outlet orifice, etc.\n",
+        "\n",
+        "Then, Torricelli's law gives the velocity of the liquid as:\n",
+        "$$ v = \\sqrt{2gh}$$\n",
+        "where $g$ is the constant of gravity, and $h$ is the height of the liquid.\n",
+        "\n",
+        "The volumetric flow rate trough the hole at the bottom is given by\n",
+        "$$Q = av$$\n",
+        "with $a = \\pi r^2$.\n",
+        "Due to the conic shape of the vessel, the volume of a slice through the cone depends on the height, leading to:\n",
+        "$$ \\frac{dV}{dt} = - Q = - a \\sqrt{2 g h} = A(h) \\frac{dh}{dt}$$\n",
+        "\n",
+        "\n",
+        "\n",
+        "Hence, the differential equation we have to solve (for each $r$) is given by:\n",
+        "$$\n",
+        "\\frac{dh}{dt} = -\\frac{a}{\\pi \\left[ R_1 + s h \\right]^2} \\sqrt{2 g h}\n",
+        "$$\n",
+        "\n",
+        "where:\n",
+        "\n",
+        "$$\n",
+        "s = \\frac{R_2 - R_1}{H}\n",
+        "$$\n",
+        "\n",
+        "Substituting $ s $ into the equation:\n",
+        "\n",
+        "$$\n",
+        "\\frac{dh}{dt} = -\\frac{a}{\\pi \\left[ R_1 + \\left( \\dfrac{R_2 - R_1}{H} \\right) h \\right]^2} \\sqrt{2 g h}\n",
+        "$$\n"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "colab": {
+          "base_uri": "https://localhost:8080/"
+        },
+        "id": "fDiLVN2ZjOiZ",
+        "outputId": "84cbf733-5539-4c18-ef5e-c47391669906"
+      },
+      "outputs": [],
+      "source": [
+        "# make sure we have the required libraries\n",
+        "# ! pip install torchdiffeq"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "pAfdaw0afrWZ"
+      },
+      "outputs": [],
+      "source": [
+        "import numpy as np\n",
+        "import matplotlib.pyplot as plt\n",
+        "import seaborn as sns\n",
+        "\n",
+        "# constant of gravity, take the pre-defined one instead of defining our own\n",
+        "import scipy\n",
+        "\n",
+        "\n",
+        "import torch\n",
+        "from torchdiffeq import odeint\n",
+        "\n",
+        "\n",
+        "from datetime import datetime"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "EiNuMdQfkauk"
+      },
+      "source": [
+        "# Plot Height vs Time\n",
+        "\n",
+        "As a first step, we visualise how the height of the molten steel in the conic vessel changes with time.\n",
+        "\n",
+        "We will use $r=2$ cm for this example, though the radius $r$ is the quantity we want to optimise later to make sure we can maintain the required throughput, including the change-over time.\n"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "AcIz5EjClHSh"
+      },
+      "outputs": [],
+      "source": [
+        "# Geometry of the truncated cone\n",
+        "H = 2.0     # Total height of the vessel (m)\n",
+        "R1 = 0.9    # Radius at the bottom (m)\n",
+        "R2 = 1.2    # Radius at the top (m)\n",
+        "s = (R2 - R1) / H  # Slope of the radius as a function of height\n"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "ccZ5IeSUwf4j"
+      },
+      "outputs": [],
+      "source": [
+        "# assume a fixed radius of the orifice\n",
+        "a = np.pi * (0.02)**2  # Area of the hole at the bottom (m^2)\n",
+        "                       # assuming r=2cm"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "OP5j1PjUlMN8"
+      },
+      "outputs": [],
+      "source": [
+        "# Time parameters\n",
+        "t0 = 0.0          # Initial time (s)\n",
+        "t_end = 3000.0       # End time (s)\n",
+        "dt = 0.1           # Time step (s)\n",
+        "t_values = torch.arange(t0, t_end + dt, dt)\n",
+        "\n",
+        "# Initial condition\n",
+        "h0 = torch.tensor([H], dtype=torch.float32)  # Initial height of the liquid (full vessel)\n",
+        "\n",
+        "# Physical Constants\n",
+        "g = torch.tensor(# YOUR CODE HERE, dtype=torch.float32)"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "ATNqzi02nMgB"
+      },
+      "source": [
+        "This is the differential equation from above, assuming Torricelli's law.\n",
+        "\n",
+        "We need to encode this as ```torch``` tensors, so that we can make use of the advanced compute capabilities of PyTorch.\n",
+        "\n",
+        "We use [torch.clamp](https://pytorch.org/docs/stable/generated/torch.clamp.html) to make sure that the height of the steel in the vessel does not become negative.\n",
+        "\n",
+        "**N.B.** The function ```def dhdt(t,h)``` also depends on the parameter ```a``` (the area of the outlet orifice) and ```g```. Here, we have specified these as a global variables above.\n",
+        "\n",
+        "Since the function ```odeint``` does not take additional arguments, we have to specify these outside the scope of the function.\n",
+        "This is not an issue at this stage, but we will see later that this requires us to write the code in a specific way when we want to optimise the radius of the orifice and, hence, the area ```a```."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "RRO687otlxU5"
+      },
+      "outputs": [],
+      "source": [
+        "# Function defining the differential equation dh/dt\n",
+        "def dhdt(t, h):\n",
+        "    # Ensure h is non-negative\n",
+        "    h = # YOUR CODE HERE\n",
+        "    # Compute r(h)\n",
+        "    r = R1 + s * h\n",
+        "    # Compute A(h)\n",
+        "    A = torch.pi * r ** 2\n",
+        "    # Compute dh/dt\n",
+        "    sqrt_term = torch.sqrt(2 * g * h)\n",
+        "    dh = - (a / A) * sqrt_term\n",
+        "    # Handle h = 0 to prevent division by zero\n",
+        "    dh = torch.where(h > 0.0, dh, torch.tensor(0.0))\n",
+        "    return dh"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "NJ5soVYNly9b"
+      },
+      "outputs": [],
+      "source": [
+        "# Solve the ODE using torchdiffeq's odeint function\n",
+        "h_values = odeint(dhdt, h0, t_values, method='dopri5')\n",
+        "\n",
+        "# Flatten the result to 1D tensor for easy handling\n",
+        "h_values = h_values.view(-1)\n",
+        "\n",
+        "# Ensure non-negative heights\n",
+        "h_values = torch.clamp(h_values, min=0.0)\n"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "colab": {
+          "base_uri": "https://localhost:8080/",
+          "height": 487
+        },
+        "id": "dSd1kx4ql4vC",
+        "outputId": "6de2a73a-cdd2-465b-ddda-a2614079eb91"
+      },
+      "outputs": [
+        {
+          "data": {
+            "image/png": "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EMePHxfx8fFi27ZtomHDhqJLly6afTDvFffuu++K/fv3i/j4eHHmzBnx7rvvCplMJvbs2SOEqNnvdRa81cDy5ctFgwYNhJGRkWjfvr04cuSI1CHVWEOHDhWOjo7CyMhI1KtXTwwdOlRcuXJFsz03N1e88cYbwtraWpiYmIhBgwaJpKQkrX1cu3ZN9O7dWxgbGwtbW1vx9ttvi4KCAl0fSrW2b98+AaDEY/To0UKIh0uTffDBB8Le3l4olUrRo0cPERsbq7WPtLQ0MXz4cGFmZiYsLCzE2LFjxf3797X6nD59WnTq1EkolUpRr1498dFHH+nqEKulx+U9JydH9OzZU9StW1coFArh4uIixo8fX+I/z8x7xZSWbwDixx9/1PSprM+Vffv2CW9vb2FkZCQaNmyoNUZt86S8JyYmii5duggbGxuhVCqFu7u7mDlzptY6vEIw7xX16quvChcXF2FkZCTq1q0revTooSl2hajZ73WZEEJU7TlkIiIiIiLpcA4vEREREek1FrxEREREpNdY8BIRERGRXmPBS0RERER6jQUvEREREek1FrxEREREpNdY8BIRERGRXmPBS0RERER6jQUvEVE1NmbMGAQFBUk2/siRI7F48eJy9R02bBg+++yzKo6IiKjieKc1IiKJyGSyx26fO3cu3nrrLQghYGVlpZug/uP06dPo3r07EhISYGZm9sT+MTEx6NKlC+Lj42FpaamDCImIyocFLxGRRJKTkzVfb9y4EXPmzEFsbKymzczMrFyFZlV57bXXYGhoiJUrV5b7Ne3atcOYMWMwefLkKoyMiKhiOKWBiEgiDg4OmoelpSVkMplWm5mZWYkpDd26dcPUqVMxffp0WFtbw97eHt9//z2ys7MxduxYmJubw93dHX/99ZfWWDExMejduzfMzMxgb2+PkSNH4s6dO2XGVlRUhM2bN6N///5a7V9//TUaN24MlUoFe3t7vPjii1rb+/fvjw0bNjx7coiIKhELXiKiGmbt2rWwtbXFsWPHMHXqVEyaNAkvvfQSOnTogJMnT6Jnz54YOXIkcnJyAADp6eno3r07WrdujePHj2PXrl1ISUnBkCFDyhzjzJkzyMjIQNu2bTVtx48fx7Rp07BgwQLExsZi165d6NKli9br2rdvj2PHjiEvL69qDp6I6Cmw4CUiqmFatWqF999/H40bN0ZISAhUKhVsbW0xfvx4NG7cGHPmzEFaWhrOnDkDAPjqq6/QunVrLF68GE2bNkXr1q2xevVq7Nu3D5cuXSp1jISEBMjlctjZ2WnaEhMTYWpqin79+sHFxQWtW7fGtGnTtF7n5OSE/Px8rekaRERSY8FLRFTDtGzZUvO1XC5HnTp14OXlpWmzt7cHANy+fRvAw4vP9u3bp5kTbGZmhqZNmwIA4uLiSh0jNzcXSqVS68K6gIAAuLi4oGHDhhg5ciR+/fVXzVnkYsbGxgBQop2ISEoseImIahiFQqH1XCaTabUVF6lqtRoAkJWVhf79+yM6Olrrcfny5RJTEorZ2toiJycH+fn5mjZzc3OcPHkS69evh6OjI+bMmYNWrVohPT1d0+fu3bsAgLp161bKsRIRVQYWvEREeq5NmzY4d+4cXF1d4e7urvUwNTUt9TXe3t4AgPPnz2u1Gxoawt/fH0uWLMGZM2dw7do17N27V7M9JiYG9evXh62tbZUdDxFRRbHgJSLSc5MnT8bdu3cxfPhw/Pvvv4iLi8Pu3bsxduxYFBUVlfqaunXrok2bNjh48KCm7c8//8SXX36J6OhoJCQk4KeffoJarYaHh4emzz///IOePXtW+TEREVUEC14iIj3n5OSEQ4cOoaioCD179oSXlxemT58OKysrGBiU/Wvgtddew6+//qp5bmVlhS1btqB79+5o1qwZVq5cifXr16NFixYAgAcPHiAsLAzjx4+v8mMiIqoI3niCiIhKlZubCw8PD2zcuBF+fn5P7P/NN99g69at2LNnjw6iIyIqP57hJSKiUhkbG+Onn3567A0q/kuhUGD58uVVHBURUcXxDC8RERER6TWe4SUiIiIivcaCl4iIiIj0GgteIiIiItJrLHiJiIiISK+x4CUiIiIivcaCl4iIiIj0GgteIiIiItJrLHiJiIiISK+x4CUiIiIivfZ/A3IOnNUMjb4AAAAASUVORK5CYII=",
+            "text/plain": [
+              "<Figure size 800x500 with 1 Axes>"
+            ]
+          },
+          "metadata": {},
+          "output_type": "display_data"
+        }
+      ],
+      "source": [
+        "# Plot the results\n",
+        "t_np = t_values.numpy()\n",
+        "h_np = h_values.detach().numpy()\n",
+        "\n",
+        "plt.figure(figsize=(8, 5))\n",
+        "sns.lineplot(x=t_np, y=h_np)\n",
+        "plt.title('Height of Liquid in Truncated Cone Over Time')\n",
+        "plt.xlabel('Time (s)')\n",
+        "plt.ylabel('Height (m)')\n",
+        "plt.grid(True)\n",
+        "plt.show()"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "G6dj0FhwosoG"
+      },
+      "source": [
+        "# Optimising Outlet Radius - Differential Equation\n",
+        "\n",
+        "We will now find the optimal radius of the output orifice $r$.\n",
+        "As discussed above, we need to maintain a specific throughput, as well as consider the time it takes to change vessels for continuous operations.\n",
+        "\n",
+        "This means that we need to find a radius of the output orifice such that the vessel is empty at the target time ```t_target = 428.32``` s.\n",
+        "\n",
+        "N.B. in the following, we will denote the radius of the output orifice for each step of the optimisation as $r_0$ to avoid confusion with values inside each optimisation step.\n",
+        "\n"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "ti5Iu5x6qAhH"
+      },
+      "outputs": [],
+      "source": [
+        "# Target emptying time\n",
+        "t_target = torch.tensor(428.32, dtype=torch.float32)  # seconds"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "PTwdltLgqDMS"
+      },
+      "source": [
+        "We now define the function that computes the height of the remaining molten steel inside the vessel at the target time ```t_target``` for a given radius $r_0$ of the output orifice.\n",
+        "\n",
+        "We then want to find the value $r_0$ where the height is zero at the end, i.e. when the vessel is empty.\n",
+        "\n",
+        "\n",
+        "This is implemented in the following way: For each radius, we solve the differential equation, calculate the height at various times $t$, and, in particular the time at ```t_target```.\n",
+        "\n",
+        "Since we want to find the value of $r_0$ for which the function is zero, we want to find the *root* of the function of the heights as we change $r_0$.\n",
+        "\n",
+        "Note:\n",
+        "Unlike earlier, the area of the orifice now depends on the radius $r_0$ that we are changing. Ideally, we would add another argument to the function with the differential equation.\n",
+        "However, the function ```odeint``` of [torchdiffeq](https://github.com/rtqichen/torchdiffeq) does not support this. Therefore, we define the function for the differential equation within the function computing the height at time ```t_target```. Then, for each round, the value of the area $a$ is defined and we, kind-off, side-step the problem."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "GJG0nbEtsSof"
+      },
+      "outputs": [],
+      "source": [
+        "# Compute the height of the molten steel for a given\n",
+        "# radius of the outlet orifice r_0 after t_target has elapsed\n",
+        "\n",
+        "def compute_h_at_tend(r_o):\n",
+        "    # Ensure r_o is a tensor with requires_grad=True\n",
+        "    if not isinstance(r_o, torch.Tensor):\n",
+        "        r_o = torch.tensor(r_o, dtype=torch.float32, requires_grad=True)\n",
+        "    else:\n",
+        "        r_o = r_o.clone().detach().requires_grad_(True)\n",
+        "\n",
+        "\n",
+        "    # a is used inside dhdt, but we cannot pass it as an argument\n",
+        "    # hence, we define a here, making it a \"global\" variable as\n",
+        "    # far as dhdt is concerned.\n",
+        "    # (same for g, but that truly is a constant, at least for our purposes here.)\n",
+        "    a = # YOUR CODE HERE\n",
+        "\n",
+        "    # Define the differential equation dh/dt\n",
+        "    def dhdt(t, h):\n",
+        "        h = # YOUR CODE HERE\n",
+        "        r = R1 + s * h\n",
+        "        A = torch.pi * r ** 2\n",
+        "        sqrt_term = torch.sqrt(2 * g * h)\n",
+        "        dh = - (a / A) * sqrt_term\n",
+        "        return dh\n",
+        "\n",
+        "    # Time points for solving the ODE (start and end)\n",
+        "    t_span = torch.tensor([0.0, t_target], dtype=torch.float32)\n",
+        "\n",
+        "    # Solve the ODE\n",
+        "    h_values = odeint(dhdt, h0, t_span, method='dopri5')\n",
+        "    h_tend = h_values[-1, 0]  # Height at t_target\n",
+        "\n",
+        "    return h_tend, r_o"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "bj2N5KIL0CB9"
+      },
+      "source": [
+        "Before we find the optimal value, we can plot the result to get a feeling for our expectation.\n",
+        "\n",
+        "N.B. due to the line ```h = h.clamp(min=0.0)``` we cannot have negative heights in the vessel."
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "1dEYfP_s0jWq"
+      },
+      "source": [
+        "**Exercise**\n",
+        "\n",
+        "Plot the function of the height of the remaining steel in the vessel after the target time ```t_target``` has elapsed for the radius in the interval $(0.02, 0.05)$ for 100 steps.\n",
+        "Note that we need PyTorch tensors."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "V7OcDeyg0umW"
+      },
+      "outputs": [],
+      "source": [
+        "# Generate x_space and compute y_space\n",
+        "x_space = torch.linspace(0.02, 0.05, steps=50)  # Orifice radii from 0.02 m to 0.05 m\n",
+        "y_space = []\n",
+        "\n",
+        "##\n",
+        "## your code here\n",
+        "##\n",
+        "\n",
+        "# Convert to NumPy arrays for plotting\n",
+        "x_space_np = x_space.numpy()\n",
+        "y_space_np = np.array(y_space)\n",
+        "\n",
+        "# Plotting\n",
+        "plt.figure(figsize=(10, 6))\n",
+        "plt.plot(x_space_np, y_space_np, label='h(t_target)')\n",
+        "plt.axhline(y=0, color='black', linestyle='--', label='h=0')\n",
+        "\n",
+        "# Include known solution\n",
+        "plt.axvline(x=0.038, color='red', linestyle='--', label='r=0.038 m')\n",
+        "\n",
+        "plt.title('Height at $t_{target}$ vs Orifice Radius (Conic Vessel)')\n",
+        "plt.xlabel('Orifice Radius $r$ (m)')\n",
+        "plt.ylabel('Height $h(t_{target})$ (m)')\n",
+        "plt.legend()\n",
+        "plt.grid(True)\n",
+        "plt.show()"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "ZpDou3GMspeU"
+      },
+      "source": [
+        "## Newton's Method\n",
+        "\n",
+        "We can find the root of the above function using, for example, Newton's method, and detemine the optimal radius of the outlet orifice."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "T5I5RaEeszoC"
+      },
+      "outputs": [],
+      "source": [
+        "def newtons_method(f, r_o_init, tol=1e-6, rtol=1e-6, max_iter=20):\n",
+        "    r_o = torch.tensor(r_o_init, dtype=torch.float32, requires_grad=True)\n",
+        "    for i in range(max_iter):\n",
+        "        h_tend, r_o = f(r_o)\n",
+        "        f_r_o = h_tend  # We aim for h_tend = 0\n",
+        "\n",
+        "        if torch.abs(f_r_o) < tol:\n",
+        "            print(f\"Converged at iteration {i}: r_o = {r_o.item():.6f} m\")\n",
+        "            return r_o.item()\n",
+        "\n",
+        "        f_r_o.backward()\n",
+        "        f_prime = r_o.grad.item()\n",
+        "\n",
+        "        if f_prime == 0:\n",
+        "            print(\"Derivative zero. Stopping iteration.\")\n",
+        "            return r_o.item()\n",
+        "\n",
+        "        # Update r_o using Newton's method\n",
+        "        r_o_new = # YOUR CODE HERE\n",
+        "\n",
+        "        # Check for convergence based on change in r_o\n",
+        "        delta_r_o = torch.abs(r_o_new - r_o)\n",
+        "        if delta_r_o < rtol:\n",
+        "            print(f\"Converged at iteration {i}: r_o = {r_o_new.item():.6f} m (delta_r_o < {rtol})\")\n",
+        "            return r_o_new.item()\n",
+        "\n",
+        "        # Prepare for next iteration\n",
+        "        r_o = r_o_new.detach().requires_grad_(True)\n",
+        "        print(f\"Iteration {i}: r_o = {r_o.item():.6f} m, h(t_end) = {h_tend.item():.6f}, f'(r_o) = {f_prime:.6f}, delta_r_o = {delta_r_o.item():.6f}\")\n",
+        "\n",
+        "    print(\"Maximum iterations reached without convergence.\")\n",
+        "    return r_o.item()"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "colab": {
+          "base_uri": "https://localhost:8080/"
+        },
+        "id": "W9tlOcaNs2tY",
+        "outputId": "0798d66d-d770-47d3-f5c4-476be420fcc9"
+      },
+      "outputs": [
+        {
+          "name": "stdout",
+          "output_type": "stream",
+          "text": [
+            "Iteration 0: r_o = 0.035460 m, h(t_end) = 0.871790, f'(r_o) = -83.348442, delta_r_o = 0.010460\n",
+            "Iteration 1: r_o = 0.037223 m, h(t_end) = 0.081241, f'(r_o) = -46.081654, delta_r_o = 0.001763\n",
+            "Iteration 2: r_o = 0.038015 m, h(t_end) = 0.018847, f'(r_o) = -23.784437, delta_r_o = 0.000792\n",
+            "Iteration 3: r_o = 0.038396 m, h(t_end) = 0.004587, f'(r_o) = -12.040705, delta_r_o = 0.000381\n",
+            "Iteration 4: r_o = 0.038583 m, h(t_end) = 0.001134, f'(r_o) = -6.053280, delta_r_o = 0.000187\n",
+            "Iteration 5: r_o = 0.038676 m, h(t_end) = 0.000282, f'(r_o) = -3.034362, delta_r_o = 0.000093\n",
+            "Iteration 6: r_o = 0.038722 m, h(t_end) = 0.000070, f'(r_o) = -1.519046, delta_r_o = 0.000046\n",
+            "Iteration 7: r_o = 0.038746 m, h(t_end) = 0.000018, f'(r_o) = -0.759962, delta_r_o = 0.000023\n",
+            "Converged at iteration 8: r_o = 0.038746 m\n",
+            "\n",
+            "Optimal orifice radius found: 38.75 mm\n",
+            "Time taken: 0:00:01.596860\n"
+          ]
+        }
+      ],
+      "source": [
+        "# Define the function f(r_o)\n",
+        "def f(r_o):\n",
+        "    h_tend, r_o = compute_h_at_tend(r_o)\n",
+        "    return h_tend, r_o\n",
+        "\n",
+        "# Initial guess for r_o (in meters)\n",
+        "r_o_initial = 0.025  # 25 mm\n",
+        "\n",
+        "# Run Newton's method\n",
+        "t_start = datetime.now()\n",
+        "optimal_r_o = newtons_method(f, r_o_initial, tol=1e-5, rtol=1e-6, max_iter=50)\n",
+        "t_stop = datetime.now()\n",
+        "print(f\"\\nOptimal orifice radius found: {optimal_r_o * 1000:.2f} mm\")\n",
+        "print(f'Time taken: {t_stop - t_start}')"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "XD0WIuTeuw1y"
+      },
+      "source": [
+        "Now plot the final function of height vs time for the optimal radius\n",
+        "\n",
+        "(remember that we cannot add another argument to the function ```dhdt```, so we need to define it again with the optimal radius).\n"
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "colab": {
+          "base_uri": "https://localhost:8080/",
+          "height": 564
+        },
+        "id": "sMYY2gAvu1mT",
+        "outputId": "808bc199-cbdc-4707-87dd-8b340e6d7b29"
+      },
+      "outputs": [
+        {
+          "data": {
+            "image/png": "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5fgeUcy5L38sp+8+udmeOX3+fGrZ2X1nym0fPXbsmPK7V4UKFcTFixdn+x3t9evXoo6Ojrh8+fJPrntJJ4iiRD/rUKm0Y8cOdOjQASdPnoSXl5fU4UguODgYTZs2xdGjR+Hj4yN1OERUgg0aNAj37t1TVmfLLx8fH8TGxuLGjRtqioyISoI5c+ZgxowZePDggWTFYDQBr7miQvP27VuV5+np6Zg/fz6MjY1Rp04diaIiIiqdJk2ahAsXLuSrnDQR0aekpqZi1qxZ+OGHH0p1YgXwmisqRKNHj8bbt2/h6emJ5ORkbNu2DadPn8Yvv/xS6nc8IqKiVq5cuSzFXChv4uLisvxw+LHsymgTlXTa2toqRS9KMyZXVGiaNWuGmTNnYs+ePXj37h0qVqyI+fPnY9SoUVKHRkRElGdjxozB6tWrP9mGV1sQlW685oqIiIgoF27duoWIiIhPtikp91cjovxhckVERERERKQGLGhBRERERESkBrzmKhsZGRmIiIiAkZFRvm52S0REREREJYMoinjz5g3s7e0hk3363BSTq2xERETAwcFB6jCIiIiIiEhDPHnyBGXLlv1kGyZX2TAyMgLwfgMaGxtLGktqaioOHjyIFi1aQFtbW9JYiAD2SdIs7I+kadgnSZOwP6pHfHw8HBwclDnCpzC5ykbmUEBjY2ONSK709fVhbGzMnYI0AvskaRL2R9I07JOkSdgf1Ss3lwuxoAUREREREZEaMLkiIiIiIiJSAyZXREREREREasDkioiIiIiISA2YXBEREREREakBkysiIiIiIiI1YHJFRERERESkBkyuiIiIiIiI1IDJFRERERERkRowuSIiIiIiIlIDJldERERERERqwOSKiIiIiIhIDZhcERERERERqQGTKyIiIiIiIjWQNLmaPn066tWrByMjI1hbWyMgIAB379797Ps2b96MqlWrQqFQwMXFBfv27VN5XRRFTJw4EXZ2dtDT04Ovry/u379fWKtBREREREQkbXJ17NgxjBw5EmfPnkVQUBBSU1PRokULJCYm5vie06dPo0ePHhg0aBCuXLmCgIAABAQE4MaNG8o2M2bMwLx587B48WKcO3cOBgYG8Pf3x7t374pitYiIiIiIqBSSNLnav38/+vfvjxo1asDV1RWrVq3C48ePcenSpRzfM3fuXLRs2RLffvstqlWrhqlTp6JO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",
+            "text/plain": [
+              "<Figure size 1000x600 with 1 Axes>"
+            ]
+          },
+          "metadata": {},
+          "output_type": "display_data"
+        }
+      ],
+      "source": [
+        "def dhdt_opt(t, h):\n",
+        "    h = h.clamp(min=0.0)\n",
+        "    r = R1 + s * h\n",
+        "    A = torch.pi * r ** 2\n",
+        "    sqrt_term = torch.sqrt(2 * g * h)\n",
+        "    a_opt = torch.pi * optimal_r_o ** 2\n",
+        "    dh = - (a_opt / A) * sqrt_term\n",
+        "    return dh\n",
+        "\n",
+        "t_values = torch.linspace(0.0, t_target.item(), steps=200)\n",
+        "h_values_opt = odeint(dhdt_opt, h0, t_values, method='dopri5')\n",
+        "h_values_opt = h_values_opt.view(-1)\n",
+        "h_values_opt = h_values_opt.clamp(min=0.0).detach().numpy()\n",
+        "\n",
+        "plt.figure(figsize=(10, 6))\n",
+        "plt.plot(t_values.numpy(), h_values_opt)\n",
+        "plt.title('Height of Liquid in Truncated Cone Over Time (Optimal r_o via Newton\\'s Method)')\n",
+        "plt.xlabel('Time (s)')\n",
+        "plt.ylabel('Height (m)')\n",
+        "plt.grid(True)\n",
+        "plt.show()"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "t1jsBFi-1zF-"
+      },
+      "source": [
+        "# Optimising Outlet Radius - Iterative Approach\n",
+        "\n",
+        "Instead of using a package to solve the differential equation, we can also use an iterative approach and discretise the differential equation.\n",
+        "The following function computes the height at a specific target time ```desired_time``` as a function of the radius ```r``` of the output orifice.\n",
+        "\n",
+        "The remainnig parameters (```R1, R2, initial_height```) specifiy the geometry and initial height of the molten steel in the vessel. We can make these parameters argument to the function here as we are not constrained by the calling function like ```odeint``` earlier.\n",
+        "\n",
+        "N.B. We need to work with PyTorch tensors (or types that are easily converted) to be able to call Newton's method efficiently later on."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "34g7UoXu2A0I"
+      },
+      "outputs": [],
+      "source": [
+        "def calculate_height_fixpoint(r: torch.tensor, delta_t: float = 1.0, t_max: float = 100000.0,\n",
+        "                       R1: float = 0.9, R2: float = 1.2, initial_height: float = 2.0,\n",
+        "                       desired_time: float = 428.2) -> torch.tensor:\n",
+        "    \"\"\"\n",
+        "    Calculate the height at a specific desired time based on the given radius value.\n",
+        "\n",
+        "    Parameters:\n",
+        "    r (torch.tensor): Radius value with requires_grad=True.\n",
+        "    delta_t (float): Time step for calculations (default is 1.0).\n",
+        "    t_max (float): Maximum time for simulation in seconds (default is 100000.0).\n",
+        "    R1 (float): First radius constant in meters (default is 0.9).\n",
+        "    R2 (float): Second radius constant in meters (default is 1.2).\n",
+        "    initial_height (float): The starting height in meters (default is 2.0).\n",
+        "    desired_time (float): The specific time at which to calculate the height.\n",
+        "\n",
+        "    Returns:\n",
+        "    torch.tensor: The height at the desired time.\n",
+        "    \"\"\"\n",
+        "\n",
+        "    # Ensure r has requires_grad=True\n",
+        "    if not r.requires_grad:\n",
+        "        r.requires_grad = True\n",
+        "\n",
+        "    # Number of steps\n",
+        "    num_steps = int(torch.ceil(torch.tensor(t_max / delta_t)).item())\n",
+        "    desired_step = int(torch.ceil(torch.tensor(desired_time / delta_t)).item())\n",
+        "    max_step = min(num_steps, desired_step)\n",
+        "\n",
+        "    # Initialize heights as a list to avoid in-place operations\n",
+        "    heights = []\n",
+        "    current_height = torch.tensor(initial_height, dtype=torch.float32)\n",
+        "\n",
+        "    # convert the numerical constants used in the code below\n",
+        "    # into torch.tensors, so we can use them without breaking the graph.\n",
+        "    # (PyTorch does not contain a set of mathematical or physical constants)\n",
+        "    pi = torch.tensor(np.pi, dtype=torch.float32)\n",
+        "    g = torch.tensor(scipy.constants.g, dtype=torch.float32)\n",
+        "\n",
+        "    for i in range(max_step):\n",
+        "        # Ensure no negative heights for sqrt\n",
+        "        current_height_pos = torch.clamp(current_height, min=0.0)\n",
+        "\n",
+        "        effective_radius = R1 + (current_height_pos / initial_height) * (R2 - R1)\n",
+        "        flow_rate = (r / effective_radius)**2 * torch.sqrt(2 * g * current_height_pos)\n",
+        "\n",
+        "        next_height = current_height - delta_t * flow_rate\n",
+        "\n",
+        "        # Ensure next_height is not negative\n",
+        "        next_height = torch.clamp(next_height, min=0.0)\n",
+        "\n",
+        "        # Append current_height to the list\n",
+        "        heights.append(current_height)\n",
+        "\n",
+        "        # Update current_height for the next iteration\n",
+        "        current_height = next_height\n",
+        "\n",
+        "    # The height at the desired time\n",
+        "    height_at_desired_time = current_height\n",
+        "\n",
+        "    return height_at_desired_time"
+      ]
+    },
+    {
+      "cell_type": "markdown",
+      "metadata": {
+        "id": "kkMJ_cT9E-H4"
+      },
+      "source": [
+        "**Exercise**\n",
+        "\n",
+        "Use the above function to call the function ```newtons_method``` we defined earlier and find the optimal radius of the output orifice."
+      ]
+    },
+    {
+      "cell_type": "code",
+      "execution_count": null,
+      "metadata": {
+        "id": "ybu1ouSSFQhG"
+      },
+      "outputs": [],
+      "source": [
+        "##\n",
+        "## your code goes here\n",
+        "##"
+      ]
+    }
+  ],
+  "metadata": {
+    "colab": {
+      "provenance": []
+    },
+    "kernelspec": {
+      "display_name": "Python 3",
+      "name": "python3"
+    },
+    "language_info": {
+      "name": "python"
+    }
+  },
+  "nbformat": 4,
+  "nbformat_minor": 0
+}
-- 
GitLab