{ "cells": [ { "cell_type": "markdown", "id": "6d46a72f", "metadata": {}, "source": [ "# Monte Carlo Integration" ] }, { "cell_type": "code", "execution_count": 1, "id": "b53886bb", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import scipy.integrate\n", "\n", "seed = 239\n", "rng = np.random.default_rng(seed)" ] }, { "cell_type": "code", "execution_count": 2, "id": "5582478b", "metadata": {}, "outputs": [], "source": [ "def integrate_MC(f, N, sampling = 'uniform'):\n", "\n", " if sampling == 'gaussian':\n", " p = lambda x: np.exp(-x**2/2)/(np.sqrt(2*np.pi))\n", " x = rng.normal(size = N) # Generate x values between +-xmax\n", " else:\n", " xmax = 3\n", " p = lambda x: np.ones_like(x) / (2*xmax)\n", " x = xmax*(-1 + 2*rng.uniform(size = N))\n", " \n", " return np.sum(f(x)/p(x)) / N" ] }, { "cell_type": "code", "execution_count": 3, "id": "5c39e032", "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Integral from scipy.quad = 1.78596 with error 5.49113e-09\n", "Uniform: I = 1.78656 +- 0.0220357; frac err = 0.0123341\n", "Gaussian: I = 1.78585 +- 0.00960208; frac err = 0.00537675\n" ] }, { "data": { "image/png": "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9vrWt76VOmfNmjUqKSnR+vXrtWrVKsViMZ1//vmqqqrK1DDSlolxf2rTpk169NFH1a9fP6fLdkQmxr5//34NGzZMoVBIf/rTn/Tuu+/qV7/6ldq1a5epYaQtE+O+9957NWfOHD388MN67733dO+99+q+++7Tb37zm0wN47ikO/bXXntNV155pSZNmqR33nlHixcv1saNGzV58uTUOa+//rouv/xyTZo0SW+99ZZGjx6t0aNH6+23387UMNKWiXG//PLLuvzyy/XSSy9p3bp1Kiws1Pnnn69du3ZlahjHJRNj/9SHH36oH/7whzrrrLOcLrvRMjHuuro6nXfeefrwww+1ZMkSbdu2TXPnzlXXrl3TKy4jn1DkUZLM0qVL0/qZpUuXGp/PZz788MOjnrN3714jyaxZs6aRFWaGk+M+ePCg+fKXv2xWrVplhg8fbm688UbnCs0Ap8Y+bdo089WvftXh6jLHqXGPGjXKXHPNNQ3OGzNmjLniiiucKDMjjmXs999/v+nZs2eDYw899JDp2rVr6utvf/vbZtSoUQ3OGTJkiPnud7/rWK1OcmrcnxWPx02bNm3ME0884USZGeHk2OPxuBk6dKj57//+bzNx4kRzySWXOFytc5wa95w5c0zPnj1NXV1do+phhsVljz32mIqLi3XCCScc9ZwDBw5Iktq3b99UZWXc0cZdUlKiUaNGqbi42KXKMu9IY3/uuec0aNAgfetb31JBQYEGDBiguXPnulil84407qFDh2r16tXavn27JOkvf/mLXn31VV1wwQVulemIoqIilZWVacWKFTLGqLy8XEuWLNGFF16YOmfdunWH/TsfOXKk1q1b19TlOuZYxv1Z1dXVisVizf757VjHfuedd6qgoECTJk1yqVJnHcu4n3vuORUVFamkpEQdO3ZU3759NWPGDCUSifTurFFxBw0ozVedu3btMoFAwCxatOio5yQSCTNq1CgzbNgwByrMDKfG/fvf/9707dvX1NTUGGNMi5xhOdrYw+GwCYfDZvr06ebNN980jz76qMnOzjaPP/64wxU7w6lxJxIJM23aNOPz+UwwGDQ+n8/MmDHD4Wqddaxjf/rpp03r1q1NMBg0ksxFF13U4BVmKBQyCxYsaPAzpaWlpqCgwOmSHeHUuD/ruuuuMz179kw97m3k1NhfeeUV07VrV/Pxxx8bY0yLmGEx5ovHfdJJJ5lwOGyuueYa88Ybb5iFCxea9u3bm5/97Gdp1cMMi4ueeOIJ5eXlfe6iq5KSEr399ttauHBh0xWWYUcad1lZmW688UbNnz9f2dnZ7hWXYUf7nSeTSZ1++umaMWOGBgwYoGuvvVaTJ0/WI4884k6hDjvauJ9++mnNnz9fCxYs0JtvvqknnnhCv/zlL/XEE0+4U6hD3n33Xd144426/fbbtXnzZq1cuVIffvihvve977ldWkalO+577rlHCxcu1NKlS5v94/6Lxn7w4EFNmDBBc+fOVYcOHVyu1jnH8jtPJpMqKCjQb3/7Ww0cOFDjxo3Trbfemv7zW7qJC0enNF51JpNJ06tXLzNlypSjnlNSUmK6detm3n//fYcqzAwnxr106VIjyQQCgdRNkvH5fCYQCJh4PJ6ByhvPqd959+7dzaRJkxocmz17tunSpYsTZTrOqXF369bNPPzwww2O3XXXXeakk05yosyMOJaxjx8/3lx66aUNjr3yyitGktm9e7cxxpjCwkLz4IMPNjjn9ttvN/369XOyXMc4Ne5P3X///SY3N9ds2rTJ6VId58TY33rrrcOe43w+X+o5bseOHRkcwfFx6nd+9tlnmxEjRjQ4Z8WKFUaSiUajx1wPMywuWbNmjXbs2HHE65jGGF1//fVaunSp/vznP6tHjx4uVJgZRxv3iBEjtHXrVm3ZsiV1GzRokK644gpt2bJFgUDApYqd83m/82HDhh321vXt27d/7tqm5uLzxl1dXS2/v+HTUCAQUDKZbKryMuJo45KUest2UVGRVq9e3eCcVatWqaioqGmKzIBjGbck3Xfffbrrrru0cuVKDRo0qElrzJQvGnufPn0Oe467+OKLdc4552jLli0qLCx0o+xGO5bf+bBhw7Rjx44Gj+vt27erc+fOysrKOvY7O+ZogyM6ePCgeeutt1Lp+YEHHjBvvfWW+cc//mGMMebHP/6xmTBhwmE/N378eDNkyJAj9nndddeZ3Nxc8/LLL5uPPvoodauurs7oWNKRiXF/lq1rWDIx9o0bN5pgMGjuvvtu87e//c3Mnz/f5OTkmKeeeiqjY0lHJsY9ceJE07VrV7Ns2TLzwQcfmGeeecZ06NDB3HLLLRkdS7rSHfu8efNMMBg0s2fPNn//+9/Nq6++agYNGmQGDx6cOue1114zwWDQ/PKXvzTvvfeeueOOO0woFDJbt25t8vEdTSbGfc8995isrCyzZMmSBs9vBw8ebPLxfZ5MjP2zbFzDkolx79y507Rp08Zcf/31Ztu2bWbZsmWmoKDA/OIXv0irNgJLI7300ktG0mG3iRMnGmPq/0EOHz68wc9UVFSYSCRifvvb3x6xzyP1J8nMmzcvs4NJQybG/Vm2BpZMjf355583ffv2NeFw2PTp0+eY/z81lUyMu7Ky0tx4442me/fuJjs72/Ts2dPceuutaU0TN4XjGftDDz1kvvKVr5hIJGI6d+5srrjiCvPPf/6zwTlPP/206d27t8nKyjKnnHKKWb58eRON6NhkYtwnnHDCEfu84447mm5gxyBTv/P/ZGNgydS4X3/9dTNkyBATDodNz549zd133532pX6fMZZtKQkAAPAZrGEBAADWI7AAAADrEVgAAID1CCwAAMB6BBYAAGA9AgsAALAegQUAAFiPwAIAAKxHYAEAANYjsAAAAOsRWAAAgPUILAAAwHr/H0JRdIfNffICAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def f(x):\n", " return np.exp(-np.abs(x**3))\n", "\n", "# Compute the integral using quad form comparison\n", "I0, err = scipy.integrate.quad(f, -np.inf, np.inf)\n", "print(\"Integral from scipy.quad = %g with error %g\" % (I0, err))\n", "\n", "N = 10**4\n", "\n", "n_trials = 1000\n", "I_arr = np.zeros(n_trials)\n", "I2_arr = np.zeros(n_trials)\n", "\n", "for i in range(n_trials):\n", " I_arr[i] = integrate_MC(f, N)\n", " I2_arr[i] = integrate_MC(f, N, sampling = 'gaussian')\n", "\n", "I_mean = np.mean(I_arr)\n", "I_std = np.std(I_arr)\n", "print(\"Uniform: I = %g +- %g; frac err = %g\" % (I_mean, I_std, I_std/I_mean))\n", "\n", "I2_mean = np.mean(I2_arr)\n", "I2_std = np.std(I2_arr)\n", "print(\"Gaussian: I = %g +- %g; frac err = %g\" % (I2_mean, I2_std, I2_std/I2_mean))\n", "\n", "counts, bins = np.histogram(I_arr, bins=10, density = True)\n", "plt.stairs(counts, bins) \n", "counts, bins = np.histogram(I2_arr, bins=10, density = True)\n", "plt.stairs(counts, bins) \n", "plt.plot([I0, I0], (0,1.05*max(counts)), \":\")\n", "plt.ylim((0,1.05*max(counts)))\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "e3558622", "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.11.4" } }, "nbformat": 4, "nbformat_minor": 5 }