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

91 lines
20 KiB
Plaintext
Raw Normal View History

2025-10-21 11:20:44 +08:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"# Integrating a simple ODE\n",
"\n",
"Solve the ODE dy/dt = -2y between t = 0..4, with the initial condition\n",
"y(t=0) = 1.\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 400x300 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"import scipy as sp\n",
"import matplotlib.pyplot as plt\n",
"\n",
"\n",
"def f(t, y):\n",
" return -2 * y\n",
"\n",
"\n",
"t_span = (0, 4) # time interval\n",
"t_eval = np.linspace(*t_span) # times at which to evaluate `y`\n",
"y0 = [\n",
" 1,\n",
"] # initial state\n",
"res = sp.integrate.solve_ivp(f, t_span=t_span, y0=y0, t_eval=t_eval)\n",
"\n",
"plt.figure(figsize=(4, 3))\n",
"plt.plot(res.t, res.y[0])\n",
"plt.xlabel(\"t\")\n",
"plt.ylabel(\"y\")\n",
"plt.title(\"Solution of Initial Value Problem\")\n",
"plt.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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
}