Files
jupyter-collection/scientific-computing-2/auto_examples_jupyter_3/plot_optimize_example2.ipynb

192 lines
32 KiB
Plaintext
Raw Normal View History

2025-10-21 11:20:44 +08:00
{
"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
}