{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Today at work, I found myself facing an interesting problem. To compute an integral in the complex plane, I wanted to discretize the profile of a square in a regular way. Given that a circle is very easy to discretize using the roots of unity, I started searching for something analogous but for squares. It turns out this exists, and this notebook is about playing with this idea.\n", "\n", "In the following sections, I'll first show how the discretization of the unit circle works in the complex plane. I'll then derive the analogous discretization for a unit square. Finally, I'll extend this to rectangles not centered on the origin of the plane." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Discretization of the unit circle using the roots of unity" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using complex numbers, the exponential roots of unity allow us to replace a circle by points on the circle. This is demonstrated using the following function:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from cmath import exp, pi\n", "\n", "def make_unit_disk(N):\n", " \"Returns N complex numbers on the unit circle (roots of unity).\"\n", " return [exp(2j * pi * i / N) for i in range(N)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can plot our approximation using a function that accepts any list of complex numbers." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "plt.style.use('bmh')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def plot_complex(points, *args, **kwargs):\n", " \"Plots each point in the argument list.\"\n", " for p in points:\n", " plt.plot(p.real, p.imag, *args, **kwargs)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(-1.1, 1.1)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n/6JqozEAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(7, 7))\n", "roots = make_unit_disk(16)\n", "plot_complex(roots, 'ko')\n", "plt.xlim(-1.1, 1.1)\n", "plt.ylim(-1.1, 1.1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Discretizing the unit square " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The above formula works nicely with circles and can be extended to any number of points. However, what if we want a square contour? We can use the roots of unity and then transform them until the end up on the unit square, as suggested by the next figure:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(-1.1, 1.1)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(7, 7))\n", "roots = make_unit_disk(17)\n", "plot_complex(roots, 'ko')\n", "plt.plot([1, -1, -1, 1, 1], [1, 1, -1, -1, 1])\n", "plt.xlim(-1.1, 1.1)\n", "plt.ylim(-1.1, 1.1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How do we do this? Quite simply by remarking that our square can be divided using four quadrants for which simple formulas apply:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(-1.1, 1.1)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(7, 7))\n", "roots = make_unit_disk(17)\n", "plot_complex(roots, 'ko')\n", "plt.plot([1, -1, -1, 1, 1], [1, 1, -1, -1, 1])\n", "plt.plot([1, -1], [1, -1], 'k')\n", "plt.plot([-1, 1], [1, -1], 'k')\n", "plt.xlim(-1.1, 1.1)\n", "plt.ylim(-1.1, 1.1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's code a function that does this:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from math import copysign\n", "sign = lambda x: copysign(1, x)\n", "\n", "def make_unit_square(N):\n", " \"Returns N complex numbers on the unit square using the roots of unity.\"\n", " roots = make_unit_disk(N)\n", " square = []\n", " for p in roots:\n", " u, v = p.real, p.imag\n", " if u**2 >= v**2:\n", " x = sign(u)\n", " y = v/u * sign(u)\n", " else:\n", " y = sign(v)\n", " x = u/v * sign(v)\n", " square.append(x + 1j * y)\n", " return square" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's test this:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-1.0" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sign(-1)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-1.0" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sign(-2)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(-1.1, 1.1)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbEAAAGiCAYAAABpkviEAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3W2QXNdd5/HfyYqAo2AVD46bzUhNBycWEK2MV/HGZlBU\npSKRs3gshi5Q7ADWLmmXdvPOlcKeqyryItdxSuUtFrKrZKKUEwqnBDXbGImHrEOI2Z2SCKaFjIby\nOE5t+2omSXupeG0lciBWOPtiujU9mn6Y6b7nPpz7/VS5PH3VOvfo37f/Z+4595xjrLUCACCPXpd2\nBQAAGBWNGAAgt2jEAAC5RSMGAMgtGjEAQG5tSbsC1/riF7849uOS58+f1y233BJHddAHMXaPGLtH\njN2KM7779+83vY5nrhGTpFtvvXWsv//kk0+OXQYGI8buEWP3iLFbccX33Llzff/My+7Eixcvpl0F\n7xFj94ixe8TYrSTi62UjBgAoBi8bsXvuuSftKniPGLtHjN0jxm4lEV+TtWWnvvjFL1r6qAEAHefO\nnev7YIeXd2Lz8/NpV8F7xNg9YuweMXYrifh62YgBAIqB7kQAQKYVrjsRAFAMXjZi9HO7R4zdI8bu\nEWO3GBMDAGAAxsQAAJnGmBgAwEuxNGLGmE8bY140xvz9gPf8jjHmeWPMeWOM02Wj6ed2jxi7R4zd\nI8Zu5WlM7DFJ7+n3h8aYOyX9hLX2rZLul/SJmM67RhRFqtVqmpmZUa1WUxRFLk4z9PxTU1POz+/6\nXC7Kj7vMOMuLo6y46nPmzFnt3l3VoUMPa/fuqs6cOZtaXbIWYxdlJVFuUuWnda5+504iF8c2JmaM\nKUs6ba39Nz3+7BOSvmSt/YP262cl7bPWvnjte0cdE4uiSNPT02o2m1ePVSoV1et1lcvlTZeX5fO7\nPpeL8uMuM87y4igriiLdddeUlpe/X1JJUksTE/+s06dPbao+Z86c1cGDj+nKlc9I2irpsrZsuU9P\nPHFYd9xxe6J1yVqMXZSVRLlJlZ/WuZI4dxbGxN4saanr9dfax2IThuGaoElSs9lUGIZxniYT53d9\nLhflx11mnOXFUdZDDwVaXr5V0nlJ/1vSeS0v36qHHgo2VZcjRx7tasAkaauuXPmMjhx5NPG6ZC3G\nLspKotykyk/rXGmfO3ObYs7NzenEiRPasWOHJGnbtm3atWuXJicnJa32sV77utVq9SxvcXFR8/Pz\nQ//+uK+TPP/i4mLPc7VarcTK7/ydtOITZ3mr/96bJP2ApJckfX1T8Ww0Xpb0pKSn22Xtk/S4zp79\nd5uqzze/+Wq7jH2Snrr677p06boN/3vOno0kfVkrDWGnjMfVaLx7U9fDaoz/taS3SGpJ+uqa6yPd\nz2utUa7/48ePX80vg+q42X/v4Hi6Kb/7dZr5MI7Pp/NzZz+yPXv2aP/+/T3LTas7cVHSu+LsTqzV\napqbm1t3vFqtanZ2dtPlZfn8rs+1kfK7vwhxlRl3HTfqnnver89//vskPa5OF550rw4ceE2f+9zv\nb6iMm2/+Df3jP/6PdcdvuOGX9NxzJzZcl927q1paOqXVBmifpMvavn1Kzzyz/t/rsi5xxKUjzs8r\nzrK6r+MsfK/ikmY+dHHupLoTTfu/Xk5J+jVJMsa8U9LLvRqwcQRBoEqlsuZYpVJREGyuCyUP53d9\nro2Uv5kGbKNlplWeMTdpNVGr/f/H28c3Zs+eCa0k+W6X28c37vjxB7Rly33tsvapMyZ2/PgDidcl\njrh0xPl5xVlW93Wche9VXNLMh0mfO5Y7MWPM57TyjfsRSS9K+i1Jr5dkrbWz7fd8XNIBrXy7Dltr\nz/Uqa5zJzlEUKQxDtVotlUolBUGQyEMdaZzf9blclB93mXGVNzV1TPPzD687Pjk5o1OnPrTBuizp\nrrs+peXlR9S5a5mYeFCnT39A5fL2TdXnzJmzOnLkUV26dJ2uv/47On78gQ0/1BFnXeKIy9p6xff5\nu7r+8/i9ysK5XJ970J2Ylyt2bLarC5vnU4xrtWOamwu0eschSZdVrYaand14so6iJYXhSbVaUqkk\nBcGhTTdg3caJcRx1iSsuWebTdZxFccV3UCOWuQc7gM0aN2EHwSE1GkfVbH5EnTuXSuWoguDwpupR\nLm/PTHKPoy5xxCXuhh24lpd3YiiOKFrS9PRj6xJtvX54U8mSZNvbOHGJ67MBCtediOIoQpdXXvHZ\nIC5ZmOycKNZDcy8rMV6ZDrP1mqNb1WeaTK5kJcajysNnk/cYZ12e1k4EUlEqSb0eJ185jjTx2SAJ\ndCcidYy7+InxSsSFpxORWb0SXaOx8URXLm9XvX64PSelk+RowLIgjs9m3OsD/vPyToy5H+7FFWMG\n//vjOnZ/fRBjt5KYJ8aYGFKVh8F/pIfrA8N42Yjxm5V7ccWYwf/+uI7dXx/E2K0k4utlI4b8CIJD\n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\n3KIRAwDk1v8Hi9BmrNorbbsAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(7, 7))\n", "square = make_unit_square(64)\n", "plot_complex(square, 'ko')\n", "roots = make_unit_disk(64)\n", "plot_complex(roots, 'bo')\n", "plt.xlim(-1.1, 1.1)\n", "plt.ylim(-1.1, 1.1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can add some fancy lines to emphasize where each point came from." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(-1.1, 1.1)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(7, 7))\n", "square = make_unit_square(64)\n", "plot_complex(square, 'ko')\n", "roots = make_unit_disk(64)\n", "plot_complex(roots, 'bo')\n", "for a, b in zip(roots, square):\n", " plt.plot([a.real, b.real], [a.imag, b.imag], 'r--')\n", "plt.xlim(-1.1, 1.1)\n", "plt.ylim(-1.1, 1.1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This works the way we want it to be. What about the case when we want to extend this construction to rectangles?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Rectangles " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the case of rectangles, the easy solution is to switch to a different coordinate system. We still assume that we're centered on the origin of the complex plane. By multiplying by constants, we can scale each axis indepently, namely by width and height. The idea is thus:\n", "\n", "- take an input rectangle\n", "- reshape it to be a unit square and compute the scaling factors\n", "- approximate the unit square with the given number of points\n", "- scale the points to obtain the input rectangle" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def make_rectangle(width, height, N):\n", " \"Approximates rectangle of given height and width using N points in total.\"\n", " square = make_unit_square(N)\n", " f_x = width / 2.\n", " f_y = height / 2.\n", " return [p.real * f_x + 1j * p.imag * f_y for p in square]" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(-2.1, 2.1)" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(7, 7))\n", "rect = make_rectangle(2, 3, 64)\n", "plot_complex(rect, 'ko')\n", "plt.xlim(-2.1, 2.1)\n", "plt.ylim(-2.1, 2.1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As can be seen in the picture above, we obtain a rectangle that's 2 by 3." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Shifted rectangles " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What about if we want to shif the rectangle to an arbitrary position? Easy! In the complex plane, it's just like a vector addition: simply add an offset to each point." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def make_shifted_rectangle(width, height, origin, N):\n", " \"\"\"Approximates rectangle of given height and width using N points in total.\n", " The rectangle is centered at the given origin (complex number).\"\"\"\n", " rect = make_rectangle(width, height, N)\n", " return [p + origin for p in rect]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's test this:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(-2.1, 2.1)" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAacAAAGiCAYAAABDIgkrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X+IHOl95/HPI4uAPWa1rA+lF1vTbnF36cOj82KsJbaH\nYbDIWXewymboP2QvCauDa1BikiPLrjmV4GRQ/bPLwvkue+ImStY4Qcwfc43jBBzWt0GHGyk5Mcpi\njeNxzNGUJmE7f4hbL541wXLq/ujpmemRRts/nv7WU1XvF5hx1TxP9bNffXue7uepeh6XpqkAAAjJ\noawbAADAfnROAIDg0DkBAIJD5wQACA6dEwAgOIetXujNN99839sC33rrLT311FMWzcE2Ym6PmNsj\n5vZGifmpU6fc/nNmnZMkfepTn3rk79944433LQO/iLk9Ym6PmNsbNua3b99+6PmghvXu3r2bdRNK\nh5jbI+b2iLm9SWMeVOcEAIAUWOf0pS99KesmlA4xt0fM7RFze5PG3E26fJFz7mOSviHpFyX9k6Tf\nT9P0v+4v9+abb6aM+QIA9rp9+/ZDb4jw8c3pvqTfTdP0E5I+I+m3nHP1cS7Ubrc9NAejIOb2iLk9\nYm5v0phPfLdemqZdSd3t//8T59wPJH1U0sak1waKJEk2Fccr2thIVK/fVBSdVbV6bKxrdLtSpaKh\nrzFOvVHqDFvWZ7lRyjwq5tZtmnbZccr7qru3/iR5LnkY1hu4mHMfl3Rd0lyapj/Z+zuG9VBmSbKp\npaXX1elcljQjaUu12kW1WudG+qMxzjXGqTdKnWHL+ixnWcb3taZZdtx/bx91x60/zWE9SZJz7sOS\nViX9zv6OCSi7OF7Z84aVpBl1OpcVxytTv8Y49UapM2xZn+Usy/i+1jTLjlPeV10f9ffy8hCuc+6w\neh3TH6Vp+icPK7O6uqqrV69qdnZWknTkyBGdOHFC8/Pzknrjk3fu3NH58+d3jiUN/J5j/8f9c6G0\np6jHGxuJpFuSFtUbXOjpdjX09XrX6L/p+9dYVLf76Pq917i1U77n1vb1Hv76g+3dfb2HtXfY6w/b\n/mGuN0z7Bl/vv0h66oHX65WfGWiPNKONjUTtdnukeIzy7zON+I5bfu/xsPEYrv5bkv7jA/Xb7bau\nXbsmSZqdndXRo0d16tQp7edrhYg/lPQ3aZp+7aACjUbjkU8L9/8jObY93p9kWbenqMf1elXr6yf3\nnFmUtKVK5Y2hr1ev39T6+pZ6b/7F7d9sqVJ5dP1KRZJOavcPZ++4Xn/DS3uHvf6w7R/mesO0b/D1\nntpTZvf1vvGNm5K29rSn16Z6vTrQptFf7+D/vmGvN0o8Jv33HjUek9Sfn58fqD+1FSKcc5+T9Jyk\nzzvn/to5d9s5d3qca+3/D8b0EXMbUXRWtdpF7b5xe2PxUXR2zGto6GuMU2+UOsOW9Vlu9DKLY1/H\nZ5umXXac8r7qPlh/ceT6e3m9IeJRuCECZTfpXVCTXKPsd+v5uMOOu/WGM2r9g26ICKpz2jumCRvE\n3B4xt0fM7Q0b86nfrQcAgC9BfXMCAJQL35wAALkRVOfE+lf2iLk9Ym6PmNubNOZBdU4AAEjMOQEA\nMsScEwAgN4LqnBgXtkfM7RFze8TcHnNOAIDCYc4JAJAZ5pwAALkRVOfEuLA9Ym6PmNsj5vaYcwIA\nFA5zTgCAzDDnBADIjaA6J8aF7RFze8TcHjG3x5wTAKBwmHMCjPjYph0Ina9t2g9PtZUAJPXesEtL\nr6vTuSxpRtKW1tYuqtU6RweFwvCZ50EN6zEubI+Y24jjlT1v2OuSZtTpXFYcr2TbsJIgz234zPOg\nOiegqLpdqfeG3Wtm+zxQDD7zPKjOaX5+PusmlA4xt1GpSNLW9tHi9s+t7fOYNvLchs88D6pzAooq\nis6qVruo3Tfulmq1i4qis1k2C/DKZ54H1TkxLmyPmNuoVo+p1TqnRiPW3NxzajRiboYwRJ7b8Jnn\n3K0HGKlWj2l5+UW1222GmVBYvvKc55wAAJlhbT0AQG4E1TkxLmyPmNsj5vaIuT3W1gMAFA5zTgCA\nzDDnBADIjaA6J8aF7RFze8TcHjG3x5wTAKBwmHMCAGSGOScAQG4E1TkxLmyPmNsj5vaIuT3mnAAA\nhcOcEwAgM8w5YUCSJGo2mzpz5oyazaaSJDG7xjj1RqkzbFmf5YYpc+PGTX3ykw19/OO/oU9+sqEb\nN25m3qZplx2nvK+6PupjdEmyqWbzFZ0584qazVeUJJtjXSeob05sJWAjSRItLS2p0+nsnKvVamq1\nWqpWq1O9xjj1RqkzbFmf5YYpc+PGTT377Ou6f//rkm5JOqnDh5/XN795Tp/97GcyadM04ztueV91\nfdTH6JJkU0tLr6vTuax+ntdqFx+5pxPfnLAjjuOBN6wkdTodxXE89WuMU2+UOsOW9VlumDLnz7+6\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(7, 7))\n", "rect = make_rectangle(2, 3, 64)\n", "plot_complex(rect, 'ko')\n", "shifted_rect = make_shifted_rectangle(2, 3, 1 + 0.5j, 64)\n", "plot_complex(shifted_rect, 'bo')\n", "plt.xlim(-2.1, 2.1)\n", "plt.ylim(-2.1, 2.1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Conclusions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this post, we've seen how to discretize an arbitrary rectangle using a nonlinear mapping method based on the roots of unity. There are many other mapping methods that can accomplish this task, but we've focused on this one as it is really simple to implement. Observing the last image one sees that due to the starting points on the disk, the corners of the rectangle are less densely filled with points compared to the midpoints of the edges. Depending on what you need this discretization for, this may be a problem. \n", "\n", "If you're interested other mappings of disks to squares (and reverse mappings also), you can check out this very interesting [review of analytical methods for squaring the disc by Chamberlain Fong](http://arxiv.org/abs/1509.06344)." ] } ], "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.5.1" } }, "nbformat": 4, "nbformat_minor": 0 }