{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# HW 1 Solutions\n",
        "\n",
        "**Name**:\n",
        "\n",
        "**ID**:\n",
        "\n",
        "### Load Environment\n",
        "\n",
        "The following code loads the environment and makes sure all needed\n",
        "packages are installed. This should be at the start of most Julia\n",
        "scripts."
      ],
      "id": "d16583bc-870c-4de9-81a8-d936868d496e"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [],
      "source": [
        "import Pkg\n",
        "Pkg.activate(@__DIR__)\n",
        "Pkg.instantiate()"
      ],
      "id": "2"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Standard Julia practice is to load all needed packages at the top of a\n",
        "file. If you need to load any additional packages in any assignments\n",
        "beyond those which are loaded by default, feel free to add a `using`\n",
        "statement, though [you may need to install the\n",
        "package](https://viveks.me/environmental-systems-analysis/tutorials/julia-basics.html#package-management)."
      ],
      "id": "b24023e3-1964-4fed-9982-a4fbee7b1b58"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [],
      "source": [
        "using Random # allows for random seed generation\n",
        "using Plots # basic plotting: can also install and use other packages\n",
        "using Graphs # for making graphs and networks\n",
        "using GraphRecipes # basic graph generation\n",
        "using LaTeXStrings # allows for LaTeX formatting in plots\n",
        "using Distributions # sampling and fitting of probability distributions\n",
        "using CSV # file I/O for CSV files\n",
        "using DataFrames # data structure for tabular data"
      ],
      "id": "4"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/plain": [
              "TaskLocalRNG()"
            ]
          }
        }
      ],
      "source": [
        "# this sets a random seed, which ensures reproducibility of random number generation. You should always set a seed when working with random numbers.\n",
        "Random.seed!(1)"
      ],
      "id": "6"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Problems (Total: 50 Points)\n",
        "\n",
        "### Problem 1 (10)\n",
        "\n",
        "#### Problem 1.1 (2)\n",
        "\n",
        "An example diagram might look like this:\n",
        "\n",
        "<figure>\n",
        "<img src=\"attachment:figures/riley_river_diagram.svg\"\n",
        "alt=\"River Diagram for Problem 1\" />\n",
        "<figcaption aria-hidden=\"true\">River Diagram for Problem 1</figcaption>\n",
        "</figure>\n",
        "\n",
        "#### Problem 1.2 (5)\n",
        "\n",
        "The first observation is that between factory, the highest concentration\n",
        "is at the earlier factory’s discharge, as CRUD only decays as it flows\n",
        "downriver and there are no intermediate sources. Thus if the river is in\n",
        "compliance at every discharge, it will be in compliance everywhere else.\n",
        "As a result, we only need to calculate conditions for compliance at the\n",
        "three river discharges.\n",
        "\n",
        "**Factory 1**: The inflow mass of CRUD is\n",
        "$$\\frac{0.2 \\text{mg}}{\\text{L}} \\times \\frac{1 \\text{L}}{1000 \\text{mg}} \\times \\frac{500,000 \\text{L}}{\\text{d}} = 100 \\text{mg}.$$\n",
        "\n",
        "The pre-treatment effluent mass from Factory 1 is (similarly)\n",
        "$1000 \\text{mg}$, so with a treatment level of $E_1$ Factory 1 would\n",
        "release $1000 (1 - E_1) \\text{mg}$, for a combined mass of\n",
        "$1100 - 1000 E_1 \\text{mg}$. Since the total volume of combined water\n",
        "(inflow + effluent) is $600 \\text{L}$, the comparison of the\n",
        "concentration to the regulatory requirement is\n",
        "$$\\begin{aligned}\n",
        "C_1 = \\frac{1100 - 1000E_1}{600} &\\leq 1 \\text{mg/L} \\\\\n",
        "1000 E_1 &\\geq 500 \\\\\n",
        "E_1 &\\geq 0.5.\n",
        "\\end{aligned}$$\n",
        "\n",
        "**Factory 2**: To find the inflow mass, we need to look at the decay of\n",
        "the CRUD downstream from the Factory 1 release. Since the first-order\n",
        "decay rate is $k=0.45 \\text{d}^{-1}$, the differential equation for\n",
        "CRUD’s mass is $M'(t) = -0.45dt$, and the solution is\n",
        "$$M(t) = M_0\\exp(-0.45t).$$ We want to rewrite this in terms of\n",
        "distance, rather than time, which we can do using the river’s velocity,\n",
        "$25 \\text{km/d}$. This means that in time \\$t , the river travels\n",
        "$x = 25 t \\text{km}$, so $t = x / 25$ and the differential equation is\n",
        "$$M(x) = M(0)\\exp(-0.45x / 25).$$ The initial condition is the mass from\n",
        "the Factory 1 release, which from before is\n",
        "$$M(0) = 1100 - 1000E_1 \\text{mg},$$ so after $x = 10 \\text{km}$, the\n",
        "mass is $$M(10) = (1100 - 1000E_1)\\exp(-0.18) \\text{mg}.$$ With\n",
        "treatment level $E_2$, Factory 2 releases $1200(1-E_2) \\text{mg}$, and\n",
        "the combined volume is $660 \\text{L}$, so the concentration condition is\n",
        "$$\\begin{aligned}\n",
        "C_2 = \\frac{(1100 - 1000E_1)\\exp(-0.18) + 1200(1-E_2)}{660} &\\leq 1 \\text{mg/L} \\\\\n",
        "2119 - 835 E_1 - 1200 E_2 &\\leq 660 \\\\\n",
        "835E_1 + 1200 E_2 &\\geq 1459.\n",
        "\\end{aligned}$$\n",
        "\n",
        "**Factory 3**: This follows an analogous calculation as above, with the\n",
        "new inflow initial condition the mass from the Factory 1 release and the\n",
        "distance downstream $x=15 \\text{km}$. The concentration condition\n",
        "becomes\n",
        "$$\\begin{aligned}\n",
        "3217 - 637E_1 - 916E_2 - 1600E_3 &\\leq 860 \\\\\n",
        "637E_1 + 916 E_2 + 1600 E_3 &\\geq 2357.\n",
        "\\end{aligned}$$\n",
        "\n",
        "So to summarize, the three conditions for compliance are:\n",
        "$$\\begin{aligned}\n",
        "E_1 &\\geq 0.5 \\\\\n",
        "835E_1 + 1200 E_2 &\\geq 1459 \\\\\n",
        "637E_1 + 916 E_2 + 1600 E_3 &\\geq 2357.\n",
        "\\end{aligned}$$\n",
        "\n",
        "#### Problem 1.3\n",
        "\n",
        "There is no “right” answer to this question, it’s more about reasoning\n",
        "through some relevant considerations. For example:\n",
        "\n",
        "The total cost for treatment levels $E_1$, $E_2$, and $E_3$ is\n",
        "$$Z = 50 (100)E_1^2 + 50 (60)E_2^2 + 50(200)E_3^2 = 5000E_1^2 + 3000E_2^2 + 10000E_3^2.$$\n",
        "So it is most cost effective for Factory 2 to maximize its treatment. On\n",
        "the other hand, this is also because Factory 2 emits the least effluent,\n",
        "though it is the most concentrated. But the total mass is less than that\n",
        "released by Factory 3. Factory 1 emits a moderate amount of effluent and\n",
        "it is only slightly more concentrated than Factory 3’s. So we might say\n",
        "that Factory 1 should do its minimum level or close to it, then rely on\n",
        "Factory 2 and Factory 3 to do their part to ensure compliance downriver,\n",
        "and asking Factory 2 or Factory 3 to do more might depend on whether\n",
        "want to penalize the concentration of effluent or the mass emitted.\n",
        "\n",
        "All this is to say: it would be nice to have a more principled approach\n",
        "to making these decisions! We will see one approach to this when we\n",
        "discuss *optimization*, though we could also use *simulation* to explore\n",
        "the tradeoffs between cost and concentrations as we vary the three\n",
        "treatment levels systematically.\n",
        "\n",
        "### Problem 2 (6)\n",
        "\n",
        "The change to the rate constant means that the new constant is\n",
        "$\\alpha' = 0.9 \\alpha = 9/200 \\text{d}^{-1}$. Let’s denote the new\n",
        "steady-state values by $X_1'$, $X_2'$, and $X_3'$. The other rate\n",
        "constants are still the same: $\\gamma = 1/4 \\text{d}^{-1}$ and\n",
        "$\\beta = 10/4 (\\text{d}\\mu\\text{mol}/\\text{L})^{-1}$. Since $\\gamma$ and\n",
        "$\\beta$ are the same, the steady-state condition for $X_1'$ means\n",
        "$X_2' = \\gamma/\\beta = 0.1 \\mu\\text{mol}/\\text{L}$, the same as before.\n",
        "\n",
        "However, now our only independent equation from the steady-state\n",
        "conditions is $$\\gamma X_1' = \\alpha' X_3'.$$ To get another equation,\n",
        "we know that there is no change to the overall mass, so\n",
        "$$X_1' + X_3' = X_1 + X_3 = 1.2 \\mu\\text{mol}/\\text{L}.$$ Thus\n",
        "$X_1' = 1.2 - X_3'$, and substituting (and putting all of the values\n",
        "over a common denominator),\n",
        "$$\\begin{aligned}\n",
        "\\frac{60}{200} - \\frac{50}{200}X_3' &= \\frac{9}{200}X_3' \\\\\n",
        "X_3' = \\frac{60}{59} \\approx 1.02 \\mu\\text{mol}/\\text{L}.\n",
        "\\end{aligned}$$\n",
        "Therefore $X_1' \\approx 0.18$. So the net effect of the reduced rate\n",
        "constant is not to change the amount of inorganic P ($X_2'$), but to\n",
        "reduce slightly the amount which resides in living organic matter, as\n",
        "the uptake from decomposing matter to living matter requires passing\n",
        "through the inorganic pathway.\n",
        "\n",
        "#### Problem 3.1 (3)\n",
        "\n",
        "The error is that the code initializes the minimum value (`min_value`)\n",
        "at `0`, which is below any of the values in `array_values`. Instead, if\n",
        "we initialize `min_value = array[1]`, any smaller values will be\n",
        "identified by the loop.\n",
        "\n",
        "A correct solution might look like:"
      ],
      "attachments": {
        "figures/riley_river_diagram.svg": {
          "image/svg+xml": "PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMzgw\nIDcwMCIgd2lkdGg9IjEzODAiIGhlaWdodD0iNzAwIiBmb250LWZhbWlseT0iJ1NvdXJjZSBTYW5z\nIFBybycsJ0xhdG8nLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZiIgeG1sbnM6YzJw\nYT0iaHR0cDovL2MycGEub3JnL21hbmlmZXN0Ij48bWV0YWRhdGE+PGMycGE6bWFuaWZlc3Q+QUFB\nV2dtcDFiV0lBQUFBZWFuVnRaR015Y0dFQUVRQVFnQUFBcWdBNG0zRURZekp3WVFBQUFCWmNhblZ0\nWWdBQUFFZHFkVzFrWXpKdFlRQVJBQkNBQUFDcUFEaWJjUU4xY200Nll6SndZVHBtTnpFeU16WTFO\naTAzWmpnNUxUUTRZekl0T0daa1pDMDBPV1ExWlRBNE5qY3lObVVBQUFBRGwycDFiV0lBQUFBcGFu\nVnRaR015WVhNQUVRQVFnQUFBcWdBNG0zRURZekp3WVM1aGMzTmxjblJwYjI1ekFBQUFBTHhxZFcx\naUFBQUFSR3AxYldSalltOXlBQkVBRUlBQUFLb0FPSnR4RTJNeWNHRXVhVzVuY21Wa2FXVnVkQzUy\nTXdBQUFBQVlZekp6YUluV2VOQzVNYmlRL0tROHdCUVpQQ1FBQUFCd1kySnZjcU5wWkdNNlptOXli\nV0YwYldsdFlXZGxMM04yWnl0NGJXeHFhVzV6ZEdGdVkyVkpSSGdzZUcxd09tbHBaRG80TXpVNE5E\nRTFZaTA0TUdFekxUUXdNbUl0WVRJd05pMDFaVGxqT1dFeU5URmtZelpzY21Wc1lYUnBiMjV6YUds\nd2FIQmhjbVZ1ZEU5bUFBQUI0bXAxYldJQUFBQkJhblZ0WkdOaWIzSUFFUUFRZ0FBQXFnQTRtM0VU\nWXpKd1lTNWhZM1JwYjI1ekxuWXlBQUFBQUJoak1uTm9MRHJvbUppSjh4NzcxVXd1d0ZNZ1hnQUFB\nWmxqWW05eW9tZGhZM1JwYjI1emdxSm1ZV04wYVc5dWEyTXljR0V1YjNCbGJtVmthbkJoY21GdFpY\nUmxjbk9oYTJsdVozSmxaR2xsYm5SemdhSmpkWEpzZUMxelpXeG1JMnAxYldKbVBXTXljR0V1WVhO\nelpYSjBhVzl1Y3k5ak1uQmhMbWx1WjNKbFpHbGxiblF1ZGpOa2FHRnphRmdnRC9ONWpWY0g2V1dK\naEVveTM2M0xySkRTQUZQWGdOR2F4cWtVNS9MMG1TdWtabUZqZEdsdmJuZ2RZMjl0TG1GdWRHaHli\nM0JwWXk1amJHRjFaR1V1Y0hKdmRtbGtaV1JxY0dGeVlXMWxkR1Z5YzZGNEgyTnZiUzVoYm5Sb2Nt\nOXdhV011YjNKcFoybHVMV052Ym1acFpHVnVZMlZuZFc1cmJtOTNibXRrWlhOamNtbHdkR2x2Ym5o\nbVEyeGhkV1JsSUhCeWIzWnBaR1ZrSUhSb2FYTWdabWxzWlNCaGRDQjBhR1VnY21WeGRXVnpkQ0J2\nWmlCaElIVnpaWElnWVc1a0lHMWhlU0JvWVhabElHTnlaV0YwWldRZ2IzSWdiVzlrYVdacFpXUWdk\nR2hsSUdacGJHVWdZMjl1ZEdWdWRITXViWE52Wm5SM1lYSmxRV2RsYm5TaFpHNWhiV1ZtUTJ4aGRX\nUmxjbUZzYkVGamRHbHZibk5KYm1Oc2RXUmxaUFVBQUFESWFuVnRZZ0FBQUVCcWRXMWtZMkp2Y2dB\nUkFCQ0FBQUNxQURpYmNSTmpNbkJoTG1oaGMyZ3VaR0YwWVFBQUFBQVlZekp6YUFBRjRneGw0ci9B\nR0tnUG53YTJURWdBQUFDQVkySnZjcVZqWVd4blpuTm9ZVEkxTm1Od1lXUk5BQUFBQUFBQUFBQUFB\nQUFBQUdSb1lYTm9XQ0FvVzlwTWlRUk9lc2dkQ2dNWmVmTm41U09BSGxFVlgrVXZYZFVaY0xwTjRt\nUnVZVzFsYm1wMWJXSm1JRzFoYm1sbVpYTjBhbVY0WTJ4MWMybHZibk9Cb21WemRHRnlkQmpoWm14\nbGJtZDBhQmtlQkFBQUFqNXFkVzFpQUFBQUoycDFiV1JqTW1Oc0FCRUFFSUFBQUtvQU9KdHhBMk15\nY0dFdVkyeGhhVzB1ZGpJQUFBQUNEMk5pYjNLbFkyRnNaMlp6YUdFeU5UWnBjMmxuYm1GMGRYSmxl\nRTF6Wld4bUkycDFiV0ptUFM5ak1uQmhMM1Z5Ympwak1uQmhPbVkzTVRJek5qVTJMVGRtT0RrdE5E\naGpNaTA0Wm1Sa0xUUTVaRFZsTURnMk56STJaUzlqTW5CaExuTnBaMjVoZEhWeVpXcHBibk4wWVc1\nalpVbEVlQ3g0YlhBNmFXbGtPamczTjJWalpEWmxMVGxqTWpVdE5ETTNPUzA1WldKbExUZGhabUZq\nTnpZeVlUaGtZWEpqY21WaGRHVmtYMkZ6YzJWeWRHbHZibk9Eb21OMWNteDRMWE5sYkdZamFuVnRZ\nbVk5WXpKd1lTNWhjM05sY25ScGIyNXpMMk15Y0dFdWFXNW5jbVZrYVdWdWRDNTJNMlJvWVhOb1dD\nQVA4M21OVndmcFpZbUVTakxmcmN1c2tOSUFVOWVBMFpyR3FSVG44dlNaSzZKamRYSnNlQ3B6Wld4\nbUkycDFiV0ptUFdNeWNHRXVZWE56WlhKMGFXOXVjeTlqTW5CaExtRmpkR2x2Ym5NdWRqSmthR0Z6\nYUZnZ004VDdaQmp5Z215SHRBRnpMWVRJSkJYWi9VMEk4cURrbXNCZjFHNmt4aUtpWTNWeWJIZ3Bj\nMlZzWmlOcWRXMWlaajFqTW5CaExtRnpjMlZ5ZEdsdmJuTXZZekp3WVM1b1lYTm9MbVJoZEdGa2FH\nRnphRmdnUHc3UEN5VFU5ZklrbzRnSS9HeXRFOFk3a2haaDRKMEIrSzdkQlhrRllYSjBZMnhoYVcx\nZloyVnVaWEpoZEc5eVgybHVabStqWkc1aGJXVnZRVzUwYUhKdmNHbGpJRVpwYkdWelozWmxjbk5w\nYjI1bE1TNHdMakJyYzNCbFkxWmxjbk5wYjI1bE1pNDBMakFBQUJBNGFuVnRZZ0FBQUNocWRXMWtZ\nekpqY3dBUkFCQ0FBQUNxQURpYmNRTmpNbkJoTG5OcFoyNWhkSFZ5WlFBQUFCQUlZMkp2Y3RLRVdR\nSVNvZ0VtR0NGWkFnb3dnZ0lHTUlJQmphQURBZ0VDQWhSQTVhQUs3c0k1MEw2NGcvb0dRZ1U5WjFV\nVEFEQUtCZ2dxaGtqT1BRUURBekJKTVJjd0ZRWURWUVFLRXc1QmJuUm9jbTl3YVdNc0lGQkNRekV1\nTUN3R0ExVUVBeE1sUVc1MGFISnZjR2xqSUVOdmJuUmxiblFnUTNKbFpHVnVkR2xoYkhNZ1VtOXZk\nQ0JEUVRBZUZ3MHlOakE0TURjeE9EUXpOVFphRncweU9EQTRNRFl4T1RRek5UWmFNRVF4RnpBVkJn\nTlZCQW9URGtGdWRHaHliM0JwWXl3Z1VFSkRNU2t3SndZRFZRUURFeUJCYm5Sb2NtOXdhV01nUTJ4\naGRXUmxJRU52Ym5SbGJuUWdVMmxuYm1sdVp6QlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VI\nQTBJQUJKaDZDbXZMVUJnRkZOVTB2VUtsT1Z0RTZkamQxN0w1U3V3WDBMZW1GaXNCTTNka2QvM2N5\nanhGQTNRbzVTNDZmWDAvaWhZMFZaN21mYjlLRjcwM3Q1T2pXREJXTUE0R0ExVWREd0VCL3dRRUF3\nSUhnREFWQmdOVkhTVUVEakFNQmdvckJnRUVBWVBvWGdJQk1Bd0dBMVVkRXdFQi93UUNNQUF3SHdZ\nRFZSMGpCQmd3Rm9BVXpsSGlCSUZPWkZzaitPUEV6NW8rbk1IWFhNSXdDZ1lJS29aSXpqMEVBd01E\nWndBd1pBSXdNWE1kRko0QmV0TExWWTdPUnVFOW5vcWJiQVpPWm4vYUFyWHlUd0ZBWmZLclB6eEYy\ndlBvSk5mMStVQ2RnMVhHQWpCd1gxemQ5V0dxWWtxbUw1U0ZxdzFReVNqcjF6SmZwSk05KzFyZER3\nU1BMTU9QT2pLdWlYam9VL3BVVWVHOVJ3bWhZM0JoWkZrTm5nQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB\nQUFBQUFBQUFBUFpZUUVuTzBNRm1RMkFWdklxMkQ1T05XWVI2RmtFMGZmNFMxTUZadGJyTmNFbktO\nUHV6RmpVbUJIL1hRcTlxUFNudW9WdjUwdDFoeW10NllITXkrN0hEQjBzPTwvYzJwYTptYW5pZmVz\ndD48L21ldGFkYXRhPgogIDxkZWZzPgogICAgPG1hcmtlciBpZD0iYXJyQnJvd24iIHZpZXdCb3g9\nIjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYiIG1hcmtlckhlaWdo\ndD0iNiIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPgogICAgICA8cGF0aCBkPSJNMCAwIEwx\nMCA1IEwwIDEwIHoiIGZpbGw9IiNhODdjNTAiPjwvcGF0aD4KICAgIDwvbWFya2VyPgogICAgPG1h\ncmtlciBpZD0iYXJyQmxhY2siIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIg\nbWFya2VyV2lkdGg9IjYiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVy\nc2UiPgogICAgICA8cGF0aCBkPSJNMCAwIEwxMCA1IEwwIDEwIHoiIGZpbGw9IiMxMTExMTEiPjwv\ncGF0aD4KICAgIDwvbWFya2VyPgogICAgPG1hcmtlciBpZD0iYXJyQmx1ZSIgdmlld0JveD0iMCAw\nIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNiIgbWFya2VySGVpZ2h0PSI2\nIiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+CiAgICAgIDxwYXRoIGQ9Ik0wIDAgTDEwIDUg\nTDAgMTAgeiIgZmlsbD0iIzJiMzk5MCI+PC9wYXRoPgogICAgPC9tYXJrZXI+CiAgPC9kZWZzPgoK\nICA8cmVjdCB3aWR0aD0iMTM4MCIgaGVpZ2h0PSI3MDAiIGZpbGw9IiNmZmZmZmYiPjwvcmVjdD4K\nCiAgPGcgc3Ryb2tlPSIjMmIzOTkwIiBzdHJva2Utd2lkdGg9IjExIiBzdHJva2UtbGluZWNhcD0i\nYnV0dCI+CiAgICA8bGluZSB4MT0iMzAwIiB5MT0iMzMwIiB4Mj0iMzgwIiB5Mj0iMzMwIj48L2xp\nbmU+CiAgICA8bGluZSB4MT0iNDgwIiB5MT0iMzMwIiB4Mj0iNzIwIiB5Mj0iMzMwIj48L2xpbmU+\nCiAgICA8bGluZSB4MT0iODIwIiB5MT0iMzMwIiB4Mj0iMTE4MCIgeTI9IjMzMCI+PC9saW5lPgog\nICAgPGxpbmUgeDE9IjEyODAiIHkxPSIzMzAiIHgyPSIxMzQwIiB5Mj0iMzMwIj48L2xpbmU+CiAg\nICA8bGluZSB4MT0iMzAwIiB5MT0iNTYwIiB4Mj0iMTM0MCIgeTI9IjU2MCI+PC9saW5lPgogIDwv\nZz4KCiAgPGcgc3Ryb2tlPSIjYTg3YzUwIiBzdHJva2Utd2lkdGg9IjQiIGZpbGw9Im5vbmUiPgog\nICAgPGxpbmUgeDE9IjM4MCIgeTE9IjE1MCIgeDI9IjM4MCIgeTI9IjM0MCI+PC9saW5lPgogICAg\nPGxpbmUgeDE9IjQ4MCIgeTE9IjE1MCIgeDI9IjQ4MCIgeTI9IjM0MCI+PC9saW5lPgogICAgPGxp\nbmUgeDE9IjcyMCIgeTE9IjE1MCIgeDI9IjcyMCIgeTI9IjM0MCI+PC9saW5lPgogICAgPGxpbmUg\neDE9IjgyMCIgeTE9IjE1MCIgeDI9IjgyMCIgeTI9IjM0MCI+PC9saW5lPgogICAgPGxpbmUgeDE9\nIjExODAiIHkxPSIxNTAiIHgyPSIxMTgwIiB5Mj0iMzQwIj48L2xpbmU+CiAgICA8bGluZSB4MT0i\nMTI4MCIgeTE9IjE1MCIgeDI9IjEyODAiIHkyPSIzNDAiPjwvbGluZT4KICAgIDxsaW5lIHgxPSI0\nMzAiIHkxPSIxNzAiIHgyPSI0MzAiIHkyPSIyOTIiIG1hcmtlci1lbmQ9InVybCgjYXJyQnJvd24p\nIj48L2xpbmU+CiAgICA8bGluZSB4MT0iNzcwIiB5MT0iMTcwIiB4Mj0iNzcwIiB5Mj0iMjkyIiBt\nYXJrZXItZW5kPSJ1cmwoI2FyckJyb3duKSI+PC9saW5lPgogICAgPGxpbmUgeDE9IjEyMzAiIHkx\nPSIxNzAiIHgyPSIxMjMwIiB5Mj0iMjkyIiBtYXJrZXItZW5kPSJ1cmwoI2FyckJyb3duKSI+PC9s\naW5lPgogIDwvZz4KCiAgPGcgZmlsbD0iI2E4N2M1MCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+CiAg\nICA8dGV4dCB4PSI0MzAiIHk9IjQ0IiBmb250LXNpemU9IjM0Ij5GYWN0b3J5IDE8L3RleHQ+CiAg\nICA8dGV4dCB4PSI3NzAiIHk9IjQ0IiBmb250LXNpemU9IjM0Ij5GYWN0b3J5IDI8L3RleHQ+CiAg\nICA8dGV4dCB4PSIxMjMwIiB5PSI0NCIgZm9udC1zaXplPSIzNCI+RmFjdG9yeSAzPC90ZXh0Pgog\nICAgPHRleHQgeD0iNDMwIiB5PSI4NiIgZm9udC1zaXplPSIyNiI+UeKCgSA9IDEwMCwwMDAgbcKz\nL2Q8L3RleHQ+CiAgICA8dGV4dCB4PSI3NzAiIHk9Ijg2IiBmb250LXNpemU9IjI2Ij5R4oKCID0g\nNjAsMDAwIG3Csy9kPC90ZXh0PgogICAgPHRleHQgeD0iMTIzMCIgeT0iODYiIGZvbnQtc2l6ZT0i\nMjYiPlHigoMgPSAyMDAsMDAwIG3Csy9kPC90ZXh0PgogICAgPHRleHQgeD0iNDMwIiB5PSIxMjAi\nIGZvbnQtc2l6ZT0iMjYiPkPigoEgPSAxMCBtZy9MPC90ZXh0PgogICAgPHRleHQgeD0iNzcwIiB5\nPSIxMjAiIGZvbnQtc2l6ZT0iMjYiPkPigoIgPSAyMCBtZy9MPC90ZXh0PgogICAgPHRleHQgeD0i\nMTIzMCIgeT0iMTIwIiBmb250LXNpemU9IjI2Ij5D4oKDID0gOCBtZy9MPC90ZXh0PgogIDwvZz4K\nCiAgPGcgc3Ryb2tlPSIjMTExMTExIiBzdHJva2Utd2lkdGg9IjMiPgogICAgPGxpbmUgeDE9IjQ4\nMCIgeTE9IjI1MCIgeDI9IjcyMCIgeTI9IjI1MCI+PC9saW5lPgogICAgPGxpbmUgeDE9IjQ4MCIg\neTE9IjIzOCIgeDI9IjQ4MCIgeTI9IjI2MiI+PC9saW5lPgogICAgPGxpbmUgeDE9IjcyMCIgeTE9\nIjIzOCIgeDI9IjcyMCIgeTI9IjI2MiI+PC9saW5lPgogICAgPGxpbmUgeDE9IjgyMCIgeTE9IjI1\nMCIgeDI9IjExODAiIHkyPSIyNTAiPjwvbGluZT4KICAgIDxsaW5lIHgxPSI4MjAiIHkxPSIyMzgi\nIHgyPSI4MjAiIHkyPSIyNjIiPjwvbGluZT4KICAgIDxsaW5lIHgxPSIxMTgwIiB5MT0iMjM4IiB4\nMj0iMTE4MCIgeTI9IjI2MiI+PC9saW5lPgogIDwvZz4KICA8ZyBmaWxsPSIjMTExMTExIiB0ZXh0\nLWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjI4Ij4KICAgIDx0ZXh0IHg9IjYwMCIgeT0iMjI0\nIj4xMCBrbTwvdGV4dD4KICAgIDx0ZXh0IHg9IjEwMDAiIHk9IjIyNCI+MTUga208L3RleHQ+CiAg\nPC9nPgoKICA8ZyBmaWxsPSIjMTExMTExIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4KICAgIDx0ZXh0\nIHg9IjE3NCIgeT0iNDAwIiBmb250LXNpemU9IjMwIj5SaXZlciBpbmZsb3c8L3RleHQ+CiAgICA8\ndGV4dCB4PSIxNzQiIHk9IjQzMiIgZm9udC1zaXplPSIyNiI+UeKCgCA9IDUwMCwwMDAgbcKzL2Q8\nL3RleHQ+CiAgICA8dGV4dCB4PSIxNzQiIHk9IjUxMiIgZm9udC1zaXplPSIyNiI+Q+KCgCA9IDAu\nMiBtZy9MPC90ZXh0PgogIDwvZz4KICA8bGluZSB4MT0iNjAiIHkxPSI0NzAiIHgyPSIyODgiIHky\nPSI0NzAiIHN0cm9rZT0iIzExMTExMSIgc3Ryb2tlLXdpZHRoPSI0IiBtYXJrZXItZW5kPSJ1cmwo\nI2FyckJsYWNrKSI+PC9saW5lPgoKICA8dGV4dCB4PSI0MzAiIHk9IjM3MiIgZm9udC1zaXplPSIy\nNiIgZmlsbD0iIzExMTExMSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+eCA9IDA8L3RleHQ+CgogIDx0\nZXh0IHg9IjkzNSIgeT0iNDE1IiBmb250LXNpemU9IjI0IiBmaWxsPSIjMTExMTExIiB0ZXh0LWFu\nY2hvcj0ibWlkZGxlIj5DUlVEIGRlY2F5cywgZmlyc3Qgb3JkZXIsIHJhdGUgazwvdGV4dD4KICA8\ndGV4dCB4PSI5MzUiIHk9IjQ3MiIgZm9udC1zaXplPSIyOCIgZmlsbD0iIzJiMzk5MCIgdGV4dC1h\nbmNob3I9Im1pZGRsZSI+diA9IDI1IGttL2Q8L3RleHQ+CiAgPGxpbmUgeDE9Ijc3NSIgeTE9IjUw\nNSIgeDI9IjEwOTUiIHkyPSI1MDUiIHN0cm9rZT0iIzJiMzk5MCIgc3Ryb2tlLXdpZHRoPSI0IiBt\nYXJrZXItZW5kPSJ1cmwoI2FyckJsdWUpIj48L2xpbmU+Cjwvc3ZnPg==\n"
        }
      },
      "id": "a82084e3-3f5e-447b-9307-2b2b9012003b"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "minimum(array_values) = 78"
          ]
        }
      ],
      "source": [
        "function minimum(array)\n",
        "    # initialize the minimum value counter\n",
        "    min_value = array[1]\n",
        "    # update minimum values\n",
        "    for i in 2:length(array)\n",
        "        if array[i] < min_value\n",
        "            min_value = array[i]\n",
        "        end\n",
        "    end\n",
        "    # return found minimum\n",
        "    return min_value\n",
        "end\n",
        "\n",
        "array_values = [89, 90, 95, 100, 100, 78, 99, 98, 100, 95]\n",
        "@show minimum(array_values);"
      ],
      "id": "8"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "#### Problem 3.2 (3)\n",
        "\n",
        "The line producing the `MethodError` is\n",
        "`outcomes[i] = (sum(passadieci()) > 11)`. The problem is actually with a\n",
        "prior line, `outcomes = zero(n_trials)`, which creates `outcomes`.\n",
        "\n",
        "[`zero()`](https://www.jlhub.com/julia/manual/en/function/zero) is the\n",
        "Julia function to get a zero element (the additive identity) based on\n",
        "the type of the input. For example:"
      ],
      "id": "60dafed4-6fb5-4472-8e9d-12fb10335790"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/plain": [
              "0"
            ]
          }
        }
      ],
      "source": [
        "zero(3)"
      ],
      "id": "10"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/plain": [
              "0.0"
            ]
          }
        }
      ],
      "source": [
        "zero(3.0)"
      ],
      "id": "12"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/plain": [
              "false"
            ]
          }
        }
      ],
      "source": [
        "zero(false)"
      ],
      "id": "14"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Since `zero()` returns a scalar element (as seen in the examples),\n",
        "trying to index its output with `outcomes[i]` results in the error, as\n",
        "Julia does not know how to index into a scalar (in this case, an `Int`).\n",
        "\n",
        "However, the goal of the relevant line in the script is to initialize a\n",
        "vector consisting of zeros with length `n_trials`. What we actually want\n",
        "is the function\n",
        "[`zeros()`](https://www.jlhub.com/julia/manual/en/function/zeros).\n",
        "Fixing this gets rid of the error (I’ve also fixed another error with\n",
        "the code, namely the threshold for a “win”, but this isn’t essential for\n",
        "this problem):"
      ],
      "id": "037f72bf-c274-47b6-92c7-62c1fa6af5a5"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "win_prob = 0.502"
          ]
        }
      ],
      "source": [
        "# function to simulate a passadieci roll: 3 6-sided dice\n",
        "function passadieci()\n",
        "    # this rand() call samples 3 values from the vector [1, 6]\n",
        "    roll = rand(1:6, 3) \n",
        "    return roll\n",
        "end\n",
        "# set number of trials and initialize outcome vector\n",
        "n_trials = 1_000\n",
        "outcomes = zeros(n_trials)\n",
        "# simulate number of passadieci rolls and count wins\n",
        "for i = 1:n_trials\n",
        "    outcomes[i] = (sum(passadieci()) >= 11)\n",
        "end\n",
        "win_prob = sum(outcomes) / n_trials # compute average number of wins\n",
        "@show win_prob;"
      ],
      "id": "16"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "#### Problem 2.3 (3)\n",
        "\n",
        "The line that causes the error is `return vect - m`. The problem is that\n",
        "Julia does not make assumptions about how to handle ambiguous operations\n",
        "like adding or subtracting a scalar (`m`) from a vector (`vect`): is\n",
        "this intended and should be done element-wise, or is it a sign that the\n",
        "wrong type was passed (*e.g.* the other input was intended to be a\n",
        "vector)? To make the intent of the coder explicit, Julia asks that you\n",
        "**broadcast** an operation that is intended to be applied to a scalar\n",
        "(such as addition or subtraction of another scalar) to be applied\n",
        "element-wise to a vector, instead of assuming that this is the intended\n",
        "behavior.\n",
        "\n",
        "To broadcast a function `f()` over a vector `v`, you use a period, as in\n",
        "`f.(v)`. In this case, we want to change the problematic line to\n",
        "`return vect .- m`:"
      ],
      "id": "52c17d9b-bb18-454a-abed-55646da766cf"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "mean(remove_mean(random_vect)) = -1.736388810513745e-16"
          ]
        }
      ],
      "source": [
        "# function to remove mean from a vector\n",
        "function remove_mean(vect)\n",
        "    # fucntion to compute the mean\n",
        "    function compute_mean(vect)\n",
        "        element_sum = 0 # initialize sum\n",
        "        # compute mean and return\n",
        "        for v in vect\n",
        "            element_sum += v\n",
        "        end\n",
        "        return element_sum / length(vect)\n",
        "    end\n",
        "\n",
        "    m = compute_mean(vect) # compute mean\n",
        "    # return demeaned vector\n",
        "    return vect .- m\n",
        "end\n",
        "\n",
        "random_vect = rand(1_000)\n",
        "@show mean(remove_mean(random_vect));"
      ],
      "id": "18"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "### Problem 4 (5)\n",
        "\n",
        "#### Problem 4.1 (2)\n",
        "\n",
        "While we could load the data into a generic array, the most mature data\n",
        "structure for tabular data is in Julia is a `DataFrame` (from\n",
        "`DataFrames.jl`, akin to Python’s `pandas` or R’s dataframes). To load\n",
        "the dataset, we will use `CSV.jl`’s `read()` function:"
      ],
      "id": "1157f565-4e2a-4ead-b589-91cea0dc5a8b"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [],
      "source": [
        "dat = CSV.read(\"data/fha.csv\", DataFrame)"
      ],
      "id": "20"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "To find the number of rows and columns of a DataFrame, we can use\n",
        "`nrow()` and `ncol()`."
      ],
      "id": "d13d16bb-6496-4187-a845-f8192122785a"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [],
      "source": [
        "@show nrow(dat);\n",
        "@show ncol(dat);"
      ],
      "id": "22"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "#### Problem 4.2 (3)\n",
        "\n",
        "Calculate the number of miles driven per person per day for every metro\n",
        "area. Make a scatterplot of this on the $y$-axis and the population of\n",
        "the city on the $x$-axis. Make sure to label your axes and include a\n",
        "caption clearly describing the plot. Highlight where the New York City\n",
        "and Houston metro areas are on the plot and make a legend clearly\n",
        "labelling any plot features.\n",
        "\n",
        "To see the column names of the data:"
      ],
      "id": "f82e37aa-8200-4314-9ebb-0941fa3d35ac"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [],
      "source": [
        "names(dat)"
      ],
      "id": "24"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "So to calculate the number of miles driven per person per day, we would\n",
        "want to divide `dat[:, \"daily_vmt (mi/day)\"]` by `dat[:, \"population\"]`.\n",
        "We could do this in a few different ways. Either way, we will The first\n",
        "is to use `map` over `eachrows(dat)`:"
      ],
      "id": "c2eef691-e20c-4cda-b36e-cacb9fc04a20"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [],
      "source": [
        "dat[:, \"mi_per_pop\"] = map(row -> row[\"daily_vmt (mi/day)\"] / row[\"population\"], eachrow(dat))"
      ],
      "id": "26"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Similarly, we can broadcast the function over `eachrow(dat)`:"
      ],
      "id": "17989f10-ca60-4087-8977-4091581c2c47"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [],
      "source": [
        "dat[:, \"mi_per_pop\"] = (row -> row[\"daily_vmt (mi/day)\"] / row[\"population\"]).(eachrow(dat))"
      ],
      "id": "28"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "To make the scatterplot, we can use `Plots.scatter()` (though you could\n",
        "install and use one of the other Julia plotting packages as well):"
      ],
      "id": "d9e4937b-4e15-4a3f-b800-c64620b172da"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [],
      "source": [
        "p = scatter(dat[:, \"population\"], dat[:, \"mi_per_pop\"], label=\"Metro Areas\")\n",
        "xlabel!(p, \"Population\")\n",
        "ylabel!(p, \"Miles Driven Per Person Per Day\")"
      ],
      "id": "30"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "We can add the NYC and Houston points by plotting them specifically with\n",
        "a different color and a specific legend option (we’ll also add the\n",
        "caption here). By inspecting the data, we can see that the NY metro area\n",
        "is the first row, while Houston is the 7th.\n",
        "\n",
        "``` julia\n",
        "scatter!(p, dat[[1], \"population\"], dat[[1], \"mi_per_pop\"], color=\"red\", label=\"New York\")\n",
        "scatter!(p, dat[[7],  \"population\"], dat[[7], \"mi_per_pop\"], color=\"orange\", label=\"Houston\")\n",
        "```\n",
        "\n",
        "Lines 1-2  \n",
        "A quirk of `Plots.jl` is that scatterplots have to be for entire\n",
        "vectors, not individual points, so an individual point needs to be\n",
        "wrapped as a 1-element vector.\n",
        "\n",
        "<pre>UndefVarError: `dat` not defined in `Main.Notebook`\n",
        "Suggestion: check for spelling errors or missing imports.\n",
        "Stacktrace:\n",
        " [1] top-level scope\n",
        "<span class=\"ansi-bright-black-fg\">   @</span> <span class=\"ansi-bright-black-fg\">~/Teaching/BEE4750/fall2026/solutions/hw01/</span><span style=\"text-decoration:underline\" class=\"ansi-bright-black-fg\">hw01.qmd:293</span></pre>\n",
        "\n",
        "Figure 1\n",
        "\n",
        "### Problem 5 (20)\n",
        "\n",
        "#### Problem 5.1"
      ],
      "id": "e28820f3-76fa-4040-a03a-fb3c42478d88"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [],
      "source": [
        "A = [0 1 1 1;\n",
        "    0 0 0 1;\n",
        "    0 0 0 1;\n",
        "    0 0 0 0]\n",
        "\n",
        "nodes = [\"Plant\", \"Land Treatment\", \"Chem Treatment\", \"Pristine Brook\"]\n",
        "# modify this dictionary to add labels\n",
        "edge_labels = Dict((1, 2) => L\"$X_1$\", (1,3) => L\"$X_2$\", (1, 4) => L\"$X_3$\",(2, 4) => L\"$0.2X_1$\",(3, 4) => L\"$0.005X_2^2$\")\n",
        "shapes=[:hexagon, :rect, :rect, :hexagon]\n",
        "xpos = [0, -1.5, -0.25, 1]\n",
        "ypos = [1, 0, 0, -1]\n",
        "\n",
        "p = graphplot(A, names=nodes, edgelabel=edge_labels, markersize=0.15, markershapes=shapes, markercolor=:white, x=xpos, y=ypos)\n",
        "display(p)"
      ],
      "id": "cell-fig-wastewater"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "#### Problem 5.2 (4)\n",
        "\n",
        "These equations will be derived in terms of $X_1$ (the land disposal\n",
        "amount, in kg/day) and $X_2$ (the chemically treated amount, in kg/day),\n",
        "where $X_1 + X_2 \\leq 100\\ \\mathrm{kg/day}$. Note that we don’t need to\n",
        "explicitly represent the amount of directly disposed YUK, as this is\n",
        "$X_3 = 100 - X_1 - X_2$ and so is not a free variable.\n",
        "\n",
        "The amount of YUK which will be discharged is\n",
        "\n",
        "$$\\begin{aligned}\n",
        "D(X_1, X_2) &= 100 - X_1 - X_2 + 0.2 X_1 + 0.005X_2^2 \\\\\n",
        "&= 100 - 0.8 X_1 + (0.005X_2 - 1)X_2 \\\\\n",
        "&= 100 - 0.8 X_1 + 0.005 X_2^2 - X_2\n",
        "\\end{aligned}$$\n",
        "\n",
        "The cost is\n",
        "$$C(X_1, X_2) = X_1^2/20 + 1.5 X_2.$$\n",
        "\n",
        "#### Problem 5.3 (3)\n",
        "\n",
        "Implement your systems model as a Julia function which computes the\n",
        "resulting YUK discharge and cost for a particular treatment plan.\n",
        "\n",
        "***Solution***:\n",
        "\n",
        "A Julia function for this model could look like:"
      ],
      "id": "337ed8f8-0054-4f5d-94f5-5da73c70336e"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/plain": [
              "yuk_discharge (generic function with 1 method)"
            ]
          }
        }
      ],
      "source": [
        "# we will assume that X₁, X₂ are vectors so we can vectorize\n",
        "# the function; hence the use of broadcasting. This makes unpacking\n",
        "# the different outputs easier as each will be returned as a vector.\n",
        "# Note that even though this is vectorized, passing scalar inputs\n",
        "# will still work fine.\n",
        "function yuk_discharge(X₁, X₂)\n",
        "    # Make sure X₁ + X₂ <= 100! Throw an error if not.\n",
        "    if any(X₁ .+ X₂ .> 100)\n",
        "        error(\"X₁ + X₂ must be less than 200\")\n",
        "    end\n",
        "    yuk = 100 .- 0.8X₁ .+ (0.005X₂ .- 1) .* X₂\n",
        "    cost = X₁.^2/20 .+ 1.5X₂\n",
        "    return (yuk, cost)\n",
        "end"
      ],
      "id": "36"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "I will use a $\\text{Dirichlet}(3, 1)$ distribution to draw 1,000 3-d\n",
        "vectors adding up to 1 for testing, but you could also loop over a grid\n",
        "of values for $X_1$ and $X_2$ (since $X_3$ is determined by those two)\n",
        "and evaluate."
      ],
      "id": "0582d66e-bbe0-4b5c-ba83-db932f88de42"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/plain": [
              "([82.64022699576161, 31.681515467607312, 53.97979142744385, 38.09941279111079, 34.75224900866194, 85.84911471487678, 38.019552492009, 43.28367061001507, 74.88978068034905, 55.6278579476064  …  23.992732714301304, 51.23508924178167, 73.27511020738929, 25.34609784891812, 41.40711743286863, 46.514686003206315, 77.62677443874955, 58.15508592022454, 77.94343946832551, 41.447902332877], [19.33668253359526, 158.22965370685597, 142.48667238668858, 131.24095400324697, 288.1570103910447, 15.058362100355158, 134.2522596125352, 107.28139653342407, 34.123598879715544, 94.80414114093286  …  187.92350896851224, 97.64800307824338, 37.493226660033066, 408.0457037167852, 118.35498313303957, 128.4873779266283, 28.427265852989926, 77.72954336302251, 28.286350124521398, 135.6347203586801])"
            ]
          }
        }
      ],
      "source": [
        "yuk_samples = 100 * rand(Dirichlet(3, 1), 1_000)\n",
        "D, C = yuk_discharge(yuk_samples[1, :], yuk_samples[2, :])"
      ],
      "id": "38"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Now let’s plot the results, using `scatter()`."
      ],
      "id": "4192dc84-38c9-426c-99a3-c4eab4f97f97"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [],
      "source": [
        "p = scatter(D, C, markersize=2, label=\"Treatment Samples\")\n",
        "# Label axes\n",
        "xaxis!(p, \"YUK Discharge (kg/day)\")\n",
        "# For the y-axis label, we need to \"escape\" the $ by adding a slash\n",
        "# otherwise it interprets that as starting math mode\n",
        "yaxis!(p, \"Treatment Cost (\\$/day)\")"
      ],
      "id": "cell-fig-yuk-solution"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "#### Problem 5.4 (3)"
      ],
      "id": "61b96316-cb89-4b1e-bcc6-af6c305e14c0"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [],
      "source": [
        "vline!(p, [20], color=:red, label=\"Regulatory Limit\")"
      ],
      "id": "cell-fig-yuk-solution-2"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "We can see that there are a few treatment strategies which comply with\n",
        "the limit, namely:"
      ],
      "id": "8a14bf39-3424-4c7f-a65f-36fb4ef18441"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/plain": [
              "14"
            ]
          }
        }
      ],
      "source": [
        "is_compliant = D .< 20\n",
        "sum(is_compliant)"
      ],
      "id": "44"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "However, they are fairly expensive. The minimum cost of these strategies\n",
        "is"
      ],
      "id": "55218e4f-23a2-4c92-9f0f-2417c3724b45"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/plain": [
              "248.20228150293696"
            ]
          }
        }
      ],
      "source": [
        "minimum(C[is_compliant])"
      ],
      "id": "46"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "#### Problem 5.5 (4)\n",
        "\n",
        "While there is a tradeoff between cost and the discharge, there are some\n",
        "strategies which cost the same as compliant strategies and don’t achieve\n",
        "compliance with the standard. As a result, while you need to spend a\n",
        "certain amount of money, that doesn’t guarantee compliance — how that\n",
        "money is allocated across the strategies matters as well.\n",
        "\n",
        "#### Problem 5.6 (4)\n",
        "\n",
        "To minimize these functions, we want to look at either the critical\n",
        "points (where the partial derivatives are zero) or at the constraints.\n",
        "For cost, $dC/dX_2 = 1.5$ is never zero, so there are no critical\n",
        "points. However, the lowest-cost point occurs at the boundary $X_2 = 0$\n",
        "and $X_1 = 0$, where there is no cost (unsurprisingly, doing nothing\n",
        "often costs the least). But this does not comply with the constraint, as\n",
        "the YUK discharge is 100 kg/day.\n",
        "\n",
        "The YUK discharge function $D$ has the following partial derivatives:\n",
        "\n",
        "$$\\begin{aligned}\n",
        "\\frac{\\partial D}{\\partial X_1} &= -0.8 \\\\\n",
        "\\frac{\\partial D}{\\partial X_2} &= 0.01 X_2 - 1,\n",
        "\\end{aligned}$$\n",
        "\n",
        "so we need to check the values along the boundaries $X_1 = 100 - X_2$,\n",
        "$X_1 = 0$, and $X_2 = 0$. $$D(100 - X_2, X_2) = 20X_2 - 0.005 X_2^2,$$\n",
        "which has a partial derivative\n",
        "$$\\frac{\\partial D}{\\partial X_2}(100 - X_2, X_2) = -0.2 + 0.01 X_2.$$\n",
        "This has a minimum at $X_2 = 20$ and therefore $X_1 = 80$, with a\n",
        "corresponding YUK discharge of 18 kg/day. If $X_2 = 0$, the minimum\n",
        "value (at $X_1 = 100$) is a discharge of 20 kg/day, while the minimum\n",
        "value along $X_1 = 0$ is 50 kg/day ($X_2 = 100$). Thus, the minimum\n",
        "occurs at $X_1 = 80$ and $X_2 = 20$, with a corresponding cost of\n",
        "\\$350/day.\n",
        "\n",
        "Adding these points to the plot:"
      ],
      "id": "61175466-294e-4ca5-a774-d93870d5cb84"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [],
      "source": [
        "# least cost solution\n",
        "least_cost = yuk_discharge(0, 0)\n",
        "scatter!(p, least_cost, color=:orange, label=\"Least Cost Solution\")\n",
        "# least discharge solution\n",
        "least_discharge = yuk_discharge(80, 20)\n",
        "scatter!(p, least_discharge, color=:purple, label=\"Least Discharge Solution\")"
      ],
      "id": "cell-fig-yuk-solutions-3"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "The least-cost solution, unsurprisingly, would be pretty bad given how\n",
        "much the YUK discharge violates the regulatory constraint. However, the\n",
        "least-discharge solution looks pretty good: there are more expensive\n",
        "treatment plans which comply with the regulatory constraint, but not\n",
        "many that are less expensive.\n",
        "\n",
        "## References\n",
        "\n",
        "List any external references consulted, including classmates."
      ],
      "id": "08ecb049-80cd-477b-a25b-a162527e7ceb"
    }
  ],
  "nbformat": 4,
  "nbformat_minor": 5,
  "metadata": {
    "kernel_info": {
      "name": "julia"
    },
    "kernelspec": {
      "name": "julia",
      "display_name": "Julia",
      "language": "julia"
    },
    "language_info": {
      "name": "julia",
      "codemirror_mode": "julia",
      "version": "1.11.5"
    }
  }
}