{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Algorithms and Convergence" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In simple terms, an **algorithm** can be defined as a finite sequence of unambiguous steps that must be followed in order to solve or approximate the solution to some problem. The stated procedure should be translatable into computer code through a programming language.\n", "\n", "- - -\n", "\n", "- [Types of Algorithms](#Types-of-Algorithms) \n", " - [Linear algorithms](#Linear-algorithms)\n", " - [Exponential algorithms](#Exponential-algorithms)\n", " - [Stable algorithms](#Stable-algorithms)\n", " - [Unstable algorithms](#Unstable-algorithms)\n", "- [Computing Time](#Computing Time)\n", "- [Convergence](#Convergence)\n", "\n", "- - -\n", "\n", "There several ways to classify an algorithm, however those that refer to their numerical convergence and accuracy are more interesting. Among them we have:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "%pylab inline\n", "import matplotlib.pyplot as plt" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].\n", "For more information, type 'help(pylab)'.\n" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "- - - " ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Types of Algorithms" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Linear algorithms" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "They are algorithms where errors scale as the number of performed iterations. This definition usually coincides with the scaling of the time computing." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Example 1:**\n", "\n", "Consider the recursive equation:\n", "\n", "$$ p_n = 2 p_{n-1} - p_{n-2},\\ \\ \\ \\ n = 2,3,\\cdots $$\n", "\n", "the solution to this equation for $p_n$ is given by\n", "\n", "$$ p_n = A + Bn $$\n", "\n", "for any constants $A$ and $B$.\n", "\n", "Setting the initial conditions as $p_0=1$ and $p_1 = 1/3$ (implying $A=1$ and $B=-2/3$), show that a **float32** arithmetics would lead a linear error scaling as the number of iterations $n$." ] }, { "cell_type": "code", "collapsed": false, "input": [ "#Number of iterations\n", "Niter = 10000\n", "\n", "#Double precision constants (Exact solution)\n", "A_d = 1.0\n", "B_d = -2/3.\n", "#Signle precision constants\n", "A_s = 1.0000000\n", "B_s = -0.666667\n", "\n", "#Solution to n-th term\n", "pn = lambda A, B, n: A + B*n\n", "\n", "#Arrays for storing the iterations\n", "p_d = []\n", "p_s = []\n", "narray = range(Niter)\n", "for n in narray:\n", " p_d.append( pn( A_d, B_d, n ) )\n", " p_s.append( pn( A_s, B_s, n ) )\n", "\n", "#Converting to numpy arrays\n", "p_d = np.array(p_d)\n", "p_s = np.array(p_s)\n", "\n", "#Relative error\n", "error = p_d - p_s\n", "plt.plot( narray, error, \"-\", color=\"blue\" )\n", "plt.xlabel(\"Number of iterations $n$\", fontsize=14)\n", "plt.ylabel(\"Error $p_n-\\hat{p}_n$\", fontsize=14)\n", "plt.grid(True)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "display_data", "png": "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\n5RvTy5PuAAAAAElFTkSuQmCC\n" } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Example 2:**\n", "\n", "A linear algorithm may also refer to the computing time required for performing $n$ iterations. This example evaluates the time required for evaluating the sum of $N$ random numbers as a function of how many number are going to be added. A comparison with the built-in function of python is also performed." ] }, { "cell_type": "code", "collapsed": false, "input": [ "#New library!!! \n", "#Time: this library allows to access directly to the computer time. \n", "# Useful when time calculations are required.\n", "import time as tm\n", "\n", "#Maximum number of iterations\n", "narray = 10**np.arange(1,7,0.1)\n", "\n", "#Time arrays\n", "t_u = [] #User\n", "t_p = [] #Python\n", "\n", "#Iterations\n", "for n in narray:\n", " #Generating random numbers\n", " N = np.random.random(n)\n", " #-------------------------------------------------------------------\n", " # MANUAL SUMMATION\n", " #-------------------------------------------------------------------\n", " #Starting time counter for user\n", " start = tm.clock()\n", " #Adding the numbers manually\n", " result = 0\n", " for i in xrange(int(n)):\n", " result += N[i]\n", " #Finishing time counter for user\n", " end = tm.clock()\n", " #Storing result\n", " t_u.append( end-start )\n", " \n", " #-------------------------------------------------------------------\n", " # PYTHON SUMMATION\n", " #-------------------------------------------------------------------\n", " #Starting time counter for user\n", " start = tm.clock()\n", " #Adding the numbers using python\n", " result = np.sum( N )\n", " #Finishing time counter for user\n", " end = tm.clock()\n", " #Storing result\n", " t_p.append( end-start )\n", " \n", "#Ploting\n", "plt.semilogx( narray, t_u, \"-\", color=\"red\", linewidth=2, label=\"Manual\" )\n", "plt.semilogx( narray, t_p, \"-\", color=\"blue\", linewidth=2, label=\"Python\" )\n", "plt.xlabel(\"Number of taken numbers $N$\", fontsize=14)\n", "plt.ylabel(\"Computing time [seconds]\", fontsize=14)\n", "plt.grid(True)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "display_data", "png": "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\nD3nIQx7ysPZREQ7rkgoICCDrpr7PrKwsAm857L51m+zsbAICAorty1QzhBBCOJLDpga59957SUtL\nIzMzk2vXrvHll1/St29fi2369u3LJ598AsD27dvx9fW1y/iFEEII6znsCMPT05M5c+YQExNDQUEB\n8fHxtG7dmvnz5wOQkJBAr169SElJITQ0FG9vbz766CNHhSeEEOI23HJqECGEEI4ns9UKIYTQRBcF\nIyMjgyFDhvDII484OxS7+Oabbxg6dCgDBw5k3bp1zg7Hpg4dOkRiYiKPPvoo//nPf5wdjl1cvHiR\n9u3bs3r1ameHYnNGo5HOnTuTmJjIpk2bnB2OzSmleOWVV0hKSjKPr+rJli1bSExM5LnnnqNjx463\n3V4XBaNZs2YsXLjQ2WHYTb9+/ViwYAHz5s3jyy+/dHY4NtWqVSvmzp3L4sWL+e6775wdjl1MmzaN\nxx57zNlh2IWHhwe1atXi6tWrxc561IMVK1aQk5NDtWrVdJlfp06dmDt3Ln369CEuLu622+uiYFQW\nkyZNYsSIEc4Ow+a+/fZbevfuzcCBA50dis2tW7eOsLAwGjRo4OxQ7KJz586kpKTw5ptvMmHCBGeH\nY3NHjhyhY8eOzJgxg7lz5zo7HLv54osveOKJJ267ncsWjMGDB+Pv70+bNm0s1q9du5ZWrVrRokUL\npk6d6qToKs6a/JRSjBs3jp49exIREeGMcK1i7WcXGxvLmjVr+Pjjjx0darlYk9+mTZvYvn07X3zx\nBR988IFbXENkTX6Gv+5X4evry9WrVx0ea3lYk19gYCC+vr6A6WjKHVj7/+/YsWP4+Pjg7e19+51X\n6LI/O9q8ebPatWuXuvvuu83rrl+/rpo3b64yMjLUtWvXVHh4uDpw4IA6deqUSkhIUKGhoerNN990\nYtTaWZPf7Nmz1T333KOGDRum5s2b58SotbEmN6PRqJKSktTQoUPV22+/7cSotbMmvyLJyclq9erV\nzgjXatbkt3z5cpWQkKAee+wxtWnTJidGrZ01+V26dEnFx8erkSNHqvfff9+JUWtn7b/PCRMmqJ9+\n+knTvl22YCilVEZGhkXS27ZtUzExMeblKVOmqClTpjgjNJvQc356zk0pyU/yc232ys89jrH+kpOT\nQ1BQkHk5MDCQnJwcJ0ZkW3rOT8+5geTn7iQ/bdyqYBh0fn9fPeen59xA8nN3kp82blUwtExg6M70\n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\n" } ], "prompt_number": 3 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Exponential algorithms" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This type of algorithms scales as an exponential factor of the number of iterations. These algorithms are usually unstable, where a small perturbation leads to a exponential growth after a few iterations." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Example 3:**\n", "\n", "Consider the recursive equation:\n", "\n", "$$ p_n = \\frac{10}{3}p_{n-1} - p_{n-2},\\ \\ \\ \\ n = 2,3,\\cdots $$\n", "\n", "the solution to this equation for $p_n$ is given by\n", "\n", "$$ p_n = A\\left( \\frac{1}{3} \\right)^n + B\\ 3^n $$\n", "\n", "for any constants $A$ and $B$.\n", "\n", "Setting the initial conditions as $p_0=1$ and $p_1 = 1/3$ (implying $A=1$ and $B=0$), show that a **float32** arithmetics would lead an error scaling as the exponential of the number of iterations $n$." ] }, { "cell_type": "code", "collapsed": false, "input": [ "#Number of iterations\n", "Niter = 100\n", "\n", "#Double precision constants (Exact solution)\n", "A_d = 1.0\n", "B_d = 0.\n", "\n", "#Solution to n-th term\n", "pn = lambda A, B, n: A*(3.0)**-n + B*(3.0)**n\n", "\n", "#Arrays for storing the iterations\n", "p_s = [1.000000,0.333333]\n", "p_d = [1.,1/3.]\n", "\n", "narray = range(Niter)\n", "for n in narray[2:]:\n", " p_s.append( 10/3.*p_s[n-1]-p_s[n-2] )\n", " p_d.append( pn( A_d, B_d, n ) )\n", "\n", "#Converting to numpy arrays\n", "p_d = np.array(p_d)\n", "p_s = np.array(p_s)\n", "\n", "#Relative error\n", "error = p_d - p_s\n", "plt.semilogy( narray, error, \"-\", color=\"blue\" )\n", "plt.xlabel(\"Number of iterations $n$\", fontsize=14)\n", "plt.ylabel(\"Error $p_n-\\hat{p}_n$\", fontsize=14)\n", "plt.grid(True)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "display_data", "png": "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\nf4YpLrboRJnbZcyu4vz583To0IEnnniC+vXrM3fuXACuXbuGv78/devW5ZlnnnGpyy4zMjJo3Lgx\nAQEBgOvm4vr167z44os8/vjj+Pj4EBsb67K5CAsL44knnqBBgwb07t2b27dvu0wucrv9417vPSws\njDp16vDYY4/xzTff3P8EipNKT09XatWqpSQmJiqpqalKo0aNlISEBL3Dsptff/1V+e677xRFUZS/\n/vpLqVu3rpKQkKCMGzdOmTFjhqIoijJ9+nRlwoQJeoZpVx9++KHSu3dvJSAgQFEUxWVz0a9fP2XZ\nsmWKoihKWlqacv36dZfMRWJiolKzZk0lJSVFURRFefnll5WVK1e6TC727t2rHDt2TKlfv75lX17v\n/YcfflAaNWqkpKamKomJiUqtWrWUjIyMex7faYvLgQMHlM6dO1u2w8LClLCwMB0j0lePHj2UnTt3\nKvXq1VMuXbqkKIpagOrVq6dzZPZx/vx5pVOnTsru3buVbt26KYqiuGQurl+/rtSsWfOu/a6Yi6tX\nryp169ZVrl27pqSlpSndunVTvvnmG5fKRWJiYrbiktd7f//995Xp06dbXte5c2fl4MGD9zy2YabF\ntJbbZcwXLlzQMSL9JCUl8d1339GyZUt+++03PD09AfD09OS3337TOTr7GDNmDDNnzsTtjhudXDEX\niYmJVKhQgaCgIJo0acKQIUP4+++/XTIXHh4ejB07lmrVquHl5UXZsmXx9/d3yVxkyeu9X7x4MdvF\nVPn5PnXa4iL3tahu3rxJz549mTNnDqVz9Go2mUwukaevv/6aihUr0rhx4zwvS3eVXKSnp3Ps2DFG\njBjBsWPHcHd3Z/r06dle4yq5OHv2LLNnzyYpKYmLFy9y8+ZN1qxZk+01rpKL3Nzvvd8vL05bXOQy\nZkhLS6Nnz5707duX559/HlB/G7l06RIAv/76KxUrVtQzRLs4cOAAX331FTVr1qRXr17s3r2bvn37\numQuvL298fb2pnnz5gC8+OKLHDt2jEqVKrlcLr799lvatGlDuXLlKF68OP/3f//HwYMHXTIXWfL6\nN5Hz+/SXX36hSpUq9zyW0xYXV7+MWVEUBg0ahI+PDyEhIZb93bt3t9x9vGrVKkvRcWbvv/8+58+f\nJzExkXXr1tGxY0dWr17tkrmoVKkSVatW5fTp0wBERUXxxBNPEBAQ4HK5eOyxxzh06BD//PMPiqIQ\nFRWFj4+PS+YiS17/Jrp37866detITU0lMTGRM2fO0KJFi3sfTOsFIiPZtm2bUrduXaVWrVrK+++/\nr3c4drVv3z7FZDIpjRo1Unx9fRVfX19l+/btytWrV5VOnTopderUUfz9/ZU//vhD71Dtymw2W64W\nc9VcxMXFKc2aNVMaNmyovPDCC8r169ddNhczZsxQfHx8lPr16yv9+vVTUlNTXSYXgYGBSuXKlZUS\nJUoo3t7eyvLly+/53t977z2lVq1aSr169ZTIyMj7Ht8l2hwLIYSwL6edFhNCCKEfKS5CCCE0J8VF\nCCGE5qS4CCGE0JwUFyGEEJqT4iKEEEJzUlyEU2jfvj2jRo3SO4xsMjMzGTZsGOXLl8fNzY29e/fe\n9ZoBAwZYWgAYiVHjEo5DiovQxIABA3Bzc+Pdd9/Ntt9sNuPm5sa1a9dsen4jPgNq27ZtrFy5kq1b\nt3Lp0iVat25912vmzZvH2rVrLdv2LpJ5nS9nXEIUlBQXoQmTycR//vMfZs6cyZUrV/QORzOpqamF\n/tmffvqJypUr07JlSypWrEiJEiXuek3p0qV5+OGHixJirooSN9guLuE6pLgIzXTo0IEaNWrwzjvv\n5Pma3H5TzjkF0759e0aMGMHYsWMpV64cFStWZO7cuaSkpDB8+HDKli1L9erVCQ8Pz3actLQ0Ro8e\njYeHBx4eHowfP/6upyB/8MEH1K5dm4ceeoiGDRve9dt51rlDQ0OpWLEifn5+ub6P27dvExISQqVK\nlXjwwQdp3bo1+/fvz/aeXnvtNZKTk3Fzc+PRRx/N9Th3vvcBAwawd+9ePvnkE9zc3HBzcyM5ORlQ\nnxV3r9jzijsyMhI/Pz88PDwoV64cXbp04dSpU/c9X86/k/u93/bt2/P//t//44033qBChQp4enoy\nbty4bPnfu3cvrVq1onTp0pQtW5aWLVvyww8/5JoX4fikuAhNKIqCm5sb06dPZ+HChZw7dy7X1+U2\nfZXbvrVr11KmTBkOHz7MxIkTCQkJoUePHjzxxBMcO3aM/v37M3DgQH7//XfL+bO+bA8dOsSiRYtY\nvHgxs2fPthxz0qRJrFixgk8//ZSTJ0/y+uuvM2zYMLZt25bt3GvWrMFkMhETE8P//ve/XN/H+PHj\n2bBhAytWrCAuLo4GDRrQpUsXyxNl586dy1tvvYW3tzeXLl3iyJEj983H3Llzad26NQMHDuTSpUtc\nunTJ8iTvN998876x5xb3rVu3eO211zhy5AjR0dGUKVOGgIAA0tPT73m+nH8n93u/WX9nJUuW5ODB\ng8yfP5/Zs2ezfv16QH3Uf48ePXjqqac4ceIEhw8fZsyYMRQrVizXvAgnYJMnogmX079/f8sDITt0\n6KAEBgYqiqIoe/bsUUwmk3L16lVFURSlffv2yqhRo+762azukIqiKO3atVPatGmT7TUVKlRQevTo\nYdlOS0tTSpYsqWzatMnyMzk7Br777ruKt7e3oiiKcvPmTeXBBx9UYmJisr1m9OjRyrPPPpvt3I0a\nNbrne71586ZSsmRJZfXq1ZZ9GRkZSq1atZQ333zTsm/mzJlKjRo17nmsnO89t/zkJ/b8xJ11rGLF\niin79+/P83w548rP+83t78zf318ZPHiwoijqQ0JNJpMSHR193xizXj9r1izl+eefV2JjY5UlS5Yo\nH330kTJ27Nh8/bzQX3G9i5twHsq/UyAzZsygdevWjBs3rlDHMZlMNGzYMNu+ihUr0qBBA8t28eLF\neeSRRywjF4BWrVpl+5lWrVoxefJkbt68ycmTJ0lJSaFz587ZfiNPS0ujZs2a2c7dtGnTe8Z39uxZ\n0tLSePLJJy373NzcaN26NQkJCQV7s/mQkJCQr9hzi/vs2bNMnjyZw4cPc/nyZTIzM8nMzCQ5OZk2\nbdrk6/z3er8nT5607Mv5d1a5cmXL34+HhwcDBgygc+fOdOrUiU6dOvHiiy9m6xZ7py+++ILRo0ez\ndOlSzp07x+DBg7lx4wZVqlRh1qxZ+Ypb6EuKi9Bc8+bN6dmzJ+PHj2fy5MnZ/j83N7e71kHS0tLu\nOkbOxW+TyZTrvszMTMt2zuPeKet1X3/9NdWqVbvnudzd3fM8zr0o/04Nai0/sZtMplzj7tatG9Wq\nVWPx4sVUqVKFYsWK4ePjU+QFf1Df753F7n5/P8uXLyckJITIyEi++uorJk2axJdffskzzzxz17Ff\neuklrly5wt9//01gYCAAR48excfHp8hxC/uQNRdhE++//z779u0jMjIy2/4KFSpw8eLFbPuOHz+u\nyWXEsbGx2bYPHTpElSpVKFWqFD4+PjzwwAMkJSXx6KOPZvuT12/PealVqxYlS5YkJibGsi8jI4OD\nBw8W+cuvZMmSpKenZ9tX2NivXr3Kjz/+yBtvvEHHjh2pV68eN27cyHb83M6XU37eb15/fzn3N2zY\nkPHjx7Nnzx7at29vaUyV08MPP0xUVBSdOnWy7Nu4cSO9evXixo0b94xXGIOMXIRN1KpVi6FDh2Zb\nUAfo2LEjISEhbNmyhbp167Jo0SJ++eWXbNM7iqLcNQq516gky8WLFwkJCSE4OJj4+HhmzZplGTmV\nLl2a0NBQQkNDURQFPz8/bt68yaFDhyhWrBhDhgzJ89w5ubu7ExwczIQJEyhfvjw1atTg448/5vLl\ny4wYMSJf+clLjRo1OHz4MD///DPu7u6UK1cuX7HnFvcjjzxC+fLlLaOWCxcuMG7cOIoXL37P8+Us\nCPl5v3nlLWtfYmIiixYtokePHnh5eXHu3DlOnDhxz3xFRUXx9NNPW46zceNG4uPjWbx4MaGhoYVL\nsLAbKS5CE7ld8fXWW2+xatWqbFMwAwcO5MSJEwwcOBCAkSNH8sILL3D16tV7Hut+IxuTyUSfPn3I\nyMigVatWmEwmBg8ezJgxYyyveeedd/D09GTWrFkEBwfz8MMP07hxY8aPH3/Pc+dmxowZAAQFBXH9\n+nWaNGlCZGQknp6eBTpWzteEhobSv39/fHx8SElJITExkWrVqt039tzO5ebmxvr163n11Vdp0KAB\nderUYdasWfTs2fO+58t5vPu93/tdBeju7s6ZM2cs012enp706dOHCRMm5Jmbn376yXJek8lE27Zt\n2bp1a56XhwtjkU6UQgghNCdrLkIIITQnxUUIIYTmpLgIIYTQnBQXIYQQmpPiIoQQQnNSXIQQQmhO\niosQQgjNSXERQgihuf8PSz9iFUGvLXEAAAAASUVORK5CYII=\n" } ], "prompt_number": 21 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Stable algorithms" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These algorithms exhibit a small change when an initial perturbation to the initial conditions is introduced. Linear algorithms can be catalogued within this category." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Unstable algorithms" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Unlike stable algorithms, unstable algorithms produce a large change when iterating with respect to a small perturbation in the initial conditions. Exponential algorithms fit in this category. \n", "\n", "At first glance, unstable algorithms may seem undesirable, however there are some useful applications for them. Among the more interesting ones is the generation of random numbers in a computer. [Pseudorandom number generator](http://en.wikipedia.org/wiki/Pseudorandom_number_generator)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- - - " ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Computing Time" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One of the most important skills a programmer must develop is to evaluate the computing time of certain process as well as the consumed memory. When computational resources are limited (as always happens!), estimating beforehand the computing time of an algorithm is certainly important." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Example 4:**\n", "\n", "An interesting example that illustrates very well the issue of computing time is the N-body problem.\n", "\n", "Consider a set of $N$ masses $\\{m_i\\}$. The total gravitational potential energy of the $i$-th particle due to the other ones is given by\n", "\n", "$$E_i = -G\\sum_{j=1, j\\neq i}^N \\frac{m_i m_j}{|\\vec{r}_i-\\vec{r}_j|}$$\n", "\n", "Now, if we want to calculate the total energy of the system, it is necessary to add each contribution, i.e.\n", "\n", "$$E_{tot} = \\sum_{i=1}^N E_i = \\sum_{i=1}^N \\left( -G\\sum_{j=1, j\\neq i}^N \\frac{m_i m_j}{|\\vec{r}_i-\\vec{r}_j|} \\right) $$\n", "\n", "This implies if we want to calculate $E_{tot}$ in a computer, it is required $N(N-1)\\approx N^2$ iterations, so the computing time scales as $\\mathcal{O}(N^2)$. An estimation of the total time is then reached by first measuring the required time for 1 iteration, i.e., the energy of the $i$-th particle due to the $j$-th particle, and then multiplying the result by $N^2$.\n", "\n", "The large computing time of this type of algorithms (when $N$ becomes large enough) has propelled a large enterprise of more efficient algorithms, including tree-codes where the computing time is reduced to $\\mathcal{O}(N \\log N)$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "N = np.arange(1,1e3,0.1)\n", "plt.loglog( N, N**2, linewidth=2, label=\"$N^2$\" )\n", "plt.loglog( N, N*np.log(N), linewidth=2, label=\"$N\\ \\log N$\" )\n", "plt.legend( loc=\"upper left\" )\n", "plt.grid(True)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "display_data", "png": "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\n4rFoF9lFGekAAAAASUVORK5CYII=\n" } ], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "- - - " ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Convergence" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The last concept related to algorithms is convergence. This refers to how fast an algorithm can reach a desired result with some given precision. Some rigorous techniques can be used to quantify the convergence degree, however it is commonly a more useful approach to compare the convergence of an algorithm with other already known." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "**ACTIVITY**\n", "\n", "In a IPython notebook and using the codes of the first task, make a figure where is compared the values obtained for the two methods for calculating $\\pi$ as a function of the number of performed iterations. Which method reaches a faster convergence?\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- - - " ] } ], "metadata": {} } ] }