{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Foundations of Computational Economics #24\n", "\n", "by Fedor Iskhakov, ANU\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "## Optimization through discretization (grid search)\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", "\n", "[https://youtu.be/LyWRehkzIws](https://youtu.be/LyWRehkzIws)\n", "\n", "Description: Grid search method and its use cases." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "- Elementary technique of finding a maximum or minimum of a function \n", "- Main advantage: **robust**\n", " - works with *nasty* functions\n", " - derivative free\n", " - approximates **global** optimum \n", "- Main disadvantage: everything else\n", " - slow\n", " - imprecise\n", " - terrible in multivariate problems \n", "- Why used so much in economics?\n", " - objective function may be nasty\n", " - **as first step method** in multi-algorithms " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Algorithm\n", "\n", "$$\n", "f(x) \\longrightarrow \\max\n", "$$\n", "\n", "1. Take a starting value $ x_0 $, define a region of search, i.e. $ I = (x_0-a,x_0+b) $ \n", "1. Impose on $ I $ a discrete grid consisting of point $ x_i, i \\in 1,\\dots,n $ \n", "1. Compute $ f(x_i) $ for all $ i $ \n", "1. Return the maximum of $ f(x_i) $ as the result " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Example\n", "\n", "$$\n", "\\max_{x \\in \\mathbb{R}} f(x) = -x^4 + 2.5x^2 + x + 10\n", "$$\n", "\n", "First order condition leads to the critical points analytitcally:\n", "\n", "$$\n", "\\begin{eqnarray}\n", "f'(x)=-4x^3 + 5x +1 &=& 0 \\\\\n", "-4x(x^2-1) + x+1 &=& 0 \\\\\n", "(x+1)(-4x^2+4x+1) &=& 0 \\\\\n", "\\big(x+1\\big)\\big(x-\\frac{1}{2}-\\frac{1}{\\sqrt{2}}\\big)\\big(x-\\frac{1}{2}+\\frac{1}{\\sqrt{2}}\\big) &=& 0\n", "\\end{eqnarray}\n", "$$" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "hide-output": false, "slideshow": { "slide_type": "slide" } }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "plt.rcParams['figure.figsize'] = [12, 8]\n", "\n", "f = lambda x: -x**4+2.5*x**2+x+10\n", "df = lambda x: -4*x**3+5*x+1\n", "d2f = lambda x: -12*x**2+5\n", "critical_values = [-1.0,0.5 - 1/np.sqrt(2),0.5 + 1/np.sqrt(2)] # analytic" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "hide-output": false, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "image/png": "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RC0gIgiHw1BKoVgs6o5zhZ4vx1arFXv27EGpVNIdhYiIiKhn9Pf3Y2Fhoe2mVvR8OQbAK8ZEREREBIDlmIiIiIhoA8sxEREREVEVyzERERERURXLMRERERFRFcsxEREREVEVyzERERERURXLMRERERFRFcsxEREREVEVyzERERERURXLMRERERFRFcsxEREREVEVyzERERERURXLMRERERFRFcsxEREREVEVyzERERERURXLMRERERFRFcsxEREREVGVKKV0Z9ggIhkAk5pe3g8gq+m1OxHHqz4cr/pwvOrD8aoPx6s+HK/6cLzqo3O8RpVSgas/2VblWCcROaWUOqg7R6fgeNWH41Ufjld9OF714XjVh+NVH45XfdpxvDitgoiIiIioiuWYiIiIiKiK5fhTP9AdoMNwvOrD8aoPx6s+HK/6cLzqw/GqD8erPm03XpxzTERERERUxSvHRERERERVPVuOReTPROQ3IvKuiPxYRDzXeN5XReRjETknIv+61TnbhYj8noh8ICIVEbnmXaUicklE3hORsyJyqpUZ20kd48XjC4CI+ETkqIj8ffV/vdd4Xrl6bJ0VkRdanVO3Gx0vImIVkWeqj58UkbHWp2wf2xivfyoimU3H1L/QkbMdiMgPRSQtIu9f43ERkcerY/muiNzZ6oztZBvjdVhEcpuOrX/T6oztRESGReTnIvJR9Wfj/7bFc9rmGOvZcgzgKIDblFK3A/gEwLeufoKIGAH83wB+G8AtAP47EbmlpSnbx/sA/hGA49t47sNKqQPttjRLi91wvHh8XeFfA3hVKXUTgFerH28lXz22Diilvta6ePpt83j55wDmlVJ7Afx7AP9na1O2jzrOr2c2HVNPtjRke3kKwFev8/hvA7ip+udRAE+0IFM7ewrXHy8AeH3TsfVvW5CpnZUA/LFSah+AewB8c4vzsW2OsZ4tx0qpnymlStUPTwAY2uJphwCcU0pdUEoVABwB8PVWZWwnSqmPlFIf687RKbY5Xjy+PvV1AP+l+vf/AuC/1ZilXW3neNk8js8C+LKISAszthOeX3VQSh0HMHedp3wdwF+py04A8IhIpDXp2s82xos2UUollFLvVP++BOAjANGrntY2x1jPluOr/I8AfrrF56MAYps+nsZn/2PSlRSAn4nIaRF5VHeYNsfj61MhpVQCuPxNFEDwGs+zicgpETkhIr1WoLdzvGw8p/rLfw7AQEvStZ/tnl//uPoW7rMiMtyaaB2J36/qd6+I/FpEfioit+oO0y6q073uAHDyqofa5hgz6XjRVhGRVwCEt3joO0qp56vP+Q4uX+7/662+xBaf69rlPbYzXttwv1IqLiJBAEdF5DfV37C7TgPGi8fXZd+p48uMVI+vCQCvich7SqnzjUnY9rZzvPTUMXUD2xmLFwH8rVJqXUT+EJevun+p6ck6E4+t+ryDy1sTL4vI7wD4f3F5ukBPExEHgP8HwB8ppRavfniLf6LlGOvqcqyUeuR6j4vIHwD4BwC+rLZe024awOYrCUMA4o1L2F5uNF7b/Brx6v+mReTHuPzWZleW4waMF4+vKhFJiUhEKZWovo2WvsbXqB1fF0TkGC5ffeiVcryd46X2nGkRMQFwo3ff+r3heCmlZjd9+J/Rw3O0t6Gnvl/t1ubip5R6SUT+o4j4lVJZnbl0EhEzLhfjv1ZKPbfFU9rmGOvZaRUi8lUA/wrA15RSq9d42q8A3CQi4yJiAfANAD13h/x2iUi/iDhrfwfwFVy+MY22xuPrUy8A+IPq3/8AwGeuvIuIV0Ss1b/7AdwP4MOWJdRvO8fL5nH8JwBeu8Yv/r3ghuN11XzGr+HyPEja2gsAfr+6osA9AHK1qVD0WSISrs33F5FDuNy3Zq//r7pXdSz+EsBHSqn/6xpPa5tjrKuvHN/AnwOw4vJb/wBwQmiTzLUAAAE5SURBVCn1hyIyCOBJpdTvKKVKIvK/APivAIwAfqiU+kBfZH1E5B8C+A8AAgB+IiJnlVK/tXm8AIQA/Lg6niYAf6OUellbaI22M148vq7wGIC/E5F/DmAKwO8BgFxeBu8PlVL/AsA+AH8hIhVc/kHzmFKqZ8rxtY4XEfm3AE4ppV7A5R8+PxKRc7h8xfgb+hLrtc3x+l9F5Gu4PLVuDsA/1RZYMxH5WwCHAfhFZBrAdwGYAUAp9Z8AvATgdwCcA7AK4J/pSdoetjFe/wTA/yQiJQB5AN/o4V9UgcsXM/4HAO+JyNnq574NYARov2OMO+QREREREVX17LQKIiIiIqKrsRwTEREREVWxHBMRERERVbEcExERERFVsRwTEREREVWxHBMRERERVbEcExERERFVsRwTEREREVX9/+qZb9vLgdvBAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# make a plot of the function and its derivative\n", "xd = np.linspace(-2,2,1000)\n", "plt.plot(xd,f(xd),label='function',c='red')\n", "plt.plot(xd,df(xd),label='derivative',c='darkgrey')\n", "plt.plot(xd,d2f(xd),label='2nd derivative',c='lightgrey')\n", "plt.grid(True)\n", "plt.legend()\n", "for cr in critical_values:\n", " plt.plot([cr,cr],[-6,15],c='k',linestyle=':')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "hide-output": false, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on module optim:\n", "\n", "NAME\n", " optim\n", "\n", "DESCRIPTION\n", " # Collection of simple optimization algorithms from the Computational Economics course\n", " #\n", " # by Fedor Iskhakov, 2020\n", "\n", "FUNCTIONS\n", " bisection(f, a=0, b=1, tol=1e-06, maxiter=100, callback=None)\n", " Bisection method for solving equation f(x)=0\n", " on the interval [a,b], with given tolerance and number of iterations.\n", " Callback function is invoked at each iteration if given.\n", " \n", " newton(fun, grad, x0, tol=1e-06, maxiter=100, callback=None)\n", " Newton method for solving equation f(x)=0\n", " with given tolerance and number of iterations.\n", " Callback function is invoked at each iteration if given.\n", " \n", " newton2(fun, grad, x0, tol=1e-06, maxiter=100, callback=None)\n", " Newton method for solving equation f(x)=0, x is vector of 2 elements,\n", " with given tolerance and number of iterations.\n", " Callback function is invoked at each iteration if given.\n", " \n", " solve_sa(F, x0, tol=1e-06, maxiter=100, callback=None)\n", " Computes the solution of fixed point equation x = F(x)\n", " with given initial value x0 and algorithm parameters\n", " Method: successive approximations\n", "\n", "FILE\n", " /Users/fedor/Dropbox/RESEARCH/08.teaching/00.current_courses/source.CompEcon/source_CompEcon/_build/jupyter/executed/_static/include/optim.py\n", "\n", "\n" ] } ], "source": [ "import sys\n", "sys.path.insert(1, './_static/include/') # add path to the modules directory\n", "import optim as o # import our own optimization routines from last several lectures, see optim.py\n", "help(o)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "hide-output": false, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Newton converged to: [-1.0, -0.2071067809825758, 1.207106782385496]\n" ] } ], "source": [ "# first, try to optimize with Newton\n", "xs=[]\n", "for x0 in [0.5,-0.5,1.0]: # try different starting values\n", " xs.append( o.newton(df,d2f,x0))\n", "print('Newton converged to: %r'%xs)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "hide-output": false, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Grid search returned x*=1.11111 (closest to critical point 1.20711, diff=9.600e-02)\n" ] } ], "source": [ "# optimization through discretization\n", "def grid_search(fun,bounds=(0,1),ngrid=10):\n", " '''Grid search between given bounds over given number of points'''\n", " grid = np.linspace(*bounds,ngrid)\n", " func = fun(grid)\n", " i = np.argmax(func) # index of the element attaining maximum\n", " return grid[i]\n", "\n", "b0,b1 = -2,2 # bounds of region of search\n", "xs = grid_search(fun=f,bounds=(b0,b1),ngrid=10)\n", "cr = critical_values[np.argmin(np.abs(critical_values-xs))]\n", "print('Grid search returned x*=%1.5f (closest to critical point %1.5f, diff=%1.3e)'%(xs,cr,np.abs(xs-cr)))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "hide-output": false, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# check how fast accuracy increases with the number of grid points\n", "data = {'n':[2**i for i in range(20)]}\n", "data['err'] = np.empty(shape=len(data['n']))\n", "for i,n in enumerate(data['n']):\n", " xs = grid_search(fun=f,bounds=(b0,b1),ngrid=n)\n", " cr = critical_values[np.argmin(np.abs(critical_values-xs))]\n", " data['err'][i] = np.abs(xs-cr)\n", "plt.plot(data['n'],data['err'],marker='o')\n", "plt.yscale('log')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "#### More appropriate example\n", "\n", "- grid search is slow and inaccurate \n", "- yet, it picks out the **global** optimum every time \n", "- more appropriate example: \n", "\n", "\n", "$$\n", "f(x) = \\begin{cases}\n", "\\exp(x+3) \\text{ if } x \\in (-\\infty,-1] \\\\\n", "10x+13 \\text{ if } x \\in (-1,-0.5] \\\\\n", "75x^3 \\text{ if } x \\in (-0.5,0.5] \\\\\n", "5 \\text{ if } x \\in (0.5,1.5] \\\\\n", "\\log(x-1.5) \\text{ if } x \\in (1.5,+\\infty) \\\\\n", "\\end{cases}\n", "$$" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "hide-output": false, "slideshow": { "slide_type": "slide" } }, "outputs": [], "source": [ "def f(x):\n", " x = np.asarray(x)\n", " if x.size==1:\n", " x = x[np.newaxis] # to be able to process scalars in the same way\n", " res = np.empty(shape=x.shape)\n", " for i,ix in enumerate(x):\n", " if ix<=-1:\n", " res[i] = np.exp(ix+3)\n", " elif -1 < ix <= -0.5:\n", " res[i] = 10*ix+13\n", " elif -0.5 < ix <= 0.5:\n", " res[i] = 75*ix**3\n", " elif 0.5 < ix <= 1.5:\n", " res[i] = 5.0\n", " else:\n", " res[i] = np.log(ix-1.5)\n", " return res" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "hide-output": false, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtEAAAHWCAYAAACxJNUiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzde5zc0/3H8deJhLhLqom7uCvqmrrULa27XtxbfopqNVTpxU9Lq6XV369V1fZXpdq4VFyKVilKJXFZ9yAiCLkiIRKCIEISSfb8/ji7zYrdzczuzHzn+53X8/HIY3ZnZmc+vma/894zn3NOiDEiSZIkqXQ9si5AkiRJyhtDtCRJklQmQ7QkSZJUJkO0JEmSVCZDtCRJklQmQ7QkSZJUpoqE6BDCFSGEmSGEsW2u6xtCGBFCmNRy2aeDnz2u5T6TQgjHVaIeSZIkqZoqNRJ9JbD/EtedCdwdY9wEuLvl+w8JIfQFzgF2AnYEzukobEuSJEn1oiIhOsZ4PzBriasPAoa2fD0UOLidH90PGBFjnBVjfAsYwUfDuCRJklRXqtkT3T/GOAOg5bJfO/dZG3i5zffTWq6TJEmS6lbPjJ8/tHNdu/uQhxAGA4MBll9++R3WXXfdatbVrubmZnr0cC5mqTxe5fF4lcfjVT6PWXk8XuXxeJXH41WerI7XxIkT34gxfry926oZol8LIawZY5wRQlgTmNnOfaYBg9p8vw7Q1N6DxRiHAEMABg4cGEeNGlXZakvQ1NTEoEGDav68eeXxKo/Hqzwer/J5zMrj8SqPx6s8Hq/yZHW8QghTO7qtmpH+VqB1tY3jgFvauc8wYN8QQp+WCYX7tlwnSZIk1a1KLXF3HfAIsFkIYVoI4evAecA+IYRJwD4t3xNCGBhCuAwgxjgL+DnweMu/c1uukyRJkupWRdo5YoxHdXDTXu3cdxRwQpvvrwCuqEQdkiRJUi3Y0S5JkiSVyRAtSZIklckQLUmSJJXJEC1JkiSVyRAtSZIklckQLUmSJJXJEC1JkiSVyRAtSZIklckQLUmSJJWpIjsWSpJUGPPmwYMPQk/fIiV1zJFoSZLauuoq2Gcfes2alXUlkuqYIVqSpLYmTgSgxwcfZFyIpHpmiJYkqa0XXwQgZFyGpPpmiJYkqa2WEE1zc7Z1SKprhmhJktpqHYmOMeNCJNUzQ7QkSa3efjv9AzBES+qEIVqSpFZTpiz+2nYOSZ0wREuS1Kq1HxrbOSR1zhAtSVKrNiHadg5JnTFES5LUypFoSSUyREuS1KrtSLQ90ZI6YYiWJKnViy9Cj5a3RkeiJXXCEC1JEqTQPGUKrLceYDuHpM4ZoiVJAnj9dXj/fdhoo/S97RySOmGIliQJFvdDb7ghACHDUiTVP0O0JEkAzz+fLjfeOF06Ei2pE4ZoSZLgIyHanmhJnTFES5IEKUSvtRassEL63hAtqROGaEmSIIXojTZavMSd7RySOmGIliQJPhKibeeQ1BlDtCRJ778PM2akfujQsi6HIVpSJwzRkiS98EK6dCRaUokM0ZIkta7MYU+0pBIZoiVJahuibeeQVAJDtCRJzz8Pq60GffvaziGpJIZoSZImT06j0GA7h6SSGKIlSWpd3g4Wj0RnWI6k+meIliQ1toULYerUxSG6tSfakWhJnTBES8qf889nnb/9LesqVBQvvZSC9JIj0fZES+pEz6wLkKSyDBsGZ5zBx7fYIutKVBRtV+YAe6IllcSRaEn58eabcPzxWVeholkyRLvEnaQSGKIl5UOMcOKJ8MYbsMEGftSuynn+eVhuOVh77fS97RySSmCIlpQPV10F//gH/M//wKabZl2NiuT552GDDRa3cdjOIakEhmhJ9e/FF+HUU2GPPeC//ztd5yihKqXt8nbwn3YOl7iT1BlDtKT6tmgRHHNMCjZXXQXLLLO4Z1Xqrhg/GqIdiZZUAlfnkFTfzj8fHnoIrr4a1l8/62pUNDNnwnvvtRui7YmW1JmqjkSHEDYLIYxp8292COG7S9xnUAjhnTb3ObuaNUnKkdGj4eyz4UtfgqOPzroaFdGSK3OAq3NIKklVR6JjjBOAbQFCCMsArwA3t3PXB2KMn69mLZJyZu5c+MpXoH9/uOSSD7dw2M6hSpk0KV22naxqO4ekEtSynWMv4PkY49QaPqekvDrjDBg3DkaMgL59P3q7o4SqhIkToWdPGDBg8XW2c0gqQS1D9JHAdR3ctksI4SlgOnB6jPHZJe8QQhgMDAbo378/TU1N1aqzQ3PmzMnkefPK41Uej9difR57jG3+8AemHXYYk3v2hCWOyydnzWKZRYs8XmXyNfZRWzz0ECutuSaPPfTQf67r/cor7AzMmzfP41UGX1/l8XiVpx6PV4g1+Es7hLAsKSBvGWN8bYnbVgGaY4xzQggHAr+PMW7S2eMNHDgwjho1qnoFd6CpqYlBgwbV/HnzyuNVHo9XizffhE9+Evr0gVGjYPnlP3qfz32O2c8/zyrjx9e+vhzzNdaOrbdOE1Zvu23xdS++CBtuyPgzzmDz887Lrrac8fVVHo9XebI6XiGEJ2KMA9u7rVZL3B0AjF4yQAPEGGfHGOe0fH0H0CuEsHqN6pKyFyNcfjkrTZiQdSXZa7sr4bXXth+gAULwo3Z1X3Nz6onebLMPX29PtKQS1CpEH0UHrRwhhDVCSLOEQgg7ttT0Zo3qkrL305/CCSewVtuRsEbVdlfCbbfNuhoV3bRpMG/eR3fAdHUOSSWoek90CGEFYB/gxDbXnQQQY/wTcDjwzRDCQmAucGSsRY+JVA9+8Qs491wAwqJFGReTsfZ2JeyMpwl118SJ6XLJEO3EQkklqHqIjjG+D3xsiev+1Obri4CLql2HVHd++1s466y0jFtTU2O/YS9aBMce++FdCTvjEneqhNYWqg5CtO0ckjrjtt9SFi66KI22HnEE/OUvaYmtRg7R558PDz6Yjou7EqpWJk6EFVeENdf88PUtf6T5p5qkzhiipVobMiS1LRx0UJo817NnetNu1BDduivhEUekUflSOBKtSpg4MY1CL/l6ciRaUgkM0VItDR0KJ50EBx4IN9wAvXql63v0IDTiG3brroT9+sGf/mQ4Vm1NnPjRlTnAnmhJJTFES7Vy3XXwta/BXnulFSiWW27xbT16NOZIdOuuhEOHtr8rYWca8XipcubPhylTPtoPDa7OIakkhmipFq65Jo247r47/POf0Lv3h29vxHWPhw+HP/wBvvMd2Hvv8n7WEWt11/PPp3aN9kK07RySSmCIlqpt6NC08sSee8Ltt6eJTEtqtJHoN9+Er34VttgCfvnLLj1Ew/3RocrqaHk7sJ1DUkmqvsSd1NAuvxy+8Y3UwnHLLbDCCu3fr5FCdNtdCe+4o+NdCTvjSLS6q4QQ3TC/k5K6xJFoqVqGDIETToB99oFbb+04QENq52iUj45bdyX8+c/dlVDZmTgR+veHVVf96G2tS9wZoiV1whAtVcMll6TR1gMOSCPQSxtt7dEgv4ptdyU8/fSuP04jLwmoypgwof1RaLAnWlJJGuSdW6qhP/wBTj4ZPv95uPnmj04ibE8jLHFX7q6EUjW1rhHdnkb5o1ZSt9gTLVXSBRfA97+fNlL5299g2WVL+7lGGFn99a/TroRXXeWuhMrW22/DzJkdh+jWdo6i/2ErqVv8c1uqhBjhxz9OAfpLXyovQEPxJxZ2ZVfCzjixUN0xaVK6XNpIdJF/JyV1myPRUnc1N8N3v5vaOE44Ie28V26rQpHbOVp3Jfz4xyu7K6EBR101fny6bG+3QnCJO0klMURL3bFwYQrOQ4fCaaeldo6uhMQit3O07ko4fHj5uxJ2xJFodce4cdCzJ2y8cfu3t76+ivqHraSKsJ1D6qr58+HLX04B+mc/63qAhjQSXcQQ3XZXwn32yboaKXnuOdhkE+jVq/3bHYmWVAJHoqWueO89OPTQFBL/7/9SSOyOIo5EV2BXws4YcNRl48bBVlt1fHvrH8O+xiR1wpFoqVxvvw377Qd33QVXXNH9AA3F64luuyvhtdd2bVfCztjOoa6aPx8mT05/3HWmiH/YSqooR6KlckyfnjZQGTcObrgBDj+8Mo9btNU5WnclPO+86u1KWKTjpdqZNCn1On/iE53fr2h/2EqqOEO0VKrx49MI9KxZ8K9/wb77Vu6xizTq1bor4e67d29Xws44Eq2uGjcuXS5tJLpof9hKqjhDtFSKRx5JOxD27An33Qfbb1/Zxy/KqFfrroTgroSqT889l/4I62h5u1Yh2HcvqVP2REtLc9ttsNdeaXm2hx+ufICG4mwz3Lor4cUXw4ABWVcjfdS4cbDBBkvv0+/RwyXuJHWqIO/cUpVcdhkcfHCayf/QQ7DRRtV5nhDyPxL95JOV3ZWwM7ZzqKvGjVt6PzQU5w9bSVXjWUJqT4xw7rnwjW+k3ud77oF+/ar3fHnvv5w7F44+uvK7EnYmz8dL2Vi0CCZMWHo/NBTjD1tJVWVPtLSkhQvhW9+CIUPguOPg0ks73pShUvIeoquxK2FnHIlWV7z4YlrirtSR6Dz/TkqqOkeipbZmz04TCIcMgR/+EP7yl+oHaMj3qFfrroTf/nZNdyV00pfK9txz6bKUkeii7iIqqWIciZZaTZ2aAvT48Wn0+YQTavfceR31arsr4Xnn1e55HYlWV7Qub7f55ku/bwhOLJTUKUO0BPDYY/DFL8K8eXDnnWk1jlrK46hXjHDSSWlXwttvr/yuhFKljRsHa68Nq6669Pvm8XdSUk3ZziH94x8waBCssEJaD7rWARryudnK1VfDjTfCz38O222XdTXS0j37bGn90OASd5KWyhCtxhUjnH9+2rp7221h5MjS32ArLW+brUyZAqecUt1dCTtjO4fK1dycQvQnP1na/X2NSVoKQ7Qa04IFcOKJaVWJL38Z7r67ukvYLU2eeqIXLYJjjklfZ7krYV6Ol+rDCy+kpRi32qq0++ftD1tJNWdPtBrP66+n0ef774cf/Si1I2S9sUKe2jladyUcOjS7XQkdJVS5nnkmXZY6Ep2nP2wlZcIQrcby1FNw0EHw2mtwzTVpg5B6kJdRr9ZdCQ8/fPFotJQHY8emP75KWd4OnFgoaals51DjuPFG+PSn02YqDzxQPwEa8jGymsWuhJ0x4KgczzwDG24IK65Y2v1d4k7SUhiiVXzNzWn09IgjYJttYNQoGDgw66o+LA8j0WeemZYIu/JK+NjHsq0l6wCv/HnmmdJbOcCRaElLZYhWsb37Lhx6aOp7/trX4N57YY01sq7qo7LuyV6a4cPhwgtrvithZww4Ktm8eTBpUumTCsGeaElLZU+0imvyZDj44LQD4YUXpiXZ6nUEs54/Os5qV8LO1Ov/R9Wn8ePTqjLljETnabKvpEwYolVMt94Kxx6bll8bNiybDVTKUa8fHbsroYqg3JU5IB8tVpIyVeefIUtlWrgwLVt30EGw8cbwxBP1H6Chfj86bt2V8Nxz62tXQkeiVY6xY2HZZdM5oVT1+jspqW44Eq3imDkTjjoK7rkHvvGN1MLRu3fWVZUmhPob9Wq7K+H3v591NVLXPfNM2o20V6/SfyaE+vx0SFLdcCRaxTByJOywAzz8MFxxBQwZkp8ADfU36rVoUWqHgWx3JexMPR0v1bdnnilvUiGk38l6+8NWUl0xRCvfYoSLL4Y99kijTA8/DMcfn3VV5au3EH3BBWkt7Ysuym5Xws7YzqFSvf02TJtWXj801P+KOZIy51lC+fXuu/CVr6SWg333Tf3P9dS3W456+uj4ySfhJz+p/10J6+V4qb51ZVIh1GeLlaS6YohWPj35ZGrfuP76tAb0rbdCnz5ZV9V19fLRceuuhKuvXh+7EnakXutS/RkzJl1uu215P1dvnw5JqjtOLFS+xAh//COcdloKevfcA3vumXVV3VcvS9y17ko4bFj2uxJKlTBmTNqqfs01y/u5evmdlFS3HIlWfrz1Fhx2WGrf2Hvv9OZYhAAN9bGxw4gRi3cl3HffbGspgQFHJRkzJrV5lfvpRT38Tkqqa1UP0SGEKSGEZ0IIY0IIo9q5PYQQLgwhTA4hPB1C2L7aNSmHRo5Mb4S33ZYmvd12WxpdKoqsN3aYNav+diXsjO0cKsWCBWmN6HJbOSD730lJda9W7RyfiTG+0cFtBwCbtPzbCbik5VJKfcK/+U3aQGWddeDBB2GnAr48slwJIEY48UR4/XX417/clVDFMW4cfPBBl0O0I9GSOlMPPdEHAVfFGCMwMoSwWghhzRjjjKwLU8amTYPjjkt9z4cdBpddBqutlnVV1RFCdhMLW3cl/OUv87O6iSPRKkVXJxUChECP+fPTeUglWe711z1epepZD/FL3VWL/4sRGB5CiMCfY4xDlrh9beDlNt9Pa7nOEN3I/v73NDo6f37aOOWEE4odnLKaxOSuhCqyMWPSJyubblr+z/buTZ/HH4d11618XQW1S9YF5Ey/s86CQYOyLkPdUIsQvWuMcXoIoR8wIoQwPsZ4f5vb20tGH0kTIYTBwGCA/v3709TUVJViOzNnzpxMnjevunK8lnnvPTa58ELWGD6c2ZtvzrizzmLuOuvAffdVp8g6sdErr7BGc3NtX1+LFrHtaaex0qJFjDr5ZOY98EDtnrubNnv1VVZbtMjfxzI12jlsm6YmlhkwgNFdeG2vcPzxLLfNNvTO086nGZs3b57HqwQ9PviATS68kPjqqw31+9hddXn+ijHW7B/wU+D0Ja77M3BUm+8nAGt29jg77LBDzMK9996byfPmVdnH64EHYhwwIMYePWI8++wYP/igKnXVpdNOiwt7967tc553XowQ49ChtX3eSjj++Di3X7+sq8idhjqHNTfH2KdPjCee2OWHaKjjVQEerxLNnh0jxEnf/GbWleRKVq8vYFTsII9WdTZTCGHFEMLKrV8D+wJjl7jbrcCxLat07Ay8E+2HbiwLFsBZZ6Xl6nr0SJMHf/aztI13o6j1JKa87ErYGSd9qTMvvZSWxexKP7RUTS2tiS7TmX/VbufoD9wc0gumJ/DXGOOdIYSTAGKMfwLuAA4EJgPvA8dXuSbVk+eeS5MHR42C44+H3/8eVl4566pqr5Zr0s6dm7ZLr/ddCTuTx5pVW62TCvMyWVZS7lQ1RMcYXwC2aef6P7X5OgLfqmYdqkMLF6b1ns85B1ZZJa0OcdhhWVeVnVpOLDzzzPTHS853JXQUR50aMyZ9wvPJT2ZdifRhrYMAnsNyzzVWVHvPPZdGnR97LAXnP/4R+vXLuqps9ehRmyXuWnclPPXUXOxK2CFHorU0o0enVTlWWCHrSqQPM0QXhtt+q3YWLoRf/Qq23x6efx6uvz4tZdfoARoghOqPrLbuSviJT6T/D1KRjRoFn/pU1lVIKjBHolUb48enAPfoo3DooWn0uX//rKuqH9WeWBgjnHSSuxKqMUyfnv4NHJh1JdJH+UlaYTgSrepauBB+/es0Q37yZLjuutT/bID+sGr3RF9zTRr1P/fcYky08k1InRk1Kl0aolWPXJ2jMByJVtWsNHEinHZaWk7tkEPgkksMzx1p2yNX6YA4ZQp861vF25XQNyB1ZNQoWGYZl7eTVFWGaFXee+/BOeeww+9+l0LzjTemFg5HDzvWo+VDoebm9OZfKYsWwbHHpq+vuqqyj50lX0vqzKhRsOWWTipUfXJiYWEYolVZw4al3tspU5jxhS+w1lVXwWqrZV1V/atWiL7gAnjgAbjyShgwoHKPK9WrGOHxx+GLX8y6Eql9hujCMESrMmbOhO99D/76V9h8c3jgASYuXMhaBujSVOOk2nZXwtbR6KKo5eY0ypeXXoI33rAfWlLVObFQ3dPcDH/5S1o27cYb4ac/TZsc7LZb1pXlS9uR6Eoowq6EUlc4qVD1zvNxYTgSra576qk0Ye2hh1JoHjIkhWmVr9Ih+oc/LMSuhJ1xZrva9fjj0KsXbL111pVI7XN1jsJwJFrle+cd+M530qYpEybAFVfAffcZoLujku0cI0bA73+f/10JO+NIjjoyalQK0Mstl3UlUucM0blniFbpYoSrr4bNNoM//CFNIJw4MW3h3cOXUrdUaiTaXQnVyGJMIdpWDtUzBwEKw3YOleaZZ+Dkk+HBB2GnneD222GHHbKuqjgqMRLduivhzJlw223F3pXQNyG1Z+LE9EmZIVr1zNU5CsPhQ3Xurbfgu99Nu9yNGweXXgoPP2yArrRKjES37kr485+nVhup0TzySLrcZZds65DUEByJVvsWLoQ//xnOPjsF6W98A37xi8JOUstcd0P01KlwyinF25WwM47iaEmPPAKrrur8DNU3P0krDEei9VHDhsE226RQtvXWMHp0CtQG6Orpzsd7rbsSxlisXQk745uQ2jNyZGo3c46G6pmrcxSGZxotNn48fO5zsP/+MH8+3Hwz3HMPbLtt1pUVX3dGoi+4AO6/P032bKRdCX0DUlvvvgtjx9rKofzwHJZ7hmilFR2++1345CfTxMFf/xqefRYOPtgRv1rpaohu3ZXwsMOKtythZ3xdakmPPZZ+fwzRkmrEnuhGNn8+XHJJmoj29tup7/ncc6Ffv6wrazxdaedouyvhn/9ssFRja51UuOOO2dYhlSIER6ILwBDdiJqb4a9/hR//OE1I23tv+M1v3OErS10ZiW7dlfDOOxuvXz0E+wn1YSNHpgmFffpkXYmkBmE7RyOJMQWu7beHY46Bvn1h+PC0w50BOlvlhui2uxLut1/16pLyIMYUom3lUF74yWEhGKIbxeOPw157wQEHpAk4112XdvbaZ5+sKxOU187hroTSh02aBG++aYhWfvhpWiEYootu0iT40pdSn+DYsWkFh3Hj4MgjXQaqnpQ6Et12V8Jrrin2roSdcRRHbbnJivLIEJ179kQX1ZQpacLg0KHQuzeccw7893/DyitnXZnaU2qIbt2V8Be/cFdC34DU6qGH3GRF+eJAQCEYoovm5Zfhf/8XLr88bbpxyilw5pmwxhpZV6bOlNLO0bor4W67wQ9+UJu66pVvQGrr/vvTbp1+uqa8cHWOQjBEF8WMGWl0csiQ9Is5eHBavWGddbKuTKVY2kh0I+5KKJXitddgwgT4+tezrkRSgzFE593MmXDeeWm954UL4fjj4ayzYP31s65M5VhaiP7Nb9Jo25VXwgYb1KysuuYojgAeeCBd7rFHtnVI5fDTtEIwROfVjBkpWF1yCcybl5asO/ts2HDDrCtTV3TWzjFmTFrTu9F2JeyMb0Bqdf/9sMIKzhFQvrg6RyEYovNmyhQ4/3y44gpYsACOOipt+7zZZllXpu7oaCR67lw4+mh3JWyHb0ACUoj+9KehV6+sK5HK4zks95yFkRcTJqRWjU02gcsuSyOSEyem1RoM0PnXGo6XDNGtuxL+5S+NtythZ/xjQgBvvQVPP20rh/LHc1ghOBJd7556Kk0Y/Pvf01J1J58Mp58O666bdWWqpNaR6LYjE627Ep5yirsSSu156KH0O2OIVt64OkchGKLr1SOPwC9/CbfdltZ2PuMM+N73oF+/rCtTNSzZzuGuhNLS3X8/LLts2kxKkmrMEF1PFi2CW26BCy5IIbpvX/jZz+DUU6FPn6yrUzW1beeIEb75zbTyym23pUlT+jA/ChWkEL3jjo27c6fyy3NYIdgTXQ/efx/++MfU23zYYfDqq2l77pdeSituGKCLr207x7XXwt/+Buee64oDnfGj0MY2ezaMGmUrh/LJ1TkKwZHoLL32Glx8cQrQb76ZRlTOOw8OOcTNNBpNa4h+8UX41rfclXBpHMXRffelT+/23jvrSqSuMUTnniE6C+PGwe9+l3ae++AD+OIX02TBXXc1HDSq1v/vp57qroRSKe6+O7Vx7LJL1pVI5fO9vhAM0bWyaBHccUdq0xgxApZbLk0c+973XKJOi0eip09Py9m5K2HnnNmuu+6C3XdPqxZJeeM5rBAM0dX21ltpY5SLL04f1a+9NvzP/8A3vuFKG1qsNUQfdhgcd1y2tUj1bsYMePZZf1ckZcoQXS1jx8JFF8HVV6eJg7vttrjf2Z21tKSdd+blI45g3Usu8WO+Ejkpp4HdfXe6tB9aeeV5vhAM0ZW0YAH861+pZePee1PLxtFHp80yttsu6+pUz/r04fmTT2ZddyUsjW9Aje2uu9IOnttsk3UlUte4OkchGKIrYepUuPTS1LYxY0baTfCXv4QTToDVV8+6OkkqjhhTiN5rr8VtUFIeGaJzzxDdVQsXplHnIUPgzjvTdQceCIMHp8ueHlqpahyJblwTJsArr9jKoXzzHFYIJr1yvfQSXHYZXH55WklhrbXgxz9Oo87rrZd1dZJUbMOHp8u99sq2Dqk7XJ2jEAzRpRo2jE+ecw489lj6fv/90yYpn/uco85SFnwDaky3356WBd1ww6wrkdTgTH+luu02Vpo0CX70ozTqPGBA1hVJjcuPQhvTnDnQ1JQma0t55jmsEKo2KyOEsG4I4d4QwrgQwrMhhO+0c59BIYR3QghjWv6dXa16uu1//oeRN9yQ1ng2QEvZcyS68dxzT9rl9XOfy7oSqXtcnaMQqjkSvRD47xjj6BDCysATIYQRMcbnlrjfAzHGz1exjspYbTWibRtSfXAUpzHdfjusvHJad1/KO0N07lVtJDrGOCPGOLrl63eBccDa1Xo+SVKBxQh33AH77APLLpt1NVL3OBBQCDVZZDOEMADYDni0nZt3CSE8FUL4dwhhy1rUIynn/Ci08Tz9NEybZiuHisHVOQqh6v0JIYSVgH8A340xzl7i5tHA+jHGOSGEA4F/Apt08DiDgcEA/fv3p6mpqXpFd2DOnDmZPG9eebzK4/Eq3YYvvcTa4PEqU55fY+tdey0bAg+vuiof1Oi/Ic/HKwser9J9esECFixY4PEqQz2+vkKs4l9CIYRewL+AYTHG35Zw/ynAwBjjG53db+DAgXHUqFGVKbIMTU1NDBo0qObPm1cer/J4vMpw5pk0//a39Pjgg6wryZVcv8Z23RXmzYMnnqjZU+b6eGXA41WG/v15ZeedWfuWW7KuJDeyen2FEJ6IMQ5s77Zqrs4RgMuBcR0F6BDCGi33I4SwY+reAGgAACAASURBVEs9b1arJkkFYT9hY5kxAx55BA46KOtKpMqwJa0QqtnOsStwDPBMCGFMy3U/AtYDiDH+CTgc+GYIYSEwFzgyVnNoXFJxeKpoHP/8Z/r/fdhhWVciVY7nsNyrWoiOMT4IdDpcFGO8CLioWjVIKihHohvLTTfBppvCFltkXYlUGZ7DCqEmq3NIktQlb74J996bRqENHioKV+coBEO0pHzyDagx3HorLFpkK4eKxT8IC8EQLSl/fANqHDfdBOuvD9tvn3UlkvQhhmhJueTM9gYwezYMHw6HHuofTioWV+coBEO0pPwxUDWGW2+FDz6Aww/PuhKpsuyJLgRDtCSpPl1zDQwYALvsknUlUuUZonPPEC0pfxyJLr5XX4URI+ArX/H/t4rH13QhGKIlSfXn+uuhuRmOPjrrSqTKM0QXgiFaUj75UWixXXMN7LADbL551pVIVeHEwvwzREvKH0dxim3cOHjiidTKIRWR57BCMERLyiVHcQrsmmugRw848sisK5Gqw9U5CsEQLSl/HMUproUL4corYb/9YI01sq5Gqh5DdO4ZoiVJ9eP222H6dBg8OOtKpOpxIKAQDNGSpPoxZAistRZ8/vNZVyJVjyG6EAzRkvLHN6BimjoV/v1v+PrXoWfPrKuRqsp5HflniJaUX74JFctll6U/kE44IetKpOpyIKAQDNGS8sc3oOJZsAAuvxwOOADWWy/raqTqcnWOQjBES5Ky949/wIwZcNJJWVci1YYhOvcM0ZLyp3Uk2jehYogRfv1r2GwzOPDArKuRqs9P0wrBmRuSpGzddx+MHp1W5ujh2I4agCG6EDxbScovR6KL4YILoF8/OOaYrCuRasbVOfLPEC0pfxzFKY7nnksbrHzrW9C7d9bVSLXhOawQDNGSpOycf34KzyefnHUlUu24OkchGKIl5Y8TC4thwgS4+uoUoFdfPetqpNry/JV7hmhJUjZ++lNYfnk444ysK5Fqy3aOQjBES8ovR3Lya+xYuOEG+Pa306RCqZEYogvBEC0pf3wDyr9zzoGVV4bTT8+6EikTrs6Rf4ZoSfnlm1A+PfQQ3HQTnHYa9O2bdTVS7TkQUAiGaEn54xtQfjU3w3e+A2uv7Si0GpercxSCOxZKkmrnqqvgiSfgmmtgxRWzrkaSusyRaEn54xJ3+fTmm2kljp13hv/6r6yrkbLjp2mF4Ei0JKk2Tj8dZs2C4cMNEWpstnMUgiPRkvLLN6H8uPtuuPJK+MEPYJttsq5Gypyrc+SfIVpS/jiKmS9vvQXHHw+bbgo/+UnW1UjZ8xxWCLZzSJKqJ0YYPBhmzIBHHoHevbOuSMqe7RyFYIiWlD9OLMyPSy+FG2+EX/0KBg7MuhpJqhjbOSRJ1fHww3DKKbDffq4JLbVlO0chGKIl5Zcj0fVr2jQ47DBYbz247jro4duN9B+2cxSC7RyS8sdRnPr25puw777w/vtw113Qp0/WFUl1x9U58s8QLSm/fBOqP7Nnw+c+By+8AMOGwZZbZl2RVH8cCCgEQ7Sk/PENqD7NmgX77w9PPgl//zvsuWfWFUn1yXaOQrBJTZLUfVOmpND89NNw001w8MFZVyRJVeVItKT8cYm7+nL//WkS4YIFcPvtsNdeWVck1Tc/TSsER6IlSV2zYAGcfTZ85jPQty88+qgBWiqF7RyFYIiWlF++CWXn3nvT5ik//zl85Svw+OOw2WZZVyXlhqtz5J8hWlL++FFodkaNgkMPhc9+Ft55J/U/Dx0Kq6ySdWVSfngOK4Sqh+gQwv4hhAkhhMkhhDPbuX25EMINLbc/GkIYUO2aJEllmD0brr0WBg2CT30qrf187rkwbhwcckjW1Un5YztHIVR1YmEIYRngYmAfYBrweAjh1hjjc23u9nXgrRjjxiGEI4FfAV+uZl2Scs6JhdU1Zw6MHQsPPAD33ZdC8/z5sP768JvfwAknOPIsqeFVe3WOHYHJMcYXAEII1wMHAW1D9EHAT1u+vhG4KIQQYvTdUZJKMncuvPxyWqd5zpzF/+bNS+G35d+ACRPSBihtrvvQv3fegUmTYPr0xY+96aZw0knwpS/Bzju7fbdUCbZzFEK1Q/TawMttvp8G7NTRfWKMC0MI7wAfA95oe6cQwmBgMED//v1pamqqUskdmzNnTibPm1cer/J4vEq3zuTJbAw8cP/9LFpppazLqaner77KaqNHs/LEiaw0aRLLT5/Osm+/XdLPDgCae/akuVcvYq9eNC+7LM29ev3n+0XLL8/7W2/N3AMP5P311uOdLbdkQd++6Yc/+CAtZddA/J0sj8erdNvNns2iXr08XmWox9dXtUN0e39qLTnCXMp9iDEOAYYADBw4MA4aNKjbxZWrqamJLJ43rzxe5fF4leHJJwHYfffdYdVVMy6mBiZNgiuugH/+E8aPT9etsgpsuy3sthustx6suy58/OOw8sqw0kqw4oqw/PKw7LKw3HKw3HI0Pfwwgz772U4nwzTA0SyZv5Pl8XiVYdVVeWvePI9XGerx9VXtED0NWLfN9+sA0zu4z7QQQk/SOXxWleuSVARF7vqKEUaMgF/8IvUlL7NMWhHjxBNhv/3ScnLltlbYiiHVB9s5CqHaIfpxYJMQwgbAK8CRwH8tcZ9bgeOAR4DDgXvsh5bUqaK/AT3yCPzgB/Dgg2mU+Ze/hOOOgzXXzLoySZXg6hyFUNUQ3dLjfAowDFgGuCLG+GwI4VxgVIzxVuBy4OoQwmTSCPSR1axJkurWnDnwox/BRRelwHzxxfD1r6d2DElSXan2SDQxxjuAO5a47uw2X88Djqh2HZIKqEgjOY8/nlbAmDoVTjkltXE02KRJqWE4El0INshJyp+itXNccUWaIBhjWgHjwgsN0FKRFe0c1qAM0ZLyK+8jOTHCT3+aWjb23BOeeCKFaUmFF/J+/lL12zkkqeKKMIoTI3z726n/+fjjYcgQ6OkpWWoItnMUgiPRklRrMcLpp6cAfdppcPnlBmipkRRhIECGaEk51PoGlNeRnP/9X/jtb+HUU+GCC3xDlaQcMkRLUi3dcAP85CdwzDHwf/9ngJYake0chWCIlpRfeXsTevxx+OpXYffd4dJL3UFQalT+8VwInsEl5U8e34DefjutA92vH/zjH26gIjU4V+fIP0O0pPzKy5tQjPC1r8G0aamd4+Mfz7oiSVmynaN0CxfC/fez8oQJWVfyEYZoSfmTt5Hov/wFbr4ZfvlL2HnnrKuRlLW8ncNq7a234Lrr4Oij06d3e+7Jutdfn3VVH+GaSpJUTdOnp2Xs9tgjXUqSPur55+Gf/4TbboMHH4RFi9KndgcdBF/4AhN696Zf1jUuwRAtKb/q/ePQGOGb34T58+Gyy5xIKCmxnSOZOBFuvBH+/ncYMyZdt/XWcMYZ8IUvwI47/ue8uaipKbs6O2CIlpQ/efko9IYb4NZb4de/hk02yboaSfUiL+ewahg3bnFwfuaZdN0uu6S18w85BAYMyLS8chiiJeVXPY/kzJmT2jd22AG++92sq5FUZxpqdY5XX009zldfDU8+mf6I2HXXtFb+YYfBOutkXWGXGKIl5U8eRnHOPx9mzEgjLm7pLamtRmjneP99uOWWFJyHD089zgMHwu9/D4cfDmutlXWF3eaZXZIq7eWX03beX/4yfPrTWVcjqd7kYSCgq558Ev78Z/jrX+Hdd2HddeEHP0i7tH7iE1lXV1GGaEn50/oGVK8jOT/8ITQ3w69+lXUlkupR0UL0e++lOSB//jM89hj07p02l/rqV2HPPQs7qdoQLUmVNGYMXHst/OhHsP76WVcjqV7V6yBAOV54IbVnDB0K77yTRpr/7//g2GOhT5+sq6s6Q7Sk/KrHN6Fzz4VVV4Xvfz/rSiTVqzyPRMcIDz+cVtO4+WZYZhk44gg46STYffd8/7eVyRAtKX/q9ST99NPpTeWcc2C11bKuRlK9CiF/q3M0N6fNUM4/Hx59NJ3jzjgDTjkF1l476+oyYYiWpEo591xYZRX4zneyrkRSvctLiG5uhn/8I53fxo6FjTaCP/wh9TuvtFLW1WWqmJ3ekoqtHicWPv10eqP5zncaohdQUjfU66dpbTU3w9/+lnYQ/NKXYMECuOYamDAhjT43eIAGQ7QkVcavfpXeVNxYRdLS1HuIHjECttsuLdPZ3JyWq3v2WTj66NQDLcAQLSnP6mUk+pVX0ojNCSdA375ZVyMpD+rl/NXW2LFwwAGw774we3YKz888A0cdZXhuhyFaUv7U2yjOxRen0ZpvfzvrSiTlQb2dw958E048EbbZBkaOTJtFjR9veF4KJxZKyq96GMl5//20wcBBB8EGG2RdjaQ8qJfVOWKEq66C00+Ht96CU0+Fn/wEPvaxrCvLBUO0pPypp1Gcq6+GWbPge9/LuhJJeZJ1iJ44EQYPhvvug112gT/9KU0iVMls55Ckroox7da1/faw225ZVyMpL7IcCGhuTkvUbbttWlVoyBB48EEDdBc4Ei0pf+plibsHHoBx4+Avf6mv0XFJ9S2r88XLL8PXvgZ33QUHHgiXXQZrrplNLQVgiJakrrr88rS5yhFHZF2JpLyp9SDAP/+ZNkhZuDCNPp9wgn/8d5PtHJLyK8uR6Lffhr//Hf7rv2DFFbOrQ1L+1DK8LlwI3/8+HHIIbLopPPUUfOMbBugKcCRaUv7Uw8n/uutg7tw0miNJ5ajV6hwzZ6ZPyu6/H04+GX77W1huueo/b4MwREtSV1x2WZqYs/32WVciKY+qHaLHj099zzNmpFWEvvKV6j5fAzJES8qfrCcWjhkDo0enGe71MCouKV+qfd647z44+GBYdtn09Y47Vvf5GpQ90ZJUrqFD05vT0UdnXYmkPKpmiL7xRthnn7TqxsiRBugqMkRLyq8sRqIXLYLrr4fPfQ769Kn980sqhmqcv669Fr78ZfjUp+Chh9xFtcoM0ZLyJ8sWivvug1dfhaOOyq4GSflWjXPYlVfCMcfAHnvAsGH+kV8DhmhJ+ZXFSPR118FKK8HnP1/755ZUDJVeneOmm+DrX4e99oLbb0/nKFWdIVpS/mQ1Ej1/fuo3POQQWH75bGqQpLbuuSd9MrbjjmlDlRVWyLqihmGIlqRSDRuWNlmxlUNSd1RqIOCZZ9IqHJtumkag3fippgzRkvInqyXu/vpXWH112Hvv2j6vpGIJofvnr1mzUoBeaSW4807o27cytalkrhMtSaWYOxduuw2OPRZ69cq6Gkl5150QvXBhWoVj2rS0G+Haa1euLpXMEC0pv2o5En3XXfD++3DoobV7TknF1N12jh//OJ2TrrgCdtqpMjWpbLZzSMqfLCYW3nwzrLoq7Lln7Z9bUrF0Z3WOe+6B88+HwYPh+OMrW5fKYoiWpKVZuBBuvTUta7fssllXI6lRzZqVWso23RR++9usq2l4VWnnCCH8GvgC8AHwPHB8jPHtdu43BXgXWAQsjDEOrEY9kgqm1hMLH3oI3nwzTeKRpO7q6qdpp50Gr70Gt9ziShx1oFoj0SOArWKMWwMTgR92ct/PxBi3NUBLqls33wzLLQf77591JZKKoCurc9x7LwwdCj/4AeywQ3XqUlmqEqJjjMNjjAtbvh0JrFON55HU4GoxEh1jCtH77usuYJIqp5zz17x5cNJJsNFGaVKh6kIteqK/Bvy7g9siMDyE8EQIYXANapFUBLWcWDhmDLz0kq0ckiqn3ImFf/gDTJwIf/yju6XWkS73RIcQ7gLWaOems2KMt7Tc5yxgIXBtBw+za4xxegihHzAihDA+xnh/B883GBgM0L9/f5qamrpaepfNmTMnk+fNK49XeTxepev33HNsATw6ciRzX3mlqs+1/tVXswHwUJ8+LMj5/x9fY+XxeJXH41W6zV97jVViLOl49Zw9m53OPZfZO+3EM8suCw16jOvx9RVilT4ODSEcB5wE7BVjfL+E+/8UmBNjvGBp9x04cGAcNWpU94ssU1NTE4MGDar58+aVx6s8Hq8y/PWvcPTRMGFCmqVeTbvuCh98AI8/Xt3nqQFfY+XxeJXH41WGr36VeXfeSe9XX136fb//ffjNb9KnYltvXf3a6lRWr68QwhMdzdurSjtHCGF/4Azgix0F6BDCiiGElVu/BvYFxlajHknqklmzYORIOOCArCuRVCSlTiycPj21chx7bEMH6HpVrZ7oi4CVSS0aY0IIfwIIIawVQrij5T79gQdDCE8BjwG3xxjvrFI9koqkVkvcjRgBzc2GaEmVVeq8jgsvhAUL4Cc/qW496pKqrBMdY9y4g+unAwe2fP0CsE01nl+SKuLf/4a+fWHHHbOuRFLRLG0Q4N134U9/gsMOS6tyqO64Y6Gk/KrmSHRzM9x5Z1rabpllqvc8khpPKatzXHopvPNO6olWXTJES8qfWixxN2ZM2hnMVg5Jlba0c9iiRfD738Oee8KnPlWbmlQ2Q7QkteffLcvb77dftnVIajzDh6f16U85JetK1AlDtKT8qcXEwmHDYPvtoX//6j2HpMa0tNU5Lr8cVl8dvvjF2tWkshmiJWlJ772XlrbbZ5+sK5FURJ21c7zxBtxyS1rWbtlla1eTymaIlpRf1RqJfvDBtKzUXntV5/ElqaPz1003wcKFcMwxta1HZTNES8qfak8svOce6NUr7VYoSZXW2eocf/87bLwxbOMqwPXOEC1JS7r7bthlF1hhhawrkVREHQ0EvPEG3HsvHHFEbVYhUrcYoiXlTzUnFr71FowebSuHpNq77ba0vN3hh2ddiUpgiJaktpqaUjj/7GezrkRSUXW0OsewYbDmmrDddrWvSWUzREvKr2qMRN9zD6y4olt9S6qe9lo1Fi2CESPSLqm2cuSCIVpS/lTzDeaee2D33V1aSlJ1LTkIMHo0zJqVQrRywRAtKb8qPRL96qvw3HO2ckiqrvZW5xg+PF26Pn1uGKIl5U+1RqLvvz9dDhpUnceXJGj/HPbgg7DVVvDxj9e+HnWJIVqSWj34YOqHdlKPpFpqboZHH01Layo3DNGS8qdaS9w98EB6E+vZs7KPK0ltLbk6x6RJaXnNnXfOriaVzRAtSQDvvANPPQW77ZZ1JZKKbsl2jpEj06UhOlcM0ZLyq5Ij0Y88kh5v990r95iS1JG2569HHoFVV4XNN8+uHpXNEC0pf6oxsfCBB1Ibx047Vf6xJamtJVfnePxx+NSnoIexLE/8vyVJkEL09tuniYWSVE1tBwKam2HcOPjkJ7OrR11iiJaUP5WeWDh/Pjz2mK0ckmpv6lSYOxe22CLrSlQmQ7QkjRqVgrSTCiXVQtvVOZ57Ll0aonPHEC0pvyo1Ev3AA+nSEC2pFtq2c7SG6E98Ipta1GWGaEn5U+mJhQ8/DJttBquvXtnHlaSOtA4CjBsHa6wBffpkW4/KZoiWlF+VGImOMa3R6k5hkmql7eoczz1nK0dOGaIl5U8lR6KnTIHXX3dpO0m103ZytCE6twzRkhqbO4VJysobb8C778Imm2RdibrAEC0pfyq5xN2jj8IKK8BWW3X/sSSpFK2rc0yZkr5ff/1My1HXGKIlNbaRI2HgwLRboSTVQutAwNSp6dIQnUuGaEn51d2R6Pnz4cknbeWQVHsxLg7RAwZkWoq6xhAtKX8qNbFwzBj44AMnFUqqrdbVOaZOhVVWgdVWy7oidYEhWlLjclKhpCy0DgS88gqsvXa2tajLDNGS8qdSEwtHjoR11oG11up+TZJUrldfhTXXzLoKdZEhWlLjevRRR6El1V7r6hyvvpp2K1QuGaIl5Vd3RqJffx1efNF+aEm1Z4guBEO0pPypxMTCJ55IlwMHdv+xJKkcIdBj0SJ4/31DdI4ZoiXlV3dGokeNSpfbbVeZWiSpKwzRuWWIlpQ/lRqJ3mQTWHXV7j+WJJWj7TmsX7/s6lC3GKIlNaYnnoAddsi6CkmNqG2I7ts3uzrULYZoSfnT3SXuXn8dXn7ZEC0pe336ZF2BusgQLanxOKlQUpbajkQbonPLEC0pv7o6Eu2kQklZahuinZeRW4ZoSfnT3YmFTiqUVA9WXhl69sy6CnWRIVpS43FSoaQstQ4E2MqRa4ZoSfnTnYmFM2c6qVBStlrPYautlm0d6paqhegQwk9DCK+EEMa0/Duwg/vtH0KYEEKYHEI4s1r1SBKweFKhIVpS1hyJzrVqN+L8LsZ4QUc3hhCWAS4G9gGmAY+HEG6NMT5X5bokFUFXRqJHj06X229f2VokqVStI9HOy8i1rNs5dgQmxxhfiDF+AFwPHJRxTZLqXXcmFo4ZAxtu6JuXpOy0nsNWXDHbOtQt1Q7Rp4QQng4hXBFCaO8zi7WBl9t8P63lOkmqjqeegm22yboKSYLll8+6AnVDt9o5Qgh3AWu0c9NZwCXAz4HYcvkb4GtLPkQ7P9vu57MhhMHAYID+/fvT1NTUtaK7Yc6cOZk8b155vMrj8Spdn6efZhvgydGjeWfBgpJ/bpm5c9lt8mSm7LorUxvwWPsaK4/Hqzwer9KtP2UKGwCvzJrFJI9ZSerx9dWtEB1j3LuU+4UQLgX+1c5N04B123y/DjC9g+caAgwBGDhwYBw0aFBZtVZCU1MTWTxvXnm8yuPxKsPChQBst912sNtupf/cI49AjGxw8MFs0IDH2tdYeTxe5fF4leGhhwBYe6ONWNtjVpJ6fH1Vc3WONdt8ewgwtp27PQ5sEkLYIISwLHAkcGu1apJUEF1d4u6pp9Kl7RySsrRoUbq0nSPXqrk6x/khhG1J7RlTgBMBQghrAZfFGA+MMS4MIZwCDAOWAa6IMT5bxZokNbKnnkoTCtdfP+tKJDWyefPSpSE616oWomOMx3Rw/XTgwDbf3wHcUa06JBVYV0ait9mm+9uGS1J3zJ2bLg3RuZb1EneSVL6uhODmZnj6aVs5JGXPEF0IhmhJjeH55+G99wzRkrLXGqJ79862DnWLIVpS/nRlYmHrpMJtt618PZJUDkeiC8EQLakxPPUULLMMbLll1pVIanSG6EIwREvKr3JGoseMgc028+NTSdlrXZ3D81GuGaIl5U9XJha63bekeuFIdCEYoiUV3zvvwMsvw9ZbZ12JJBmiC8IQLSl/yp1Y+Nxz6dJ+aEn1wM1WCsEQLan4xo5Nl1ttlW0dkgQucVcQhmhJ+VPuSPSzz8IKK7jdt6T68L3vpcs118y2DnWLIVpS8T37LGyxBfTwlCepDpx6Kk333pv+uFdu+Y4iKb9KHYkeO9ZWDklSRRmiJeVPOUvczZoFr77qpEJJUkUZoiUV27PPpktDtCSpggzRkvKnnImFrswhSaoCQ7SkYnv2WVhlFVhnnawrkSQViCFaUn6VMhLdujJHV7YKlySpA4ZoSflTTiB2ZQ5JUhUYoiUV18yZ8MYbTiqUJFWcIVpS/pQ6sdCVOSRJVWKIllRcrswhSaoSQ7Sk/ClnJLpPH1hjjerXJElqKIZoScU1dmxq5XBlDklShRmiJeVXZyPRMaaRaPuhJUlVYIiWlD+ljCzPnAlvv53WiJYkqcIM0ZKKafz4dLn55tnWIUkqJEO0pPwpZWLhhAnpcrPNql+PJKnhGKIlFdP48bD88rDuullXIkkqIEO0pPzqbCR6/Pg0Ct3D05wkqfJ8d5GUP6VMLJwwwVYOSVLVGKIlFc+8efDii04qlCRVjSFaUv4sbWLh5MnpNkeiJUlVYoiWVDwubydJqjJDtKT86mgkujVEb7pp7WqRJDUUQ7Sk/FnaxMIJE9LSdiuuWJt6JEkNxxAtKb86G4m2lUOSVEWGaEn509lIdIyL14iWJKlKDNGSimXGDJgzx5FoSVJVGaIl5U9nS9y5MockqQYM0ZKKZcKEdGk7hySpigzRkvKro5HoFVeEtdeufT2SpIZhiJaUP51NLGxdmWNpy+BJktQNhmhJxTJhgq0ckqSqM0RLyp+OJhbOnQtTpxqiJUlVZ4iWVBzPP58u3e5bklRlhmhJ+bXkSPTkyely441rX4skqaH0rMaDhhBuAFo/T10NeDvGuG0795sCvAssAhbGGAdWox5JBdPRpMHWEL3RRrWrRZLUkKoSomOMX279OoTwG+CdTu7+mRjjG9WoQ1KDmTQJPvYx6NMn60okSQVXlRDdKoQQgC8Bn63m80hqMB1NLJw8GTbZpPb1SJIaTojtbVZQqQcPYQ/gtx21aYQQXgTeAiLw5xjjkE4eazAwGKB///47XH/99VWouHNz5sxhpZVWqvnz5pXHqzwer9Kt+PzzfOqEExj7s5/xxh57/Of6nY88kre33prxP/pRhtXVL19j5fF4lcfjVR6PV3myOl6f+cxnnugox3Z5JDqEcBewRjs3nRVjvKXl66OA6zp5mF1jjNNDCP2AESGE8THG+9u7Y0vAHgIwcODAOGjQoK6W3mVNTU1k8bx55fEqj8erDB/7GABbbbkltB6zefNg5kzW2HVX1vA4tsvXWHk8XuXxeJXH41WeejxeXQ7RMca9O7s9hNATOBTYoZPHmN5yOTOEcDOwI9BuiJakTr3wQmrvsJ1DklQD1Vzibm9gfIxxWns3hhBWDCGs3Po1sC8wtor1SCqatu1oLm8nSaqhaoboI1milSOEsFYI4Y6Wb/sDD4YQngIeA26PMd5ZxXokFUV7S9wZoiVJNVS11TlijF9t57rpwIEtX78AbFOt55fUYCZPTkvb9e2bdSWSpAbgjoWS8qe9Je4mTbIfWpJUM4ZoScUwebKtHJKkmjFES8qv1pHo+fPhpZcM0ZKkmjFES8qfJScWTpkCzc22c0iSasYQLSn/Jk1Kl45ES5JqxBAtKX+WnFjo8naSpBozREvKv8mTYbXV/rMduCRJ1WaIlpQ/S45ET5qURqHb24RFkqQqMERLyj+Xt5Mk1ZghWlJ+xQgLFsDUqYZoSVJNGaIl5U/bto2pU2HRIthoo+zqkSQ1HEO0pHx78cV0ueGG2dYhSWoohmhJ8Kiv9gAACOtJREFU+dN2YuELL6SvN9ggu3okSQ3HEC0p3158EXr1grXWyroSSVIDMURLyq8YU4geMACWWSbraiRJDcQQLSl/2k4sfOEFWzkkSTVniJaUby++aIiWJNWcIVpS/rSORL/zDrz5pitzSJJqzhAtKb9al7dzJFqSVGOGaEn50zoS7fJ2kqSMGKIl5VdriLadQ5JUY4ZoSfn1wguwyirQp0/WlUiSGowhWlL+tLZzzJ6dWjnaLnknSVINGKIl5ZutHJKkDBiiJeVP25FnJxVKkjJgiJaUb4ZoSVIGDNGS8s12DklSBgzRkvLHdg5JUsYM0ZLybcCArCuQJDUgQ7Sk/GkdiV5zTVh++WxrkSQ1JEO0pPyylUOSlBFDtKT8aR2JNkRLkjJiiJaUX67MIUnKiCFaUv6suiqLeveGHXfMuhJJUoMyREvKn1VX5cFbboHPfz7rSiRJDcoQLSmX4rLLZl2CJKmBGaIlSZKkMhmiJUmSpDIZoiVJkqQyGaIlSZKkMhmiJUmSpDIZoiVJkqQyGaIlSZKkMhmiJUmSpDIZoiVJkqQydStEhxCOCCE8G0JoDiEMXOK2H4YQJocQJoQQ9uvg5zcIITwaQpgUQrghhOAWZJIkSap73R2JHgscCtzf9soQwhbAkcCWwP7AH0MIy7Tz878Cfhdj3AR4C/h6N+uRJEmSqq5bITrGOC7GOKGdmw4Cro8xzo8xvghMBnZse4cQQgA+C9zYctVQ4ODu1CNJkiTVQrV6otcGXm7z/bSW69r6GPB2jHFhJ/eRJEmS6k7Ppd0hhHAXsEY7N50VY7ylox9r57rYhfu0rWMwMLjl2zkhhPZGwKttdeCNDJ43rzxe5fF4lcfjVT6PWXk8XuXxeJXH41WerI7X+h3dsNQQHWPcuwtPOA1Yt8336wDTl7jPG8BqIYSeLaPR7d2nbR1DgCFdqKViQgijYowDl35PgcerXB6v8ni8yucxK4/Hqzwer/J4vMpTj8erWu0ctwJHhhCWCyFsAGwCPNb2DjHGCNwLHN5y1XFARyPbkiRJUt3o7hJ3h4QQpgG7ALeHEIYBxBifBf4GPAfcCXwrxrio5WfuCCGs1fIQZwCnhRAmk3qkL+9OPZIkSVItLLWdozMxxpuBmzu47X+B/23n+gPbfP0CS6zaUecybSfJIY9XeTxe5fF4lc9jVh6PV3k8XuXxeJWn7o5XSF0VkiRJkkrltt+SJElSmQzRnQgh/DqEMD6E8HQI4eYQwmod3G//lu3NJ4cQzqx1nfWis23gl7jflBDCMyGEMSGEUbWssZ6Ucbx8fQEhhL4hhBEhhEktl306uN+iltfWmBDCrbWuM2tLe720TPi+oeX2R0MIA2pfZf0o4Xh9NYTwepvX1AlZ1FkvQghXhBBmhhDGdnB7CCFc2HI8nw4hbF/rGutJCcdrUAjhnTavr7NrXWM9CSGsG0K4N4QwruX98Tvt3KduXmOG6M6NALaKMW4NTAR+uOQdWrYzvxg4ANgCOKpl2/NG1O428B34TIxx23pbrqbGlnq8fH19yJnA3THGTYC7W75vz9yW19a2McYv1q687JX4evk68FaMcWPgd8Cvaltl/Sjj9+uGNq+py2paZP25Eti/k9sPIK3ItQlpb4dLalBTPbuSzo8XwANtXl/n1qCmerYQ+O8Y4yeAnYFvtfM7WTevMUN0J2KMw9vsqDiStJb1knYEJscYX4gxfgBcT9r2vOF0sg282lHi8fL1tdhBwNCWr4cCB2dYS70q5fXS9jjeCOwVQmhv86tG4O9XmWKM9wOzOrnLQcBVMRlJ2g9izdpUV39KOF5qI8Y4I8Y4uuXrd4FxfHQ367p5jRmiS/c14N/tXF/KFuf6sAgMDyE80bITpTrm62ux/jHGGZBOtEC/Du7XO4QwKoQwMoTQaEG7lNfLf+7TMkjwDmmJ0UZU6u/XYS0fG98YQli3ndu1mOes8u0SQngqhPDvEMKWWRdTL1pazbYDHl3iprp5jXVribsiCCVsax5COIv0EcO17T1EO9cVdsmTUo5XCXaNMU4PIfQDRoQQxrf8tV44FThevr6Ss8p4mPVaXl8bAveEEJ6JMT5fmQrrXimvl4Z6TS1FKcfiNuC6GOP8EMJJpFH8z1a9svzy9VWe0cD6McY5IYQDgX+S2hQaWghhJeAfwHdjjLOXvLmdH8nkNdbwIXpp25qHEI4DPg/sFdtfD7CULc4Lo4vbwC/5GNNbLmeGEG4mfaRayBBdgePl66tFCOG1EMKaMcYZLR/dzezgMVpfXy+EEJpIIxmNEqJLeb203mdaCKEnsCqN+3HzUo9XjPHNNt9eSgP3kJeooc5Z3dU2IMYY7wgh/DGEsHqM8Y0s68pSCKEXKUBfG2O8qZ271M1rzHaOToQQ9iftqvjFGOP7HdztcWCTEMIGIYRlgSNJ256rHSH8f3t3zBpFFIVh+P1QSSEWQkQre/+ACDZWCikCQoQ0GkWLCOIPsBGsUtlooaA2goKNkEK0sbawCKSwSSW2CjbaBI/FncVoXLNT7eK8T3UZduByODBnL2fm5GCSQ6M1cJb2gp3+zvz6ZR1Y6dYrwK6T/CSHk8x163ngNG1y6lBMki8747gEvB1zQDAEe8brj17LRVqPpsZbBy51X1A4BXwdtWFptyTHRu8kJDlJq8s+//uu/1cXi8fAh6q6O+ZnM5Njgz+J3sN9YI7WcgDwrqpW08aWP6qqharaTnIDeAPsA550Y88HJ8l54B5whDYGfqOqzu2MF3AUeNnFcz/wrKpeT23TUzRJvMyv36wBL5JcBT4CFwDSPg+4WlXXgBPAwyQ/aA+jtaoaTBE9Ll+S3AHeV9U67QH1NMkW7QR6eXo7nq4J43UzySKtpe8LcHlqG54BSZ4DZ4D5JJ+A28ABgKp6ALwCFoAt4BtwZTo7nQ0TxGsJuJ5kG/gOLA/4Ty20g4+LwGaSje7aLeA4zF6OObFQkiRJ6sl2DkmSJKkni2hJkiSpJ4toSZIkqSeLaEmSJKkni2hJkiSpJ4toSZIkqSeLaEmSJKkni2hJkiSpp58MhhM+DF8YRgAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# plot\n", "xd = np.linspace(-2,2,1000)\n", "plt.plot(xd,f(xd),label='function',c='red')\n", "plt.ylim((-10,10))\n", "plt.grid(True)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Why is this hard\n", "\n", "*Any function with cases is usually nasty*\n", "\n", "- kinks are non-differentiable points, trouble for Newton method \n", "- discontinuities are troubles for existence of either roots or maximum (think $ 1/x $ which illustrates both cases) \n", "- multiple local optima are troubles for non-global methods \n", "- regions where the function is completely flat will likely trigger the stopping criterion, trouble for convergence \n", "\n", "\n", "Discretization and grid search may be the only option!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Examples of having to work with hard cases\n", "\n", "- economic model may have discontinuities and/or kinks \n", "- estimation procedure may require working with piecewise flat and/or discontinuous functions \n", "- the function at hand may be costly to compute or unclear in nature (or subject of the study) \n", "- robustness checks over special parameters (categorical variables, assumptions, etc) " ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "hide-output": false, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# bounds and the number of points on the grid\n", "bounds, n = (-2,2), 10 # try 20 30 50 500\n", "plt.plot(xd,f(xd),label='function',c='red')\n", "plt.ylim((-10,10))\n", "plt.grid(True)\n", "# vizualize the grid\n", "for x in np.linspace(*bounds,n):\n", " plt.scatter(x,f(x),s=200,marker='|',c='k',linewidth=2)\n", "# solve\n", "xs = grid_search(f,bounds,ngrid=n)\n", "plt.scatter(xs,f(xs),s=500,marker='*',c='w',edgecolor='b',linewidth=2) # mark the solution with a star\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "#### Poly-algorithms\n", "\n", "- grid search is good choice for first stage of poly-algorithm\n", " - can robustly find promising region\n", " - small number of grid points for speed\n", " - accuracy not so important on first stage \n", "- more accurate algorithm starting at the best point found by grid search\n", " - with Newton sometimes referred to as *multi-starts*\n", " - hopefully, starting value already in the domain of attraction \n", "- or to start another grid search with smaller interval of search\n", " - *adaptive* grid search\n", " - pattern search (in multiple dimensions) " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "#### Further learning resources\n", "\n", "- Grid search in machine learning to tune *hyperparameters* (parameters of algorithm)\n", " [https://medium.com/fintechexplained/what-is-grid-search-c01fe886ef0a](https://medium.com/fintechexplained/what-is-grid-search-c01fe886ef0a) " ] } ], "metadata": { "celltoolbar": "Slideshow", "date": 1612589585.765229, "download_nb": false, "filename": "24_discretization.rst", "filename_with_path": "24_discretization", "kernelspec": { "display_name": "Python", "language": "python3", "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.6" }, "title": "Foundations of Computational Economics #24" }, "nbformat": 4, "nbformat_minor": 4 }