192 lines
32 KiB
Plaintext
192 lines
32 KiB
Plaintext
|
|
{
|
||
|
|
"cells": [
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"\n",
|
||
|
|
"# Minima and roots of a function\n",
|
||
|
|
"\n",
|
||
|
|
"Demos finding minima and roots of a function.\n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"## Define the function\n",
|
||
|
|
"\n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 1,
|
||
|
|
"metadata": {
|
||
|
|
"collapsed": false,
|
||
|
|
"jupyter": {
|
||
|
|
"outputs_hidden": false
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"import numpy as np\n",
|
||
|
|
"\n",
|
||
|
|
"x = np.arange(-10, 10, 0.1)\n",
|
||
|
|
"\n",
|
||
|
|
"\n",
|
||
|
|
"def f(x):\n",
|
||
|
|
" return x**2 + 10 * np.sin(x)"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"## Find minima\n",
|
||
|
|
"\n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 2,
|
||
|
|
"metadata": {
|
||
|
|
"collapsed": false,
|
||
|
|
"jupyter": {
|
||
|
|
"outputs_hidden": false
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"Global minima found [-1.30641113]\n",
|
||
|
|
"Local minimum found 3.8374671194983834\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"import scipy as sp\n",
|
||
|
|
"\n",
|
||
|
|
"# Global optimization\n",
|
||
|
|
"grid = (-10, 10, 0.1)\n",
|
||
|
|
"xmin_global = sp.optimize.brute(f, (grid,))\n",
|
||
|
|
"print(f\"Global minima found {xmin_global}\")\n",
|
||
|
|
"\n",
|
||
|
|
"# Constrain optimization\n",
|
||
|
|
"xmin_local = sp.optimize.fminbound(f, 0, 10)\n",
|
||
|
|
"print(f\"Local minimum found {xmin_local}\")"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"## Root finding\n",
|
||
|
|
"\n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 3,
|
||
|
|
"metadata": {
|
||
|
|
"collapsed": false,
|
||
|
|
"jupyter": {
|
||
|
|
"outputs_hidden": false
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"name": "stdout",
|
||
|
|
"output_type": "stream",
|
||
|
|
"text": [
|
||
|
|
"First root found [0.]\n",
|
||
|
|
"Second root found [-2.47948183]\n"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"root = sp.optimize.root(f, 1) # our initial guess is 1\n",
|
||
|
|
"print(f\"First root found {root.x}\")\n",
|
||
|
|
"root2 = sp.optimize.root(f, -2.5)\n",
|
||
|
|
"print(f\"Second root found {root2.x}\")"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "markdown",
|
||
|
|
"metadata": {},
|
||
|
|
"source": [
|
||
|
|
"## Plot function, minima, and roots\n",
|
||
|
|
"\n"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": 4,
|
||
|
|
"metadata": {
|
||
|
|
"collapsed": false,
|
||
|
|
"jupyter": {
|
||
|
|
"outputs_hidden": false
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"outputs": [
|
||
|
|
{
|
||
|
|
"data": {
|
||
|
|
"image/png": "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
|
||
|
|
"text/plain": [
|
||
|
|
"<Figure size 600x400 with 1 Axes>"
|
||
|
|
]
|
||
|
|
},
|
||
|
|
"metadata": {},
|
||
|
|
"output_type": "display_data"
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"source": [
|
||
|
|
"import matplotlib.pyplot as plt\n",
|
||
|
|
"\n",
|
||
|
|
"fig = plt.figure(figsize=(6, 4))\n",
|
||
|
|
"ax = fig.add_subplot(111)\n",
|
||
|
|
"\n",
|
||
|
|
"# Plot the function\n",
|
||
|
|
"ax.plot(x, f(x), \"b-\", label=\"f(x)\")\n",
|
||
|
|
"\n",
|
||
|
|
"# Plot the minima\n",
|
||
|
|
"xmins = np.array([xmin_global[0], xmin_local])\n",
|
||
|
|
"ax.plot(xmins, f(xmins), \"go\", label=\"Minima\")\n",
|
||
|
|
"\n",
|
||
|
|
"# Plot the roots\n",
|
||
|
|
"roots = np.array([root.x, root2.x])\n",
|
||
|
|
"ax.plot(roots, f(roots), \"kv\", label=\"Roots\")\n",
|
||
|
|
"\n",
|
||
|
|
"# Decorate the figure\n",
|
||
|
|
"ax.legend(loc=\"best\")\n",
|
||
|
|
"ax.set_xlabel(\"x\")\n",
|
||
|
|
"ax.set_ylabel(\"f(x)\")\n",
|
||
|
|
"ax.axhline(0, color=\"gray\")\n",
|
||
|
|
"plt.show()"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"metadata": {
|
||
|
|
"kernelspec": {
|
||
|
|
"display_name": "Python 3 (ipykernel)",
|
||
|
|
"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.12.11"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"nbformat": 4,
|
||
|
|
"nbformat_minor": 4
|
||
|
|
}
|