Skip to content

Instantly share code, notes, and snippets.

@jpivarski
Created August 6, 2024 16:17
Show Gist options
  • Save jpivarski/8dc48a87bae7a856848f87e36b9d244d to your computer and use it in GitHub Desktop.
Save jpivarski/8dc48a87bae7a856848f87e36b9d244d to your computer and use it in GitHub Desktop.
Autodiff with nothing but NumPy
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "4f53096c-9d6d-40ef-885d-c452d35f3e0f",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "1be4e9c7-092a-4df8-8d33-ff56e4bf5538",
"metadata": {},
"outputs": [],
"source": [
"def autodiff(fun, h=1e-8):\n",
" def wrapped(x):\n",
" return np.imag(fun(x + 1j*h) / h)\n",
" return wrapped"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "b385ccbf-a4eb-4ee1-92d0-f8a4212e04af",
"metadata": {},
"outputs": [],
"source": [
"@autodiff\n",
"def f(x):\n",
" return np.sin(x) / x"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "c648628d-5a0f-4ca9-ad94-8452cc500407",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"x = np.linspace(-20, 20, 1000)\n",
"y1 = f(x)\n",
"y2 = (x*np.cos(x) - np.sin(x)) / x**2\n",
"\n",
"plt.plot(x, y1)\n",
"plt.plot(x, y2, ls=\"--\")\n",
"\n",
"None"
]
}
],
"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.11.9"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment