Files
FYS-STK4155/doc/src/Splines/autodiff/example_plot.ipynb
T
2018-09-27 05:42:32 +02:00

145 lines
26 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Visually comparing the derivative of a function with one variable and its analytic derivative"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/latex": [
"It might be useful to plot the found derivative os a functions. \n",
"This example assumes that \n",
"\n",
"\\[\n",
"f(x) = \\sin\\left(2\\pi x + x^2\\right)\n",
"\\]\n",
"\n",
"which has the following derivative:\n",
"\n",
"\\[\n",
"f'(x) = \\cos\\left(2\\pi x + x^2\\right)\\left(2\\pi + 2x\\right) \n",
"\\]"
],
"text/plain": [
"<IPython.core.display.Latex object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"It might be useful to plot the found derivative os a functions. \n",
"This example assumes that \n",
"\n",
"\\[\n",
"f(x) = \\sin\\left(2\\pi x + x^2\\right)\n",
"\\]\n",
"\n",
"which has the following derivative:\n",
"\n",
"\\[\n",
"f'(x) = \\cos\\left(2\\pi x + x^2\\right)\\left(2\\pi + 2x\\right) \n",
"\\]"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"The max absolute difference is: 1.77636e-15\n"
]
}
],
"source": [
"import autograd.numpy as np\n",
"\n",
"# To do elementwise differentiation:\n",
"from autograd import elementwise_grad as egrad \n",
"\n",
"# To plot:\n",
"import matplotlib.pyplot as plt \n",
"\n",
"\n",
"def f(x):\n",
" return np.sin(2*np.pi*x + x**2)\n",
"\n",
"def f_grad_analytic(x):\n",
" return np.cos(2*np.pi*x + x**2)*(2*np.pi + 2*x)\n",
"\n",
"# Do the comparison:\n",
"x = np.linspace(0,1,1000)\n",
"\n",
"f_grad = egrad(f)\n",
"\n",
"computed = f_grad(x)\n",
"analytic = f_grad_analytic(x)\n",
"\n",
"plt.title('Derivative computed from Autograd compared with the analytical derivative')\n",
"plt.plot(x,computed,label='autograd')\n",
"plt.plot(x,analytic,label='analytic')\n",
"\n",
"plt.xlabel('x')\n",
"plt.ylabel('y')\n",
"plt.legend()\n",
"\n",
"plt.show()\n",
"\n",
"print(\"The max absolute difference is: %g\"%(np.max(np.abs(computed - analytic))))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.7.0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}