{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Solve optimization problems in Jupyter Notebooks\n", "\n", "For this course, our Jupyter Notebooks follow the same structure for all problems by defining the following sections:\n", " - Import libraries\n", " - Define variables\n", " - Define objective function\n", " - Define constrain function(s) if needed\n", " - Solve the problem\n", " - Postprocess results if needed\n", "\n", "```{figure} ./figures/jupyter_notebook_general_layout.png\n", ":name: jupyter_notebook_general layout\n", ":width: 600px\n", "General layout Jupyter Notebooks in this course\n", "```\n", "\n", "The structure is shown for an example which will be treated in-depth later." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " ## Import libraries\n", " Python cannot do optimization on its own, therefore we make use of separate packages which are installed with Anaconda:\n", " - `scipy` used for optimization\n", " - `numpy` used for matrix algebra\n", " - `matplotlib` used for plotting\n", "\n", "Libraries are imported with `import ... as ...` which directly abbreviates the packages for later use." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "tags": [ "disable-execution-page" ] }, "outputs": [], "source": [ "import scipy as sp\n", "import numpy as np\n", "import matplotlib.pylab as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ ":::{card} Test Yourself\n", "\n", ":::" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Define variables\n", "In this part of the notebook we can store all our variables in the form of integers, floats and arrays." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "tags": [] }, "outputs": [], "source": [ "n0 = 20" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ ":::{card} Test Yourself\n", "\n", ":::" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Define objective function\n", "In this part we define our constraint function as a `callable` with `def ...: ... return ...`\n", "These functions can contain multiple lines of calculation but should return one values which is minimized." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "tags": [ "disable-execution-cell" ] }, "outputs": [], "source": [ "def negprofit(n):\n", " price = 150 - 0.01 * n**2\n", " revenues = price * n\n", " totalcost = 75 * n\n", " profit = revenues - totalcost\n", " return -profit" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ ":::{card} Test Yourself\n", "\n", ":::" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Define constraint function\n", "Similar to the objective function, the constrain function(s) can be defined, which may return multiple values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solve the problem\n", "Making using of the `scipy`-library, the problem is solved. Using `print`, the result is shown" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " message: Optimization terminated successfully.\n", " success: True\n", " status: 0\n", " fun: -2499.9999999998727\n", " x: [ 5.000e+01]\n", " nit: 8\n", " jac: [ 0.000e+00]\n", " hess_inv: [[ 3.503e-01]]\n", " nfev: 22\n", " njev: 11\n" ] } ], "source": [ "result = sp.optimize.minimize(negprofit,n0)\n", "print(result)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Postprocess results\n", "If needed, we can postprocess the result or analyse the problem in another way" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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y5sH344FioiIiCxm69l06A0CYXVsf/HMv2OBIiIiIovZcqr88t3AlvZz+Q5ggSIiIiILycgtwuEE+7t8B7BAERERkYVsPZMOgwBaBdVCkKez1HHMigWKiIiILKLi8t0gO1n76e9YoIiIiMjs0rVFOJqYBcB+Vh//OxYoIiIiMrvfY9MgBBBezwMBtZykjmN2LFBERERkdhV739nbzeMVWKCIiIjIrK5lF+BEUg5kMvvZ++52LFBERERkVptv3TzeIcQTvu6OEqexDBYoIiIiMqtfY1IAAINb1ZE4ieWwQBEREZHZXLyei/j0XCjlMvQP85M6jsWwQBEREZHZbDpVfvN4t0a14eGikjiN5bBAERERkVkIIYwFanBr+9r77nYsUERERGQWp69pkXizAI4OcvRu6it1HItigSIiIiKzqJh96t3UFy5qpcRpLIsFioiIiB6a3iCwueLyXSv7vnwHsEARERGRGRxOuImM3GK4OyrRrXFtqeNYHAsUERERPbSK2af+Yf5QKxUSp7E8FigiIiJ6KCVlBvwemw7A/p++q8ACRURERA9l38Ub0BaWorabGh1DvaSOUy1YoIiIiOih/BpTfvluQAt/KOQyidNUDxYoIiIiemB5xWXYFld++e5fbex377vbsUARERHRA/vjTDqKSg0I9XZBy0CN1HGqDQsUERERPbBfYlIAAEPa1IFMVjMu3wEsUERERPSAruuKcOBSJgBgSOuac/kOYIEiIiKiB7T5VCoMAgiv54G6Xs5Sx6lWLFBERET0QDae/OvyXU3DAkVEREQmu3A9F2dTdVDKZRjYwl/qONWOBYqIiIhM9sut2afujX3g4aKSOE31Y4EiIiIikxgMwrh4Zk1a++nvWKCIiIjIJEevZiElpxBuaiV6NfWROo4kWKCIiIjIJL/cmn3q38IPjg4KidNIgwWKiIiIqqy4TI/fTpcXqJr49F0FmypQf/75JwYNGoSAgADIZDL88ssvld4XQmDu3LkICAiAk5MTunfvjrNnz1YaU1xcjJdeegne3t5wcXHB4MGDce3atUpjsrOzMWrUKGg0Gmg0GowaNQo5OTkW/u2IiIis385zGdAVlcHP3REdQrykjiMZmypQ+fn5aNWqFT7//PO7vv/ee+/ho48+wueff46jR4/Cz88PjzzyCHJzc41jpk2bho0bN2LNmjXYv38/8vLy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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# checking the results with exhaustive search\n", "\n", "n_range = np.linspace(0,100,100)\n", "negprofit_result = negprofit(n_range)\n", "plt.plot(n_range,negprofit_result)\n", "plt.plot(result.x,result.fun,'o')\n", "plt.xlabel('n')\n", "plt.ylabel('Negative profit');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ ":::{card} Test Yourself\n", "\n", ":::" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Questions, discussions and comments\n", "" ] } ], "metadata": { "kernelspec": { "display_name": "base", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.17" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }