Files
2025-10-21 11:20:44 +08:00

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
}