From d5edc036eb3885a6c45eed1a525e913460cc9ab8 Mon Sep 17 00:00:00 2001 From: MichaelRipa <51883134+MichaelRipa@users.noreply.github.com> Date: Tue, 20 Jul 2021 10:50:59 -0400 Subject: [PATCH 01/34] Create .gitkeep --- content/tutorial-plotting-fractals/.gitkeep | 1 + 1 file changed, 1 insertion(+) create mode 100644 content/tutorial-plotting-fractals/.gitkeep diff --git a/content/tutorial-plotting-fractals/.gitkeep b/content/tutorial-plotting-fractals/.gitkeep new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/content/tutorial-plotting-fractals/.gitkeep @@ -0,0 +1 @@ + From cfca15ad15e371164288cfdf1454e52e85dff4a5 Mon Sep 17 00:00:00 2001 From: MichaelRipa <51883134+MichaelRipa@users.noreply.github.com> Date: Tue, 20 Jul 2021 10:52:07 -0400 Subject: [PATCH 02/34] Image used in beginning of tutorial --- content/tutorial-plotting-fractals/fractal.png | Bin 0 -> 281997 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/tutorial-plotting-fractals/fractal.png diff --git a/content/tutorial-plotting-fractals/fractal.png b/content/tutorial-plotting-fractals/fractal.png new file mode 100644 index 0000000000000000000000000000000000000000..5639e35ec9f2b78639f07f12fb840f1940866cd7 GIT binary patch literal 281997 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

t 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 KRjIUb@c#pgBKD>L literal 0 HcmV?d00001 From 11ff9bdbe2df41df7f518d5c694eb90df4efc667 Mon Sep 17 00:00:00 2001 From: MichaelRipa <51883134+MichaelRipa@users.noreply.github.com> Date: Tue, 20 Jul 2021 10:52:35 -0400 Subject: [PATCH 03/34] New content --- content/Plotting Fractals .ipynb | 985 +++++++++++++++++++++++++++++++ 1 file changed, 985 insertions(+) create mode 100644 content/Plotting Fractals .ipynb diff --git a/content/Plotting Fractals .ipynb b/content/Plotting Fractals .ipynb new file mode 100644 index 00000000..f8e06827 --- /dev/null +++ b/content/Plotting Fractals .ipynb @@ -0,0 +1,985 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f2f2467c", + "metadata": {}, + "source": [ + "# Plotting Fractals" + ] + }, + { + "cell_type": "markdown", + "id": "6b634e68", + "metadata": {}, + "source": [ + "\"Fractal" + ] + }, + { + "cell_type": "markdown", + "id": "8c9a5248", + "metadata": {}, + "source": [ + "Fractals are beautiful, compelling mathematical forms that can be oftentimes created from a relatively simple set of instructions. In nature they can be found in various places, such as coastlines, seashells, and ferns, and even were used in creating certain types of antennas. The mathematical idea of fractals was known for quite some time, but they really began to be truly appreciated in the 1970's as advancements in computer graphics and some accidental discoveries lead researchers like Mandelbrot to stumble upon the truly mystifying visualizations that fractals possess. \n", + "\n", + "Today we will learn how to plot these beautiful visualizations and will start to do a bit of exploring for ourselves as we gain familiarity of the mathematics behind fractals and will use the ever powerful NumPy universal functions to perform the necessary calculations efficiently. \n" + ] + }, + { + "cell_type": "markdown", + "id": "13e8c7ee", + "metadata": {}, + "source": [ + "# What you'll do\n", + "\n", + "- Write a function for computing Mandelbrot fractals\n", + "- Write a function that computes Newton fractals \n", + "- Experiment with variations of general fractal types" + ] + }, + { + "cell_type": "markdown", + "id": "e52b54e1", + "metadata": {}, + "source": [ + "# What you'll learn\n", + "\n", + "- A better intuition for how fractals work mathematically \n", + "- A basic understanding about NumPy Universal Functions and Boolean Indexing\n", + "- The basics of working with complex numbers in NumPy \n", + "- How to create your own unique fractal visualizations" + ] + }, + { + "cell_type": "markdown", + "id": "530eb37c", + "metadata": {}, + "source": [ + "# What you'll need\n", + "\n", + "- Matplotlib\n", + "- make_axis_locatable function from mpl_toolkits API\n", + " \n", + "which can be imported as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a5c06525", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from mpl_toolkits.axes_grid1 import make_axes_locatable" + ] + }, + { + "cell_type": "markdown", + "id": "151bea63", + "metadata": {}, + "source": [ + "- Some familiarity with Python, NumPy and matplotlib\n", + "- An idea of elementary mathematical functions, such as exponents, sin, polynomials etc\n", + "- A very basic understanding of complex numbers would be useful\n", + "- Knowledge of derivatives may be helpful" + ] + }, + { + "cell_type": "markdown", + "id": "6eb3f0f4", + "metadata": {}, + "source": [ + "# Warmup\n", + "\n", + "To gain some intuition for what fractals are, we will begin with an example.\n", + "\n", + "Consider the following equation: \n", + "\n", + "$f(z) = z^2 -1 $ \n", + "\n", + "where z is a complex number (i.e of the form $a + bi$ )\n", + "\n", + "For our convenience, we will write a Python function for it" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fe66bfe6", + "metadata": {}, + "outputs": [], + "source": [ + "def f(z):\n", + " return np.square(z) - 1 " + ] + }, + { + "cell_type": "markdown", + "id": "87e28e6a", + "metadata": {}, + "source": [ + "Note that the square function we used is an example of a **NumPy Universal Function**; we will come back to the significance of this decision shortly. \n", + "\n", + "To gain some intuition for the behaviour of the function, we can try plugging in some different values.\n", + "\n", + "For z = 0, we would expect to get -1 " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "734c1ae5", + "metadata": {}, + "outputs": [], + "source": [ + "f(0)" + ] + }, + { + "cell_type": "markdown", + "id": "1f6b229d", + "metadata": {}, + "source": [ + "Some values grow, some values shrink, some don't experience much change. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1b3944c9", + "metadata": {}, + "outputs": [], + "source": [ + "np.round(f(4),2), np.round(f(1 - 0.2j),2), np.round(f(1.6),2)" + ] + }, + { + "cell_type": "markdown", + "id": "7a04de7f", + "metadata": {}, + "source": [ + "To see the behaviour of the function on a larger scale, we can apply the function to a subset of the complex plane and plot the result. To create our subset (or mesh), we can make use of the meshgrid function." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8fd048d1", + "metadata": {}, + "outputs": [], + "source": [ + "x,y = np.meshgrid(np.arange(-10,10,1),np.arange(-10,10,1))\n", + "mesh = x + (1j *y) #Make mesh of complex plane " + ] + }, + { + "cell_type": "markdown", + "id": "647a2905", + "metadata": {}, + "source": [ + "Now we will apply our function to each value contained in the mesh. Since we used a Universal Function in our design, this means that we can pass in the entire mesh all at once. This is extremely convenient for two reasons: It reduces the amount of code needed to be written and greatly increases the efficiency (as Universal Functions make use of system level C programming in their computations). \n", + "\n", + "\n", + "Here we plot the absolute value (or modulus) of each element in the mesh after one “iteration” of the function:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9adfa70f", + "metadata": {}, + "outputs": [], + "source": [ + "output = np.abs(f(mesh)) #Take the absolute value of the output (for plotting)\n", + "\n", + "fig = plt.figure()\n", + "ax = plt.axes(projection='3d')\n", + " \n", + "ax.scatter(x,y,output,alpha=0.2)\n", + "\n", + "ax.set_xlabel('Real axis')\n", + "ax.set_ylabel('Imaginary axis')\n", + "ax.set_zlabel('Absolute value')\n", + "ax.set_title('One Iteration: $ f(z) = z^2 - 1$');" + ] + }, + { + "cell_type": "markdown", + "id": "ff419a31", + "metadata": {}, + "source": [ + "This gives us a rough idea of what one iteration of the function does. Certain areas (notably in the areas closest to (0,0i)) remain rather small while other areas grow quite considerably. Note that we lose information about the output by taking the absolute value, but it is the only way for us to be able to make a plot.\n", + "\n", + "Let’s see what happens when we apply 2 iterations to the mesh:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "db0462ba", + "metadata": {}, + "outputs": [], + "source": [ + "output = np.abs(f(f(mesh)))\n", + "\n", + "ax = plt.axes(projection='3d')\n", + "\n", + "ax.scatter(x,y,output,alpha=0.2)\n", + "\n", + "ax.set_xlabel('Real axis')\n", + "ax.set_ylabel('Imaginary axis')\n", + "ax.set_zlabel('Absolute value')\n", + "ax.set_title('Two Iterations: $ f(z) = z^2 - 1$');" + ] + }, + { + "cell_type": "markdown", + "id": "0b9ccb9f", + "metadata": {}, + "source": [ + "Once again, we see that values around the origin remain small, and values with a larger absolute value (or modulus) “explode”. \n", + "\n", + "From first impression, its behaviour appears to be normal, and may even seem mundane. Fractals tend to have more to them then what meets the eye; the exotic behavior shows itself when we begin applying more iterations." + ] + }, + { + "cell_type": "markdown", + "id": "1a6b0293", + "metadata": {}, + "source": [ + "Consider three complex numbers:\n", + "\n", + "$z_1 = 0.4 + 0.4i $, \n", + "\n", + "$z_2 = z_1 + 0.1$,\n", + "\n", + "$z_3 = z_1 + 0.1i$\n", + "\n", + "Given the shape of our first two plots, we would expect that these values would remain near the origin as we apply iterations to them. Let us see what happens when we apply 10 iterations to each value:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a9154ffc", + "metadata": {}, + "outputs": [], + "source": [ + "selected_values = np.array([0.4 + 0.4j, 0.41 + 0.4j, 0.4 + 0.41j]) \n", + "for cur_val in selected_values:\n", + " \n", + " outputs = np.zeros(10,dtype=complex)\n", + " outputs[0] = cur_val\n", + "\n", + " for i in range(9):\n", + " outputs[i+1] = f(outputs[i]) #Apply 10 iterations, save each output\n", + "\n", + " index = np.arange(0,10)\n", + "\n", + "\n", + " fig = plt.figure(figsize=(5,5))\n", + " ax = plt.axes()\n", + "\n", + " ax.set_xlabel('Real axis')\n", + " ax.set_ylabel('Imaginary axis')\n", + " ax.set_title(f'Mapping of iterations on {cur_val}')\n", + "\n", + " cycle = ax.scatter(np.real(outputs),np.imag(outputs),c=index,alpha=0.6);\n", + " fig.colorbar(cycle,label='Iteration');" + ] + }, + { + "cell_type": "markdown", + "id": "6476cbee", + "metadata": {}, + "source": [ + "To our surprise, the behaviour of the function did not come close to matching our hypothesis. This is a prime example of the chaotic behaviour fractals possess. In the first two plots, the value \"exploded\" on the last iteration, jumping way beyond the region that it was contained in previously. The third plot on the other hand remained bounded to a small region close to the origin, yielding completely different behaviour despite the tiny change in value.\n", + "\n", + "This leads us to an extremely important question: **How many iterations can be applied to each value before they diverge (“explode”)?** \n", + "\n", + "As we saw from the first two plots, the further the values were from the origin, the faster they generally exploded. Although the behaviour is uncertain for smaller values (like $z_1, z_2, z_3$), we can assume that if a value surpasses a certain distance from the origin (say 2) that it is doomed to diverge. We will call this threshold the **radius**. \n", + "\n", + "This allows us to quantify the behaviour of the function for a particular value without having to perform as many computations. Once the radius is surpassed, we are allowed to stop iterating, which gives us a way of answering the question we posed. If we tally how many computations were applied before divergence, we gain insight into the behaviour of the function that would be hard to keep track of otherwise.\n", + "\n", + "Of course, we can do much better and design a function that performs the procedure on an entire mesh. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bab5623b", + "metadata": {}, + "outputs": [], + "source": [ + "def divergence_rate(mesh,num_iter=10,radius=2): \n", + " \n", + " z = mesh.copy()\n", + " diverge_len = np.zeros(mesh.shape) #Keep tally of the number of iterations\n", + " \n", + " for i in range(num_iter):\n", + " #Iterate on element if and only if |element| < radius (Otherwise assume divergence)\n", + " diverge_len[np.abs(z) < radius] += 1\n", + " z[np.abs(z) < radius] = f(z[np.abs(z)< radius]) \n", + " \n", + " \n", + " return diverge_len" + ] + }, + { + "cell_type": "markdown", + "id": "19af56da", + "metadata": {}, + "source": [ + "The behaviour of this function may look confusing at first glance, so it will help to explain some of the notation.\n", + "\n", + "Our goal is to iterate over each value in the mesh and to tally the number of iterations before the value diverges. Since some values will diverge quicker than others, we need a procedure that only iterates over values that have an absolute value that is sufficiently small enough. We also want to stop tallying values once they surpass the radius. For this, we can use **Boolean Indexing**, a NumPy procedure that when paired with Universal Functions is unbeatable. Boolean Indexing allows for operations to be performed conditionally on a NumPy array without having to resort to looping over and checking for each array value individually. \n", + "\n", + "In our case, we use a loop to apply iterations to our function $f(z) = z^2 -1 $ and keep tally. Using Boolean indexing, we only apply the iterations to values that have an absolute value less then 2. \n", + "\n", + "With that out of the way, we can go about plotting our first fractal! " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ee5696c5", + "metadata": {}, + "outputs": [], + "source": [ + "x,y = np.meshgrid(np.arange(-2,2,0.01),np.arange(-2,2,0.01))\n", + "mesh = x + (1j *y) \n", + "\n", + "output = divergence_rate(mesh)\n", + "\n", + "fig = plt.figure(figsize=(5,5))\n", + "ax = plt.axes()\n", + "\n", + "ax.set_title('$f(z) = z^2 -1$')\n", + "ax.set_xlabel('Real axis')\n", + "ax.set_ylabel('Imaginary axis')\n", + "\n", + "im = ax.imshow(output,extent=[-2,2,-2,2])\n", + "divider = make_axes_locatable(ax)\n", + "cax = divider.append_axes(\"right\", size=\"5%\", pad=0.1)\n", + "plt.colorbar(im, cax=cax, label = 'Number of iterations');" + ] + }, + { + "cell_type": "markdown", + "id": "fba95f58", + "metadata": {}, + "source": [ + "What this stunning visual conveys is the complexity of the function’s behaviour. The yellow region represents values that remain small, while the purple region represents the divergent values. The beautiful pattern that arises on the border of the converging and diverging values is even more fascinating when you realize that it is created from such a simple function." + ] + }, + { + "cell_type": "markdown", + "id": "e0f33475", + "metadata": {}, + "source": [ + "# Mandelbrot \n", + "\n", + "What we just explored was an example of a fractal found in the Mandelbrot set. We can write a more generalized version of the above function to gain access to a wider range of fractals.\n", + "\n", + "Mandelbrot fractals are of the form of $f(z) = z^2 + c$ where c is a fixed complex number. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "71382fce", + "metadata": {}, + "outputs": [], + "source": [ + "def mandelbrot(mesh,c=-1,num_iter=10,radius=2):\n", + " \n", + " z = mesh.copy()\n", + " diverge_len = np.zeros(z.shape) \n", + " \n", + " for i in range(num_iter):\n", + " z[np.abs(z)< radius] = np.square(z[np.abs(z)< radius]) + c\n", + " diverge_len[np.abs(z)< radius] += 1\n", + " \n", + " return diverge_len" + ] + }, + { + "cell_type": "markdown", + "id": "ce970b66", + "metadata": {}, + "source": [ + "To make our lives easier, we will create a couple meshes that we will reuse throughout the rest of the examples." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "04824deb", + "metadata": {}, + "outputs": [], + "source": [ + "x,y = np.meshgrid(np.arange(-1,1,0.005),np.arange(-1,1,0.005))\n", + "small_mesh = x + (1j*y) \n", + "\n", + "x,y = np.meshgrid(np.arange(-2,2,0.01),np.arange(-2,2,0.01))\n", + "mesh = x + (1j *y)" + ] + }, + { + "cell_type": "markdown", + "id": "fe2a118b", + "metadata": {}, + "source": [ + "We will also write a function that we will use to create our fractal plots. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "48cf89bd", + "metadata": {}, + "outputs": [], + "source": [ + "def plot_fractal(fractal,title='Fractal',figsize=(6,6),cmap='rainbow',extent=[-2,2,-2,2]):\n", + "\n", + " fig = plt.figure(figsize=figsize)\n", + " ax = plt.axes()\n", + "\n", + " ax.set_title(f'${title}$')\n", + " ax.set_xlabel('Real axis')\n", + " ax.set_ylabel('Imaginary axis')\n", + "\n", + " im = ax.imshow(fractal,extent=extent,cmap=cmap)\n", + " divider = make_axes_locatable(ax)\n", + " cax = divider.append_axes(\"right\", size=\"5%\", pad=0.1)\n", + " plt.colorbar(im, cax=cax, label = 'Number of iterations')\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "dbeaca34", + "metadata": {}, + "source": [ + "Using our newly defined functions, we can make a quick plot of the first fractal again." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e746f8ab", + "metadata": {}, + "outputs": [], + "source": [ + "output = mandelbrot(mesh,num_iter=15)\n", + "kwargs = {'title':'f(z) = z^2 -1'}\n", + "\n", + "plot_fractal(output,**kwargs);" + ] + }, + { + "cell_type": "markdown", + "id": "a74d7403", + "metadata": {}, + "source": [ + "We also can start experimenting with different values of c. It can be surprising how much influence it has on the shape of the fractal.\n", + "\n", + "For example, setting $c = \\frac{\\pi}{10}$ gives us a very elegent cloud shape, while setting c = $-\\frac{3}{4} + 0.4i$ yields a completely different pattern." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "710788dc", + "metadata": {}, + "outputs": [], + "source": [ + "output = mandelbrot(mesh,c=np.pi/10,num_iter=20)\n", + "kwargs = {'title':'f(z) = z^2 + \\dfrac{\\pi}{10}', 'cmap':'plasma'}\n", + "\n", + "plot_fractal(output,**kwargs);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "520521f7", + "metadata": {}, + "outputs": [], + "source": [ + "output = mandelbrot(mesh,c= -0.75 + 0.4j,num_iter=20)\n", + "kwargs = {'title':'f(z) = z^2 - \\dfrac{3}{4} + 0.4i', 'cmap':'Greens_r'}\n", + "\n", + "plot_fractal(output,**kwargs);" + ] + }, + { + "cell_type": "markdown", + "id": "4d9d6362", + "metadata": {}, + "source": [ + "# Generalizing the Mandelbrot function\n", + "\n", + "We can generalize our Mandelbrot function even further by giving it a parameter for which Universal Function we would like to pass in. This would allow us to plot fractals of the form $f(z) = g(z) + c$ where g is a Universal Function selected by us. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "064fbe0c", + "metadata": {}, + "outputs": [], + "source": [ + "def general_mandelbrot(mesh,c=-1,f=np.square,num_iter=100,radius=2):\n", + " \n", + " z = mesh.copy()\n", + " diverge_len = np.zeros(z.shape) \n", + " \n", + " for i in range(num_iter):\n", + " z[np.abs(z)< radius] = f(z[np.abs(z)< radius]) + c\n", + " diverge_len[np.abs(z)< radius] += 1\n", + " \n", + " return diverge_len" + ] + }, + { + "cell_type": "markdown", + "id": "3f09249b", + "metadata": {}, + "source": [ + "One cool set of fractals that can be plotted using our general Mandelbrot function are ones of the form $f(z) = z^n + c$ for some positive integer n. A very cool pattern which emerges is that the number of regions that 'stick out' matches the degree in which we raise the function to while iterating over it." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7109c7c3", + "metadata": {}, + "outputs": [], + "source": [ + "fig, axes = plt.subplots(2,3,figsize=(8,8))\n", + "degree = 2\n", + "\n", + "for i in range(2):\n", + " for j in range(3):\n", + " \n", + " power = lambda z: np.power(z,degree) #Create power function for current degree \n", + "\n", + " diverge_len = general_mandelbrot(mesh,f=power,num_iter=15)\n", + " axes[i,j].imshow(diverge_len,extent=[-2,2,-2,2],cmap='binary')\n", + " axes[i,j].set_title(f'$f(z) = z^{degree} -1$')\n", + " \n", + " degree += 1\n", + " \n", + "fig.tight_layout();" + ] + }, + { + "cell_type": "markdown", + "id": "df6d695f", + "metadata": {}, + "source": [ + "Needless to say, there is a large amount of exploring that can be done by fiddling with the inputted function, value of c, number of iterations, radius and even the density of the mesh and choice of colours." + ] + }, + { + "cell_type": "markdown", + "id": "7901e4bf", + "metadata": {}, + "source": [ + "## Newton Fractals\n", + "\n", + "Newton fractals are a specific class of fractals, where iterations involve adding or subtracting the ratio of a function (often a polynomial) and its derivative to the input values. Mathematically, it can be expressed as:\n", + "\n", + "$z := z - \\frac{f(z)}{f'(z)}$\n", + "\n", + "We will define a general version of the fractal which will allow for different variations to be plotted by passing in our functions of choice." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2f008d8b", + "metadata": {}, + "outputs": [], + "source": [ + "def newton_fractal(mesh,f,df,num_iter=10,r=2):\n", + " \n", + " z = mesh.copy()\n", + " diverge_len = np.zeros(z.shape) \n", + " \n", + " for i in range(num_iter):\n", + " pz = f(z[np.abs(z) Date: Tue, 20 Jul 2021 10:56:25 -0400 Subject: [PATCH 04/34] Added "mpl_toolkits" to dependencies. --- environment.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/environment.yml b/environment.yml index 4b5787f7..3ab42090 100644 --- a/environment.yml +++ b/environment.yml @@ -10,6 +10,7 @@ dependencies: - statsmodels - pip - imageio + - mpl_toolkits - pip: - jupyter-book - gym[atari] From 2d37215eaa39f00ba7ec76600454e8492cc8d922 Mon Sep 17 00:00:00 2001 From: MichaelRipa <51883134+MichaelRipa@users.noreply.github.com> Date: Tue, 20 Jul 2021 11:02:21 -0400 Subject: [PATCH 05/34] Updated filename To keep with the existing naming convention. --- ...{Plotting Fractals .ipynb => tutorial-plotting-fractals.ipynb} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename content/{Plotting Fractals .ipynb => tutorial-plotting-fractals.ipynb} (100%) diff --git a/content/Plotting Fractals .ipynb b/content/tutorial-plotting-fractals.ipynb similarity index 100% rename from content/Plotting Fractals .ipynb rename to content/tutorial-plotting-fractals.ipynb From f0da2c68869d3a9737c473125cb9456f1fae22c6 Mon Sep 17 00:00:00 2001 From: MichaelRipa <51883134+MichaelRipa@users.noreply.github.com> Date: Tue, 20 Jul 2021 11:04:09 -0400 Subject: [PATCH 06/34] Added my content to README. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 705c7bef..de4dd3a9 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ or navigate to any of the documents listed below and download it individually. 7. [Tutorial: NumPy deep reinforcement learning with Pong from pixels](content/tutorial-deep-reinforcement-learning-with-pong-from-pixels.md) 8. [Tutorial: Masked Arrays](content/tutorial-ma.md) 9. [Tutorial: Static Equilibrium](content/tutorial-static_equilibrium.md) +10. [Tutorial: Plotting Fractals](content/tutorial-plotting-fractals.ipynb) ## Contributing From dca6efb0ec14bd837dadafcac7c06fd9b958d3c6 Mon Sep 17 00:00:00 2001 From: MichaelRipa <51883134+MichaelRipa@users.noreply.github.com> Date: Tue, 20 Jul 2021 11:26:47 -0400 Subject: [PATCH 07/34] Add content to README. Fixed list formatting issue (my content was not displaying). --- README.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index de4dd3a9..56d65068 100644 --- a/README.md +++ b/README.md @@ -16,14 +16,15 @@ or navigate to any of the documents listed below and download it individually. 0. [Learn to write a NumPy tutorial](content/tutorial-style-guide.md): our style guide for writing tutorials. 1. [Tutorial: Linear algebra on n-dimensional arrays](content/tutorial-svd.md) -3. [Tutorial: Determining Moore's Law with real data in NumPy](content/mooreslaw-tutorial.md) -4. [Tutorial: Saving and sharing your NumPy arrays](content/save-load-arrays.md) -5. [Tutorial: NumPy deep learning on MNIST from scratch](content/tutorial-deep-learning-on-mnist.md) -6. [Tutorial: X-ray image processing](content/tutorial-x-ray-image-processing.md) -7. [Tutorial: NumPy deep reinforcement learning with Pong from pixels](content/tutorial-deep-reinforcement-learning-with-pong-from-pixels.md) -8. [Tutorial: Masked Arrays](content/tutorial-ma.md) -9. [Tutorial: Static Equilibrium](content/tutorial-static_equilibrium.md) -10. [Tutorial: Plotting Fractals](content/tutorial-plotting-fractals.ipynb) +2. [Tutorial: Determining Moore's Law with real data in NumPy](content/mooreslaw-tutorial.md) +3. [Tutorial: Saving and sharing your NumPy arrays](content/save-load-arrays.md) +4. [Tutorial: NumPy deep learning on MNIST from scratch](content/tutorial-deep-learning-on-mnist.md) +5. [Tutorial: X-ray image processing](content/tutorial-x-ray-image-processing.md) +6. [Tutorial: NumPy deep reinforcement learning with Pong from pixels](content/tutorial-deep-reinforcement-learning-with-pong-from-pixels.md) +7. [Tutorial: Masked Arrays](content/tutorial-ma.md) +8. [Tutorial: Static Equilibrium](content/tutorial-static_equilibrium.md) +9. [Tutorial: Plotting Fractals](content/tutorial-plotting-fractals.ipynb) + ## Contributing From 270c55e3d76db1e5cc591ad660e2d57a0496b2f0 Mon Sep 17 00:00:00 2001 From: Ross Barnowski Date: Wed, 21 Jul 2021 12:45:40 +0300 Subject: [PATCH 08/34] Rm .gitkeep. --- content/tutorial-plotting-fractals/.gitkeep | 1 - 1 file changed, 1 deletion(-) delete mode 100644 content/tutorial-plotting-fractals/.gitkeep diff --git a/content/tutorial-plotting-fractals/.gitkeep b/content/tutorial-plotting-fractals/.gitkeep deleted file mode 100644 index 8b137891..00000000 --- a/content/tutorial-plotting-fractals/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - From 76b91c68703292db2727dc4467b90ff1d7ed6e50 Mon Sep 17 00:00:00 2001 From: Ross Barnowski Date: Wed, 21 Jul 2021 12:46:48 +0300 Subject: [PATCH 09/34] Rm mpl_toolkits - installed with matplotlib. --- environment.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/environment.yml b/environment.yml index 3ab42090..4b5787f7 100644 --- a/environment.yml +++ b/environment.yml @@ -10,7 +10,6 @@ dependencies: - statsmodels - pip - imageio - - mpl_toolkits - pip: - jupyter-book - gym[atari] From 0f719e9d091f6647af75cf097ae790d27ac33711 Mon Sep 17 00:00:00 2001 From: Ross Barnowski Date: Wed, 21 Jul 2021 12:57:53 +0300 Subject: [PATCH 10/34] Add fractals tutorial to toctree. --- site/applications.md | 1 + 1 file changed, 1 insertion(+) diff --git a/site/applications.md b/site/applications.md index 9fccf484..0e336146 100644 --- a/site/applications.md +++ b/site/applications.md @@ -13,4 +13,5 @@ content/tutorial-deep-learning-on-mnist content/tutorial-deep-reinforcement-learning-with-pong-from-pixels content/tutorial-x-ray-image-processing content/tutorial-static_equilibrium +content/tutorial-plotting-fractals ``` From cb8db8199570425fdf76cc697b1f41b530ca17ee Mon Sep 17 00:00:00 2001 From: MichaelRipa <51883134+MichaelRipa@users.noreply.github.com> Date: Wed, 21 Jul 2021 13:06:31 +0300 Subject: [PATCH 11/34] Add fractal plotting tutorial in md format. --- content/tutorial-plotting-fractals.ipynb | 985 ----------------------- content/tutorial-plotting-fractals.md | 558 +++++++++++++ 2 files changed, 558 insertions(+), 985 deletions(-) delete mode 100644 content/tutorial-plotting-fractals.ipynb create mode 100644 content/tutorial-plotting-fractals.md diff --git a/content/tutorial-plotting-fractals.ipynb b/content/tutorial-plotting-fractals.ipynb deleted file mode 100644 index f8e06827..00000000 --- a/content/tutorial-plotting-fractals.ipynb +++ /dev/null @@ -1,985 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "f2f2467c", - "metadata": {}, - "source": [ - "# Plotting Fractals" - ] - }, - { - "cell_type": "markdown", - "id": "6b634e68", - "metadata": {}, - "source": [ - "\"Fractal" - ] - }, - { - "cell_type": "markdown", - "id": "8c9a5248", - "metadata": {}, - "source": [ - "Fractals are beautiful, compelling mathematical forms that can be oftentimes created from a relatively simple set of instructions. In nature they can be found in various places, such as coastlines, seashells, and ferns, and even were used in creating certain types of antennas. The mathematical idea of fractals was known for quite some time, but they really began to be truly appreciated in the 1970's as advancements in computer graphics and some accidental discoveries lead researchers like Mandelbrot to stumble upon the truly mystifying visualizations that fractals possess. \n", - "\n", - "Today we will learn how to plot these beautiful visualizations and will start to do a bit of exploring for ourselves as we gain familiarity of the mathematics behind fractals and will use the ever powerful NumPy universal functions to perform the necessary calculations efficiently. \n" - ] - }, - { - "cell_type": "markdown", - "id": "13e8c7ee", - "metadata": {}, - "source": [ - "# What you'll do\n", - "\n", - "- Write a function for computing Mandelbrot fractals\n", - "- Write a function that computes Newton fractals \n", - "- Experiment with variations of general fractal types" - ] - }, - { - "cell_type": "markdown", - "id": "e52b54e1", - "metadata": {}, - "source": [ - "# What you'll learn\n", - "\n", - "- A better intuition for how fractals work mathematically \n", - "- A basic understanding about NumPy Universal Functions and Boolean Indexing\n", - "- The basics of working with complex numbers in NumPy \n", - "- How to create your own unique fractal visualizations" - ] - }, - { - "cell_type": "markdown", - "id": "530eb37c", - "metadata": {}, - "source": [ - "# What you'll need\n", - "\n", - "- Matplotlib\n", - "- make_axis_locatable function from mpl_toolkits API\n", - " \n", - "which can be imported as follows:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a5c06525", - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "from mpl_toolkits.axes_grid1 import make_axes_locatable" - ] - }, - { - "cell_type": "markdown", - "id": "151bea63", - "metadata": {}, - "source": [ - "- Some familiarity with Python, NumPy and matplotlib\n", - "- An idea of elementary mathematical functions, such as exponents, sin, polynomials etc\n", - "- A very basic understanding of complex numbers would be useful\n", - "- Knowledge of derivatives may be helpful" - ] - }, - { - "cell_type": "markdown", - "id": "6eb3f0f4", - "metadata": {}, - "source": [ - "# Warmup\n", - "\n", - "To gain some intuition for what fractals are, we will begin with an example.\n", - "\n", - "Consider the following equation: \n", - "\n", - "$f(z) = z^2 -1 $ \n", - "\n", - "where z is a complex number (i.e of the form $a + bi$ )\n", - "\n", - "For our convenience, we will write a Python function for it" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fe66bfe6", - "metadata": {}, - "outputs": [], - "source": [ - "def f(z):\n", - " return np.square(z) - 1 " - ] - }, - { - "cell_type": "markdown", - "id": "87e28e6a", - "metadata": {}, - "source": [ - "Note that the square function we used is an example of a **NumPy Universal Function**; we will come back to the significance of this decision shortly. \n", - "\n", - "To gain some intuition for the behaviour of the function, we can try plugging in some different values.\n", - "\n", - "For z = 0, we would expect to get -1 " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "734c1ae5", - "metadata": {}, - "outputs": [], - "source": [ - "f(0)" - ] - }, - { - "cell_type": "markdown", - "id": "1f6b229d", - "metadata": {}, - "source": [ - "Some values grow, some values shrink, some don't experience much change. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1b3944c9", - "metadata": {}, - "outputs": [], - "source": [ - "np.round(f(4),2), np.round(f(1 - 0.2j),2), np.round(f(1.6),2)" - ] - }, - { - "cell_type": "markdown", - "id": "7a04de7f", - "metadata": {}, - "source": [ - "To see the behaviour of the function on a larger scale, we can apply the function to a subset of the complex plane and plot the result. To create our subset (or mesh), we can make use of the meshgrid function." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8fd048d1", - "metadata": {}, - "outputs": [], - "source": [ - "x,y = np.meshgrid(np.arange(-10,10,1),np.arange(-10,10,1))\n", - "mesh = x + (1j *y) #Make mesh of complex plane " - ] - }, - { - "cell_type": "markdown", - "id": "647a2905", - "metadata": {}, - "source": [ - "Now we will apply our function to each value contained in the mesh. Since we used a Universal Function in our design, this means that we can pass in the entire mesh all at once. This is extremely convenient for two reasons: It reduces the amount of code needed to be written and greatly increases the efficiency (as Universal Functions make use of system level C programming in their computations). \n", - "\n", - "\n", - "Here we plot the absolute value (or modulus) of each element in the mesh after one “iteration” of the function:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9adfa70f", - "metadata": {}, - "outputs": [], - "source": [ - "output = np.abs(f(mesh)) #Take the absolute value of the output (for plotting)\n", - "\n", - "fig = plt.figure()\n", - "ax = plt.axes(projection='3d')\n", - " \n", - "ax.scatter(x,y,output,alpha=0.2)\n", - "\n", - "ax.set_xlabel('Real axis')\n", - "ax.set_ylabel('Imaginary axis')\n", - "ax.set_zlabel('Absolute value')\n", - "ax.set_title('One Iteration: $ f(z) = z^2 - 1$');" - ] - }, - { - "cell_type": "markdown", - "id": "ff419a31", - "metadata": {}, - "source": [ - "This gives us a rough idea of what one iteration of the function does. Certain areas (notably in the areas closest to (0,0i)) remain rather small while other areas grow quite considerably. Note that we lose information about the output by taking the absolute value, but it is the only way for us to be able to make a plot.\n", - "\n", - "Let’s see what happens when we apply 2 iterations to the mesh:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "db0462ba", - "metadata": {}, - "outputs": [], - "source": [ - "output = np.abs(f(f(mesh)))\n", - "\n", - "ax = plt.axes(projection='3d')\n", - "\n", - "ax.scatter(x,y,output,alpha=0.2)\n", - "\n", - "ax.set_xlabel('Real axis')\n", - "ax.set_ylabel('Imaginary axis')\n", - "ax.set_zlabel('Absolute value')\n", - "ax.set_title('Two Iterations: $ f(z) = z^2 - 1$');" - ] - }, - { - "cell_type": "markdown", - "id": "0b9ccb9f", - "metadata": {}, - "source": [ - "Once again, we see that values around the origin remain small, and values with a larger absolute value (or modulus) “explode”. \n", - "\n", - "From first impression, its behaviour appears to be normal, and may even seem mundane. Fractals tend to have more to them then what meets the eye; the exotic behavior shows itself when we begin applying more iterations." - ] - }, - { - "cell_type": "markdown", - "id": "1a6b0293", - "metadata": {}, - "source": [ - "Consider three complex numbers:\n", - "\n", - "$z_1 = 0.4 + 0.4i $, \n", - "\n", - "$z_2 = z_1 + 0.1$,\n", - "\n", - "$z_3 = z_1 + 0.1i$\n", - "\n", - "Given the shape of our first two plots, we would expect that these values would remain near the origin as we apply iterations to them. Let us see what happens when we apply 10 iterations to each value:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a9154ffc", - "metadata": {}, - "outputs": [], - "source": [ - "selected_values = np.array([0.4 + 0.4j, 0.41 + 0.4j, 0.4 + 0.41j]) \n", - "for cur_val in selected_values:\n", - " \n", - " outputs = np.zeros(10,dtype=complex)\n", - " outputs[0] = cur_val\n", - "\n", - " for i in range(9):\n", - " outputs[i+1] = f(outputs[i]) #Apply 10 iterations, save each output\n", - "\n", - " index = np.arange(0,10)\n", - "\n", - "\n", - " fig = plt.figure(figsize=(5,5))\n", - " ax = plt.axes()\n", - "\n", - " ax.set_xlabel('Real axis')\n", - " ax.set_ylabel('Imaginary axis')\n", - " ax.set_title(f'Mapping of iterations on {cur_val}')\n", - "\n", - " cycle = ax.scatter(np.real(outputs),np.imag(outputs),c=index,alpha=0.6);\n", - " fig.colorbar(cycle,label='Iteration');" - ] - }, - { - "cell_type": "markdown", - "id": "6476cbee", - "metadata": {}, - "source": [ - "To our surprise, the behaviour of the function did not come close to matching our hypothesis. This is a prime example of the chaotic behaviour fractals possess. In the first two plots, the value \"exploded\" on the last iteration, jumping way beyond the region that it was contained in previously. The third plot on the other hand remained bounded to a small region close to the origin, yielding completely different behaviour despite the tiny change in value.\n", - "\n", - "This leads us to an extremely important question: **How many iterations can be applied to each value before they diverge (“explode”)?** \n", - "\n", - "As we saw from the first two plots, the further the values were from the origin, the faster they generally exploded. Although the behaviour is uncertain for smaller values (like $z_1, z_2, z_3$), we can assume that if a value surpasses a certain distance from the origin (say 2) that it is doomed to diverge. We will call this threshold the **radius**. \n", - "\n", - "This allows us to quantify the behaviour of the function for a particular value without having to perform as many computations. Once the radius is surpassed, we are allowed to stop iterating, which gives us a way of answering the question we posed. If we tally how many computations were applied before divergence, we gain insight into the behaviour of the function that would be hard to keep track of otherwise.\n", - "\n", - "Of course, we can do much better and design a function that performs the procedure on an entire mesh. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bab5623b", - "metadata": {}, - "outputs": [], - "source": [ - "def divergence_rate(mesh,num_iter=10,radius=2): \n", - " \n", - " z = mesh.copy()\n", - " diverge_len = np.zeros(mesh.shape) #Keep tally of the number of iterations\n", - " \n", - " for i in range(num_iter):\n", - " #Iterate on element if and only if |element| < radius (Otherwise assume divergence)\n", - " diverge_len[np.abs(z) < radius] += 1\n", - " z[np.abs(z) < radius] = f(z[np.abs(z)< radius]) \n", - " \n", - " \n", - " return diverge_len" - ] - }, - { - "cell_type": "markdown", - "id": "19af56da", - "metadata": {}, - "source": [ - "The behaviour of this function may look confusing at first glance, so it will help to explain some of the notation.\n", - "\n", - "Our goal is to iterate over each value in the mesh and to tally the number of iterations before the value diverges. Since some values will diverge quicker than others, we need a procedure that only iterates over values that have an absolute value that is sufficiently small enough. We also want to stop tallying values once they surpass the radius. For this, we can use **Boolean Indexing**, a NumPy procedure that when paired with Universal Functions is unbeatable. Boolean Indexing allows for operations to be performed conditionally on a NumPy array without having to resort to looping over and checking for each array value individually. \n", - "\n", - "In our case, we use a loop to apply iterations to our function $f(z) = z^2 -1 $ and keep tally. Using Boolean indexing, we only apply the iterations to values that have an absolute value less then 2. \n", - "\n", - "With that out of the way, we can go about plotting our first fractal! " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ee5696c5", - "metadata": {}, - "outputs": [], - "source": [ - "x,y = np.meshgrid(np.arange(-2,2,0.01),np.arange(-2,2,0.01))\n", - "mesh = x + (1j *y) \n", - "\n", - "output = divergence_rate(mesh)\n", - "\n", - "fig = plt.figure(figsize=(5,5))\n", - "ax = plt.axes()\n", - "\n", - "ax.set_title('$f(z) = z^2 -1$')\n", - "ax.set_xlabel('Real axis')\n", - "ax.set_ylabel('Imaginary axis')\n", - "\n", - "im = ax.imshow(output,extent=[-2,2,-2,2])\n", - "divider = make_axes_locatable(ax)\n", - "cax = divider.append_axes(\"right\", size=\"5%\", pad=0.1)\n", - "plt.colorbar(im, cax=cax, label = 'Number of iterations');" - ] - }, - { - "cell_type": "markdown", - "id": "fba95f58", - "metadata": {}, - "source": [ - "What this stunning visual conveys is the complexity of the function’s behaviour. The yellow region represents values that remain small, while the purple region represents the divergent values. The beautiful pattern that arises on the border of the converging and diverging values is even more fascinating when you realize that it is created from such a simple function." - ] - }, - { - "cell_type": "markdown", - "id": "e0f33475", - "metadata": {}, - "source": [ - "# Mandelbrot \n", - "\n", - "What we just explored was an example of a fractal found in the Mandelbrot set. We can write a more generalized version of the above function to gain access to a wider range of fractals.\n", - "\n", - "Mandelbrot fractals are of the form of $f(z) = z^2 + c$ where c is a fixed complex number. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "71382fce", - "metadata": {}, - "outputs": [], - "source": [ - "def mandelbrot(mesh,c=-1,num_iter=10,radius=2):\n", - " \n", - " z = mesh.copy()\n", - " diverge_len = np.zeros(z.shape) \n", - " \n", - " for i in range(num_iter):\n", - " z[np.abs(z)< radius] = np.square(z[np.abs(z)< radius]) + c\n", - " diverge_len[np.abs(z)< radius] += 1\n", - " \n", - " return diverge_len" - ] - }, - { - "cell_type": "markdown", - "id": "ce970b66", - "metadata": {}, - "source": [ - "To make our lives easier, we will create a couple meshes that we will reuse throughout the rest of the examples." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "04824deb", - "metadata": {}, - "outputs": [], - "source": [ - "x,y = np.meshgrid(np.arange(-1,1,0.005),np.arange(-1,1,0.005))\n", - "small_mesh = x + (1j*y) \n", - "\n", - "x,y = np.meshgrid(np.arange(-2,2,0.01),np.arange(-2,2,0.01))\n", - "mesh = x + (1j *y)" - ] - }, - { - "cell_type": "markdown", - "id": "fe2a118b", - "metadata": {}, - "source": [ - "We will also write a function that we will use to create our fractal plots. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "48cf89bd", - "metadata": {}, - "outputs": [], - "source": [ - "def plot_fractal(fractal,title='Fractal',figsize=(6,6),cmap='rainbow',extent=[-2,2,-2,2]):\n", - "\n", - " fig = plt.figure(figsize=figsize)\n", - " ax = plt.axes()\n", - "\n", - " ax.set_title(f'${title}$')\n", - " ax.set_xlabel('Real axis')\n", - " ax.set_ylabel('Imaginary axis')\n", - "\n", - " im = ax.imshow(fractal,extent=extent,cmap=cmap)\n", - " divider = make_axes_locatable(ax)\n", - " cax = divider.append_axes(\"right\", size=\"5%\", pad=0.1)\n", - " plt.colorbar(im, cax=cax, label = 'Number of iterations')\n", - " " - ] - }, - { - "cell_type": "markdown", - "id": "dbeaca34", - "metadata": {}, - "source": [ - "Using our newly defined functions, we can make a quick plot of the first fractal again." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e746f8ab", - "metadata": {}, - "outputs": [], - "source": [ - "output = mandelbrot(mesh,num_iter=15)\n", - "kwargs = {'title':'f(z) = z^2 -1'}\n", - "\n", - "plot_fractal(output,**kwargs);" - ] - }, - { - "cell_type": "markdown", - "id": "a74d7403", - "metadata": {}, - "source": [ - "We also can start experimenting with different values of c. It can be surprising how much influence it has on the shape of the fractal.\n", - "\n", - "For example, setting $c = \\frac{\\pi}{10}$ gives us a very elegent cloud shape, while setting c = $-\\frac{3}{4} + 0.4i$ yields a completely different pattern." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "710788dc", - "metadata": {}, - "outputs": [], - "source": [ - "output = mandelbrot(mesh,c=np.pi/10,num_iter=20)\n", - "kwargs = {'title':'f(z) = z^2 + \\dfrac{\\pi}{10}', 'cmap':'plasma'}\n", - "\n", - "plot_fractal(output,**kwargs);" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "520521f7", - "metadata": {}, - "outputs": [], - "source": [ - "output = mandelbrot(mesh,c= -0.75 + 0.4j,num_iter=20)\n", - "kwargs = {'title':'f(z) = z^2 - \\dfrac{3}{4} + 0.4i', 'cmap':'Greens_r'}\n", - "\n", - "plot_fractal(output,**kwargs);" - ] - }, - { - "cell_type": "markdown", - "id": "4d9d6362", - "metadata": {}, - "source": [ - "# Generalizing the Mandelbrot function\n", - "\n", - "We can generalize our Mandelbrot function even further by giving it a parameter for which Universal Function we would like to pass in. This would allow us to plot fractals of the form $f(z) = g(z) + c$ where g is a Universal Function selected by us. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "064fbe0c", - "metadata": {}, - "outputs": [], - "source": [ - "def general_mandelbrot(mesh,c=-1,f=np.square,num_iter=100,radius=2):\n", - " \n", - " z = mesh.copy()\n", - " diverge_len = np.zeros(z.shape) \n", - " \n", - " for i in range(num_iter):\n", - " z[np.abs(z)< radius] = f(z[np.abs(z)< radius]) + c\n", - " diverge_len[np.abs(z)< radius] += 1\n", - " \n", - " return diverge_len" - ] - }, - { - "cell_type": "markdown", - "id": "3f09249b", - "metadata": {}, - "source": [ - "One cool set of fractals that can be plotted using our general Mandelbrot function are ones of the form $f(z) = z^n + c$ for some positive integer n. A very cool pattern which emerges is that the number of regions that 'stick out' matches the degree in which we raise the function to while iterating over it." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7109c7c3", - "metadata": {}, - "outputs": [], - "source": [ - "fig, axes = plt.subplots(2,3,figsize=(8,8))\n", - "degree = 2\n", - "\n", - "for i in range(2):\n", - " for j in range(3):\n", - " \n", - " power = lambda z: np.power(z,degree) #Create power function for current degree \n", - "\n", - " diverge_len = general_mandelbrot(mesh,f=power,num_iter=15)\n", - " axes[i,j].imshow(diverge_len,extent=[-2,2,-2,2],cmap='binary')\n", - " axes[i,j].set_title(f'$f(z) = z^{degree} -1$')\n", - " \n", - " degree += 1\n", - " \n", - "fig.tight_layout();" - ] - }, - { - "cell_type": "markdown", - "id": "df6d695f", - "metadata": {}, - "source": [ - "Needless to say, there is a large amount of exploring that can be done by fiddling with the inputted function, value of c, number of iterations, radius and even the density of the mesh and choice of colours." - ] - }, - { - "cell_type": "markdown", - "id": "7901e4bf", - "metadata": {}, - "source": [ - "## Newton Fractals\n", - "\n", - "Newton fractals are a specific class of fractals, where iterations involve adding or subtracting the ratio of a function (often a polynomial) and its derivative to the input values. Mathematically, it can be expressed as:\n", - "\n", - "$z := z - \\frac{f(z)}{f'(z)}$\n", - "\n", - "We will define a general version of the fractal which will allow for different variations to be plotted by passing in our functions of choice." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2f008d8b", - "metadata": {}, - "outputs": [], - "source": [ - "def newton_fractal(mesh,f,df,num_iter=10,r=2):\n", - " \n", - " z = mesh.copy()\n", - " diverge_len = np.zeros(z.shape) \n", - " \n", - " for i in range(num_iter):\n", - " pz = f(z[np.abs(z) + ++++ + +Fractals are beautiful, compelling mathematical forms that can be oftentimes created from a relatively simple set of instructions. In nature they can be found in various places, such as coastlines, seashells, and ferns, and even were used in creating certain types of antennas. The mathematical idea of fractals was known for quite some time, but they really began to be truly appreciated in the 1970's as advancements in computer graphics and some accidental discoveries lead researchers like Mandelbrot to stumble upon the truly mystifying visualizations that fractals possess. + +Today we will learn how to plot these beautiful visualizations and will start to do a bit of exploring for ourselves as we gain familiarity of the mathematics behind fractals and will use the ever powerful NumPy universal functions to perform the necessary calculations efficiently. + ++++ + +# What you'll do + +- Write a function for computing Mandelbrot fractals +- Write a function that computes Newton fractals +- Experiment with variations of general fractal types + ++++ + +# What you'll learn + +- A better intuition for how fractals work mathematically +- A basic understanding about NumPy Universal Functions and Boolean Indexing +- The basics of working with complex numbers in NumPy +- How to create your own unique fractal visualizations + ++++ + +# What you'll need + +- Matplotlib +- make_axis_locatable function from mpl_toolkits API + +which can be imported as follows: + +```{code-cell} ipython3 +import numpy as np +import matplotlib.pyplot as plt +from mpl_toolkits.axes_grid1 import make_axes_locatable +``` + +- Some familiarity with Python, NumPy and matplotlib +- An idea of elementary mathematical functions, such as exponents, sin, polynomials etc +- A very basic understanding of complex numbers would be useful +- Knowledge of derivatives may be helpful + ++++ + +# Warmup + +To gain some intuition for what fractals are, we will begin with an example. + +Consider the following equation: + +$f(z) = z^2 -1 $ + +where z is a complex number (i.e of the form $a + bi$ ) + +For our convenience, we will write a Python function for it + +```{code-cell} ipython3 +def f(z): + return np.square(z) - 1 +``` + +Note that the square function we used is an example of a **NumPy Universal Function**; we will come back to the significance of this decision shortly. + +To gain some intuition for the behaviour of the function, we can try plugging in some different values. + +For z = 0, we would expect to get -1 + +```{code-cell} ipython3 +f(0) +``` + +Some values grow, some values shrink, some don't experience much change. + +```{code-cell} ipython3 +np.round(f(4),2), np.round(f(1 - 0.2j),2), np.round(f(1.6),2) +``` + +To see the behaviour of the function on a larger scale, we can apply the function to a subset of the complex plane and plot the result. To create our subset (or mesh), we can make use of the meshgrid function. + +```{code-cell} ipython3 +x,y = np.meshgrid(np.arange(-10,10,1),np.arange(-10,10,1)) +mesh = x + (1j *y) #Make mesh of complex plane +``` + +Now we will apply our function to each value contained in the mesh. Since we used a Universal Function in our design, this means that we can pass in the entire mesh all at once. This is extremely convenient for two reasons: It reduces the amount of code needed to be written and greatly increases the efficiency (as Universal Functions make use of system level C programming in their computations). + + +Here we plot the absolute value (or modulus) of each element in the mesh after one “iteration” of the function: + +```{code-cell} ipython3 +output = np.abs(f(mesh)) #Take the absolute value of the output (for plotting) + +fig = plt.figure() +ax = plt.axes(projection='3d') + +ax.scatter(x,y,output,alpha=0.2) + +ax.set_xlabel('Real axis') +ax.set_ylabel('Imaginary axis') +ax.set_zlabel('Absolute value') +ax.set_title('One Iteration: $ f(z) = z^2 - 1$'); +``` + +This gives us a rough idea of what one iteration of the function does. Certain areas (notably in the areas closest to (0,0i)) remain rather small while other areas grow quite considerably. Note that we lose information about the output by taking the absolute value, but it is the only way for us to be able to make a plot. + +Let’s see what happens when we apply 2 iterations to the mesh: + +```{code-cell} ipython3 +output = np.abs(f(f(mesh))) + +ax = plt.axes(projection='3d') + +ax.scatter(x,y,output,alpha=0.2) + +ax.set_xlabel('Real axis') +ax.set_ylabel('Imaginary axis') +ax.set_zlabel('Absolute value') +ax.set_title('Two Iterations: $ f(z) = z^2 - 1$'); +``` + +Once again, we see that values around the origin remain small, and values with a larger absolute value (or modulus) “explode”. + +From first impression, its behaviour appears to be normal, and may even seem mundane. Fractals tend to have more to them then what meets the eye; the exotic behavior shows itself when we begin applying more iterations. + ++++ + +Consider three complex numbers: + +$z_1 = 0.4 + 0.4i $, + +$z_2 = z_1 + 0.1$, + +$z_3 = z_1 + 0.1i$ + +Given the shape of our first two plots, we would expect that these values would remain near the origin as we apply iterations to them. Let us see what happens when we apply 10 iterations to each value: + +```{code-cell} ipython3 +selected_values = np.array([0.4 + 0.4j, 0.41 + 0.4j, 0.4 + 0.41j]) +for cur_val in selected_values: + + outputs = np.zeros(10,dtype=complex) + outputs[0] = cur_val + + for i in range(9): + outputs[i+1] = f(outputs[i]) #Apply 10 iterations, save each output + + index = np.arange(0,10) + + + fig = plt.figure(figsize=(5,5)) + ax = plt.axes() + + ax.set_xlabel('Real axis') + ax.set_ylabel('Imaginary axis') + ax.set_title(f'Mapping of iterations on {cur_val}') + + cycle = ax.scatter(np.real(outputs),np.imag(outputs),c=index,alpha=0.6); + fig.colorbar(cycle,label='Iteration'); +``` + +To our surprise, the behaviour of the function did not come close to matching our hypothesis. This is a prime example of the chaotic behaviour fractals possess. In the first two plots, the value "exploded" on the last iteration, jumping way beyond the region that it was contained in previously. The third plot on the other hand remained bounded to a small region close to the origin, yielding completely different behaviour despite the tiny change in value. + +This leads us to an extremely important question: **How many iterations can be applied to each value before they diverge (“explode”)?** + +As we saw from the first two plots, the further the values were from the origin, the faster they generally exploded. Although the behaviour is uncertain for smaller values (like $z_1, z_2, z_3$), we can assume that if a value surpasses a certain distance from the origin (say 2) that it is doomed to diverge. We will call this threshold the **radius**. + +This allows us to quantify the behaviour of the function for a particular value without having to perform as many computations. Once the radius is surpassed, we are allowed to stop iterating, which gives us a way of answering the question we posed. If we tally how many computations were applied before divergence, we gain insight into the behaviour of the function that would be hard to keep track of otherwise. + +Of course, we can do much better and design a function that performs the procedure on an entire mesh. + +```{code-cell} ipython3 +def divergence_rate(mesh,num_iter=10,radius=2): + + z = mesh.copy() + diverge_len = np.zeros(mesh.shape) #Keep tally of the number of iterations + + for i in range(num_iter): + #Iterate on element if and only if |element| < radius (Otherwise assume divergence) + diverge_len[np.abs(z) < radius] += 1 + z[np.abs(z) < radius] = f(z[np.abs(z)< radius]) + + + return diverge_len +``` + +The behaviour of this function may look confusing at first glance, so it will help to explain some of the notation. + +Our goal is to iterate over each value in the mesh and to tally the number of iterations before the value diverges. Since some values will diverge quicker than others, we need a procedure that only iterates over values that have an absolute value that is sufficiently small enough. We also want to stop tallying values once they surpass the radius. For this, we can use **Boolean Indexing**, a NumPy procedure that when paired with Universal Functions is unbeatable. Boolean Indexing allows for operations to be performed conditionally on a NumPy array without having to resort to looping over and checking for each array value individually. + +In our case, we use a loop to apply iterations to our function $f(z) = z^2 -1 $ and keep tally. Using Boolean indexing, we only apply the iterations to values that have an absolute value less then 2. + +With that out of the way, we can go about plotting our first fractal! + +```{code-cell} ipython3 +x,y = np.meshgrid(np.arange(-2,2,0.01),np.arange(-2,2,0.01)) +mesh = x + (1j *y) + +output = divergence_rate(mesh) + +fig = plt.figure(figsize=(5,5)) +ax = plt.axes() + +ax.set_title('$f(z) = z^2 -1$') +ax.set_xlabel('Real axis') +ax.set_ylabel('Imaginary axis') + +im = ax.imshow(output,extent=[-2,2,-2,2]) +divider = make_axes_locatable(ax) +cax = divider.append_axes("right", size="5%", pad=0.1) +plt.colorbar(im, cax=cax, label = 'Number of iterations'); +``` + +What this stunning visual conveys is the complexity of the function’s behaviour. The yellow region represents values that remain small, while the purple region represents the divergent values. The beautiful pattern that arises on the border of the converging and diverging values is even more fascinating when you realize that it is created from such a simple function. + ++++ + +# Mandelbrot + +What we just explored was an example of a fractal found in the Mandelbrot set. We can write a more generalized version of the above function to gain access to a wider range of fractals. + +Mandelbrot fractals are of the form of $f(z) = z^2 + c$ where c is a fixed complex number. + +```{code-cell} ipython3 +def mandelbrot(mesh,c=-1,num_iter=10,radius=2): + + z = mesh.copy() + diverge_len = np.zeros(z.shape) + + for i in range(num_iter): + z[np.abs(z)< radius] = np.square(z[np.abs(z)< radius]) + c + diverge_len[np.abs(z)< radius] += 1 + + return diverge_len +``` + +To make our lives easier, we will create a couple meshes that we will reuse throughout the rest of the examples. + +```{code-cell} ipython3 +x,y = np.meshgrid(np.arange(-1,1,0.005),np.arange(-1,1,0.005)) +small_mesh = x + (1j*y) + +x,y = np.meshgrid(np.arange(-2,2,0.01),np.arange(-2,2,0.01)) +mesh = x + (1j *y) +``` + +We will also write a function that we will use to create our fractal plots. + +```{code-cell} ipython3 +def plot_fractal(fractal,title='Fractal',figsize=(6,6),cmap='rainbow',extent=[-2,2,-2,2]): + + fig = plt.figure(figsize=figsize) + ax = plt.axes() + + ax.set_title(f'${title}$') + ax.set_xlabel('Real axis') + ax.set_ylabel('Imaginary axis') + + im = ax.imshow(fractal,extent=extent,cmap=cmap) + divider = make_axes_locatable(ax) + cax = divider.append_axes("right", size="5%", pad=0.1) + plt.colorbar(im, cax=cax, label = 'Number of iterations') + +``` + +Using our newly defined functions, we can make a quick plot of the first fractal again. + +```{code-cell} ipython3 +output = mandelbrot(mesh,num_iter=15) +kwargs = {'title':'f(z) = z^2 -1'} + +plot_fractal(output,**kwargs); +``` + +We also can start experimenting with different values of c. It can be surprising how much influence it has on the shape of the fractal. + +For example, setting $c = \frac{\pi}{10}$ gives us a very elegent cloud shape, while setting c = $-\frac{3}{4} + 0.4i$ yields a completely different pattern. + +```{code-cell} ipython3 +output = mandelbrot(mesh,c=np.pi/10,num_iter=20) +kwargs = {'title':'f(z) = z^2 + \dfrac{\pi}{10}', 'cmap':'plasma'} + +plot_fractal(output,**kwargs); +``` + +```{code-cell} ipython3 +output = mandelbrot(mesh,c= -0.75 + 0.4j,num_iter=20) +kwargs = {'title':'f(z) = z^2 - \dfrac{3}{4} + 0.4i', 'cmap':'Greens_r'} + +plot_fractal(output,**kwargs); +``` + +# Generalizing the Mandelbrot function + +We can generalize our Mandelbrot function even further by giving it a parameter for which Universal Function we would like to pass in. This would allow us to plot fractals of the form $f(z) = g(z) + c$ where g is a Universal Function selected by us. + +```{code-cell} ipython3 +def general_mandelbrot(mesh,c=-1,f=np.square,num_iter=100,radius=2): + + z = mesh.copy() + diverge_len = np.zeros(z.shape) + + for i in range(num_iter): + z[np.abs(z)< radius] = f(z[np.abs(z)< radius]) + c + diverge_len[np.abs(z)< radius] += 1 + + return diverge_len +``` + +One cool set of fractals that can be plotted using our general Mandelbrot function are ones of the form $f(z) = z^n + c$ for some positive integer n. A very cool pattern which emerges is that the number of regions that 'stick out' matches the degree in which we raise the function to while iterating over it. + +```{code-cell} ipython3 +fig, axes = plt.subplots(2,3,figsize=(8,8)) +degree = 2 + +for i in range(2): + for j in range(3): + + power = lambda z: np.power(z,degree) #Create power function for current degree + + diverge_len = general_mandelbrot(mesh,f=power,num_iter=15) + axes[i,j].imshow(diverge_len,extent=[-2,2,-2,2],cmap='binary') + axes[i,j].set_title(f'$f(z) = z^{degree} -1$') + + degree += 1 + +fig.tight_layout(); +``` + +Needless to say, there is a large amount of exploring that can be done by fiddling with the inputted function, value of c, number of iterations, radius and even the density of the mesh and choice of colours. + ++++ + +## Newton Fractals + +Newton fractals are a specific class of fractals, where iterations involve adding or subtracting the ratio of a function (often a polynomial) and its derivative to the input values. Mathematically, it can be expressed as: + +$z := z - \frac{f(z)}{f'(z)}$ + +We will define a general version of the fractal which will allow for different variations to be plotted by passing in our functions of choice. + +```{code-cell} ipython3 +def newton_fractal(mesh,f,df,num_iter=10,r=2): + + z = mesh.copy() + diverge_len = np.zeros(z.shape) + + for i in range(num_iter): + pz = f(z[np.abs(z) Date: Thu, 22 Jul 2021 09:41:14 -0400 Subject: [PATCH 12/34] Delete tutorial-plotting-fractals.md --- content/tutorial-plotting-fractals.md | 558 -------------------------- 1 file changed, 558 deletions(-) delete mode 100644 content/tutorial-plotting-fractals.md diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md deleted file mode 100644 index ac56649f..00000000 --- a/content/tutorial-plotting-fractals.md +++ /dev/null @@ -1,558 +0,0 @@ ---- -jupytext: - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.11.1 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -# Plotting Fractals - -+++ - -Fractal picture - -+++ - -Fractals are beautiful, compelling mathematical forms that can be oftentimes created from a relatively simple set of instructions. In nature they can be found in various places, such as coastlines, seashells, and ferns, and even were used in creating certain types of antennas. The mathematical idea of fractals was known for quite some time, but they really began to be truly appreciated in the 1970's as advancements in computer graphics and some accidental discoveries lead researchers like Mandelbrot to stumble upon the truly mystifying visualizations that fractals possess. - -Today we will learn how to plot these beautiful visualizations and will start to do a bit of exploring for ourselves as we gain familiarity of the mathematics behind fractals and will use the ever powerful NumPy universal functions to perform the necessary calculations efficiently. - -+++ - -# What you'll do - -- Write a function for computing Mandelbrot fractals -- Write a function that computes Newton fractals -- Experiment with variations of general fractal types - -+++ - -# What you'll learn - -- A better intuition for how fractals work mathematically -- A basic understanding about NumPy Universal Functions and Boolean Indexing -- The basics of working with complex numbers in NumPy -- How to create your own unique fractal visualizations - -+++ - -# What you'll need - -- Matplotlib -- make_axis_locatable function from mpl_toolkits API - -which can be imported as follows: - -```{code-cell} ipython3 -import numpy as np -import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid1 import make_axes_locatable -``` - -- Some familiarity with Python, NumPy and matplotlib -- An idea of elementary mathematical functions, such as exponents, sin, polynomials etc -- A very basic understanding of complex numbers would be useful -- Knowledge of derivatives may be helpful - -+++ - -# Warmup - -To gain some intuition for what fractals are, we will begin with an example. - -Consider the following equation: - -$f(z) = z^2 -1 $ - -where z is a complex number (i.e of the form $a + bi$ ) - -For our convenience, we will write a Python function for it - -```{code-cell} ipython3 -def f(z): - return np.square(z) - 1 -``` - -Note that the square function we used is an example of a **NumPy Universal Function**; we will come back to the significance of this decision shortly. - -To gain some intuition for the behaviour of the function, we can try plugging in some different values. - -For z = 0, we would expect to get -1 - -```{code-cell} ipython3 -f(0) -``` - -Some values grow, some values shrink, some don't experience much change. - -```{code-cell} ipython3 -np.round(f(4),2), np.round(f(1 - 0.2j),2), np.round(f(1.6),2) -``` - -To see the behaviour of the function on a larger scale, we can apply the function to a subset of the complex plane and plot the result. To create our subset (or mesh), we can make use of the meshgrid function. - -```{code-cell} ipython3 -x,y = np.meshgrid(np.arange(-10,10,1),np.arange(-10,10,1)) -mesh = x + (1j *y) #Make mesh of complex plane -``` - -Now we will apply our function to each value contained in the mesh. Since we used a Universal Function in our design, this means that we can pass in the entire mesh all at once. This is extremely convenient for two reasons: It reduces the amount of code needed to be written and greatly increases the efficiency (as Universal Functions make use of system level C programming in their computations). - - -Here we plot the absolute value (or modulus) of each element in the mesh after one “iteration” of the function: - -```{code-cell} ipython3 -output = np.abs(f(mesh)) #Take the absolute value of the output (for plotting) - -fig = plt.figure() -ax = plt.axes(projection='3d') - -ax.scatter(x,y,output,alpha=0.2) - -ax.set_xlabel('Real axis') -ax.set_ylabel('Imaginary axis') -ax.set_zlabel('Absolute value') -ax.set_title('One Iteration: $ f(z) = z^2 - 1$'); -``` - -This gives us a rough idea of what one iteration of the function does. Certain areas (notably in the areas closest to (0,0i)) remain rather small while other areas grow quite considerably. Note that we lose information about the output by taking the absolute value, but it is the only way for us to be able to make a plot. - -Let’s see what happens when we apply 2 iterations to the mesh: - -```{code-cell} ipython3 -output = np.abs(f(f(mesh))) - -ax = plt.axes(projection='3d') - -ax.scatter(x,y,output,alpha=0.2) - -ax.set_xlabel('Real axis') -ax.set_ylabel('Imaginary axis') -ax.set_zlabel('Absolute value') -ax.set_title('Two Iterations: $ f(z) = z^2 - 1$'); -``` - -Once again, we see that values around the origin remain small, and values with a larger absolute value (or modulus) “explode”. - -From first impression, its behaviour appears to be normal, and may even seem mundane. Fractals tend to have more to them then what meets the eye; the exotic behavior shows itself when we begin applying more iterations. - -+++ - -Consider three complex numbers: - -$z_1 = 0.4 + 0.4i $, - -$z_2 = z_1 + 0.1$, - -$z_3 = z_1 + 0.1i$ - -Given the shape of our first two plots, we would expect that these values would remain near the origin as we apply iterations to them. Let us see what happens when we apply 10 iterations to each value: - -```{code-cell} ipython3 -selected_values = np.array([0.4 + 0.4j, 0.41 + 0.4j, 0.4 + 0.41j]) -for cur_val in selected_values: - - outputs = np.zeros(10,dtype=complex) - outputs[0] = cur_val - - for i in range(9): - outputs[i+1] = f(outputs[i]) #Apply 10 iterations, save each output - - index = np.arange(0,10) - - - fig = plt.figure(figsize=(5,5)) - ax = plt.axes() - - ax.set_xlabel('Real axis') - ax.set_ylabel('Imaginary axis') - ax.set_title(f'Mapping of iterations on {cur_val}') - - cycle = ax.scatter(np.real(outputs),np.imag(outputs),c=index,alpha=0.6); - fig.colorbar(cycle,label='Iteration'); -``` - -To our surprise, the behaviour of the function did not come close to matching our hypothesis. This is a prime example of the chaotic behaviour fractals possess. In the first two plots, the value "exploded" on the last iteration, jumping way beyond the region that it was contained in previously. The third plot on the other hand remained bounded to a small region close to the origin, yielding completely different behaviour despite the tiny change in value. - -This leads us to an extremely important question: **How many iterations can be applied to each value before they diverge (“explode”)?** - -As we saw from the first two plots, the further the values were from the origin, the faster they generally exploded. Although the behaviour is uncertain for smaller values (like $z_1, z_2, z_3$), we can assume that if a value surpasses a certain distance from the origin (say 2) that it is doomed to diverge. We will call this threshold the **radius**. - -This allows us to quantify the behaviour of the function for a particular value without having to perform as many computations. Once the radius is surpassed, we are allowed to stop iterating, which gives us a way of answering the question we posed. If we tally how many computations were applied before divergence, we gain insight into the behaviour of the function that would be hard to keep track of otherwise. - -Of course, we can do much better and design a function that performs the procedure on an entire mesh. - -```{code-cell} ipython3 -def divergence_rate(mesh,num_iter=10,radius=2): - - z = mesh.copy() - diverge_len = np.zeros(mesh.shape) #Keep tally of the number of iterations - - for i in range(num_iter): - #Iterate on element if and only if |element| < radius (Otherwise assume divergence) - diverge_len[np.abs(z) < radius] += 1 - z[np.abs(z) < radius] = f(z[np.abs(z)< radius]) - - - return diverge_len -``` - -The behaviour of this function may look confusing at first glance, so it will help to explain some of the notation. - -Our goal is to iterate over each value in the mesh and to tally the number of iterations before the value diverges. Since some values will diverge quicker than others, we need a procedure that only iterates over values that have an absolute value that is sufficiently small enough. We also want to stop tallying values once they surpass the radius. For this, we can use **Boolean Indexing**, a NumPy procedure that when paired with Universal Functions is unbeatable. Boolean Indexing allows for operations to be performed conditionally on a NumPy array without having to resort to looping over and checking for each array value individually. - -In our case, we use a loop to apply iterations to our function $f(z) = z^2 -1 $ and keep tally. Using Boolean indexing, we only apply the iterations to values that have an absolute value less then 2. - -With that out of the way, we can go about plotting our first fractal! - -```{code-cell} ipython3 -x,y = np.meshgrid(np.arange(-2,2,0.01),np.arange(-2,2,0.01)) -mesh = x + (1j *y) - -output = divergence_rate(mesh) - -fig = plt.figure(figsize=(5,5)) -ax = plt.axes() - -ax.set_title('$f(z) = z^2 -1$') -ax.set_xlabel('Real axis') -ax.set_ylabel('Imaginary axis') - -im = ax.imshow(output,extent=[-2,2,-2,2]) -divider = make_axes_locatable(ax) -cax = divider.append_axes("right", size="5%", pad=0.1) -plt.colorbar(im, cax=cax, label = 'Number of iterations'); -``` - -What this stunning visual conveys is the complexity of the function’s behaviour. The yellow region represents values that remain small, while the purple region represents the divergent values. The beautiful pattern that arises on the border of the converging and diverging values is even more fascinating when you realize that it is created from such a simple function. - -+++ - -# Mandelbrot - -What we just explored was an example of a fractal found in the Mandelbrot set. We can write a more generalized version of the above function to gain access to a wider range of fractals. - -Mandelbrot fractals are of the form of $f(z) = z^2 + c$ where c is a fixed complex number. - -```{code-cell} ipython3 -def mandelbrot(mesh,c=-1,num_iter=10,radius=2): - - z = mesh.copy() - diverge_len = np.zeros(z.shape) - - for i in range(num_iter): - z[np.abs(z)< radius] = np.square(z[np.abs(z)< radius]) + c - diverge_len[np.abs(z)< radius] += 1 - - return diverge_len -``` - -To make our lives easier, we will create a couple meshes that we will reuse throughout the rest of the examples. - -```{code-cell} ipython3 -x,y = np.meshgrid(np.arange(-1,1,0.005),np.arange(-1,1,0.005)) -small_mesh = x + (1j*y) - -x,y = np.meshgrid(np.arange(-2,2,0.01),np.arange(-2,2,0.01)) -mesh = x + (1j *y) -``` - -We will also write a function that we will use to create our fractal plots. - -```{code-cell} ipython3 -def plot_fractal(fractal,title='Fractal',figsize=(6,6),cmap='rainbow',extent=[-2,2,-2,2]): - - fig = plt.figure(figsize=figsize) - ax = plt.axes() - - ax.set_title(f'${title}$') - ax.set_xlabel('Real axis') - ax.set_ylabel('Imaginary axis') - - im = ax.imshow(fractal,extent=extent,cmap=cmap) - divider = make_axes_locatable(ax) - cax = divider.append_axes("right", size="5%", pad=0.1) - plt.colorbar(im, cax=cax, label = 'Number of iterations') - -``` - -Using our newly defined functions, we can make a quick plot of the first fractal again. - -```{code-cell} ipython3 -output = mandelbrot(mesh,num_iter=15) -kwargs = {'title':'f(z) = z^2 -1'} - -plot_fractal(output,**kwargs); -``` - -We also can start experimenting with different values of c. It can be surprising how much influence it has on the shape of the fractal. - -For example, setting $c = \frac{\pi}{10}$ gives us a very elegent cloud shape, while setting c = $-\frac{3}{4} + 0.4i$ yields a completely different pattern. - -```{code-cell} ipython3 -output = mandelbrot(mesh,c=np.pi/10,num_iter=20) -kwargs = {'title':'f(z) = z^2 + \dfrac{\pi}{10}', 'cmap':'plasma'} - -plot_fractal(output,**kwargs); -``` - -```{code-cell} ipython3 -output = mandelbrot(mesh,c= -0.75 + 0.4j,num_iter=20) -kwargs = {'title':'f(z) = z^2 - \dfrac{3}{4} + 0.4i', 'cmap':'Greens_r'} - -plot_fractal(output,**kwargs); -``` - -# Generalizing the Mandelbrot function - -We can generalize our Mandelbrot function even further by giving it a parameter for which Universal Function we would like to pass in. This would allow us to plot fractals of the form $f(z) = g(z) + c$ where g is a Universal Function selected by us. - -```{code-cell} ipython3 -def general_mandelbrot(mesh,c=-1,f=np.square,num_iter=100,radius=2): - - z = mesh.copy() - diverge_len = np.zeros(z.shape) - - for i in range(num_iter): - z[np.abs(z)< radius] = f(z[np.abs(z)< radius]) + c - diverge_len[np.abs(z)< radius] += 1 - - return diverge_len -``` - -One cool set of fractals that can be plotted using our general Mandelbrot function are ones of the form $f(z) = z^n + c$ for some positive integer n. A very cool pattern which emerges is that the number of regions that 'stick out' matches the degree in which we raise the function to while iterating over it. - -```{code-cell} ipython3 -fig, axes = plt.subplots(2,3,figsize=(8,8)) -degree = 2 - -for i in range(2): - for j in range(3): - - power = lambda z: np.power(z,degree) #Create power function for current degree - - diverge_len = general_mandelbrot(mesh,f=power,num_iter=15) - axes[i,j].imshow(diverge_len,extent=[-2,2,-2,2],cmap='binary') - axes[i,j].set_title(f'$f(z) = z^{degree} -1$') - - degree += 1 - -fig.tight_layout(); -``` - -Needless to say, there is a large amount of exploring that can be done by fiddling with the inputted function, value of c, number of iterations, radius and even the density of the mesh and choice of colours. - -+++ - -## Newton Fractals - -Newton fractals are a specific class of fractals, where iterations involve adding or subtracting the ratio of a function (often a polynomial) and its derivative to the input values. Mathematically, it can be expressed as: - -$z := z - \frac{f(z)}{f'(z)}$ - -We will define a general version of the fractal which will allow for different variations to be plotted by passing in our functions of choice. - -```{code-cell} ipython3 -def newton_fractal(mesh,f,df,num_iter=10,r=2): - - z = mesh.copy() - diverge_len = np.zeros(z.shape) - - for i in range(num_iter): - pz = f(z[np.abs(z) Date: Thu, 22 Jul 2021 09:54:29 -0400 Subject: [PATCH 13/34] Added links to documentation Added documentation links for Universal Functions, meshgrid, 3d scatterplots, Boolean indexing and imshow. Also added wiki links for the prerequisite materials. --- content/tutorial-plotting-fractals.md | 558 ++++++++++++++++++++++++++ 1 file changed, 558 insertions(+) create mode 100644 content/tutorial-plotting-fractals.md diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md new file mode 100644 index 00000000..263550b9 --- /dev/null +++ b/content/tutorial-plotting-fractals.md @@ -0,0 +1,558 @@ +--- +jupytext: + formats: ipynb,md:myst + text_representation: + extension: .md + format_name: myst + format_version: 0.13 + jupytext_version: 1.11.4 +kernelspec: + display_name: Python 3 + language: python + name: python3 +--- + +# Plotting Fractals + ++++ + +Fractal picture + ++++ + +Fractals are beautiful, compelling mathematical forms that can be oftentimes created from a relatively simple set of instructions. In nature they can be found in various places, such as coastlines, seashells, and ferns, and even were used in creating certain types of antennas. The mathematical idea of fractals was known for quite some time, but they really began to be truly appreciated in the 1970's as advancements in computer graphics and some accidental discoveries lead researchers like Mandelbrot to stumble upon the truly mystifying visualizations that fractals possess. + +Today we will learn how to plot these beautiful visualizations and will start to do a bit of exploring for ourselves as we gain familiarity of the mathematics behind fractals and will use the ever powerful NumPy universal functions to perform the necessary calculations efficiently. + ++++ + +# What you'll do + +- Write a function for computing Mandelbrot fractals +- Write a function that computes Newton fractals +- Experiment with variations of general fractal types + ++++ + +# What you'll learn + +- A better intuition for how fractals work mathematically +- A basic understanding about NumPy Universal Functions and Boolean Indexing +- The basics of working with complex numbers in NumPy +- How to create your own unique fractal visualizations + ++++ + +# What you'll need + +- [Matplotlib](https://matplotlib.org/) +- make_axis_locatable function from mpl_toolkits API + +which can be imported as follows: + +```{code-cell} ipython3 +import numpy as np +import matplotlib.pyplot as plt +from mpl_toolkits.axes_grid1 import make_axes_locatable +``` + +- Some familiarity with Python, NumPy and matplotlib +- An idea of elementary mathematical functions, such as [exponents](https://en.wikipedia.org/wiki/Exponential_function), [sin](https://en.wikipedia.org/wiki/Sine), [polynomials](https://en.wikipedia.org/wiki/Polynomial) etc +- A very basic understanding of [complex numbers](https://en.wikipedia.org/wiki/Complex_number) would be useful +- Knowledge of [derivatives](https://en.wikipedia.org/wiki/Derivative) may be helpful + ++++ + +# Warmup + +To gain some intuition for what fractals are, we will begin with an example. + +Consider the following equation: + +$f(z) = z^2 -1 $ + +where z is a complex number (i.e of the form $a + bi$ ) + +For our convenience, we will write a Python function for it + +```{code-cell} ipython3 +def f(z): + return np.square(z) - 1 +``` + +Note that the square function we used is an example of a **[NumPy Universal Function](https://numpy.org/doc/stable/reference/ufuncs.html)**; we will come back to the significance of this decision shortly. + +To gain some intuition for the behaviour of the function, we can try plugging in some different values. + +For z = 0, we would expect to get -1 + +```{code-cell} ipython3 +f(0) +``` + +Some values grow, some values shrink, some don't experience much change. + +```{code-cell} ipython3 +np.round(f(4),2), np.round(f(1 - 0.2j),2), np.round(f(1.6),2) +``` + +To see the behaviour of the function on a larger scale, we can apply the function to a subset of the complex plane and plot the result. To create our subset (or mesh), we can make use of the [**meshgrid**](https://numpy.org/doc/stable/reference/generated/numpy.meshgrid.html) function. + +```{code-cell} ipython3 +x,y = np.meshgrid(np.arange(-10,10,1),np.arange(-10,10,1)) +mesh = x + (1j *y) #Make mesh of complex plane +``` + +Now we will apply our function to each value contained in the mesh. Since we used a Universal Function in our design, this means that we can pass in the entire mesh all at once. This is extremely convenient for two reasons: It reduces the amount of code needed to be written and greatly increases the efficiency (as Universal Functions make use of system level C programming in their computations). + + +Here we plot the absolute value (or modulus) of each element in the mesh after one “iteration” of the function using a [**3D scatterplot**](https://matplotlib.org/2.0.2/mpl_toolkits/mplot3d/tutorial.html#scatter-plots): + +```{code-cell} ipython3 +output = np.abs(f(mesh)) #Take the absolute value of the output (for plotting) + +fig = plt.figure() +ax = plt.axes(projection='3d') + +ax.scatter(x,y,output,alpha=0.2) + +ax.set_xlabel('Real axis') +ax.set_ylabel('Imaginary axis') +ax.set_zlabel('Absolute value') +ax.set_title('One Iteration: $ f(z) = z^2 - 1$'); +``` + +This gives us a rough idea of what one iteration of the function does. Certain areas (notably in the areas closest to (0,0i)) remain rather small while other areas grow quite considerably. Note that we lose information about the output by taking the absolute value, but it is the only way for us to be able to make a plot. + +Let’s see what happens when we apply 2 iterations to the mesh: + +```{code-cell} ipython3 +output = np.abs(f(f(mesh))) + +ax = plt.axes(projection='3d') + +ax.scatter(x,y,output,alpha=0.2) + +ax.set_xlabel('Real axis') +ax.set_ylabel('Imaginary axis') +ax.set_zlabel('Absolute value') +ax.set_title('Two Iterations: $ f(z) = z^2 - 1$'); +``` + +Once again, we see that values around the origin remain small, and values with a larger absolute value (or modulus) “explode”. + +From first impression, its behaviour appears to be normal, and may even seem mundane. Fractals tend to have more to them then what meets the eye; the exotic behavior shows itself when we begin applying more iterations. + ++++ + +Consider three complex numbers: + +$z_1 = 0.4 + 0.4i $, + +$z_2 = z_1 + 0.1$, + +$z_3 = z_1 + 0.1i$ + +Given the shape of our first two plots, we would expect that these values would remain near the origin as we apply iterations to them. Let us see what happens when we apply 10 iterations to each value: + +```{code-cell} ipython3 +selected_values = np.array([0.4 + 0.4j, 0.41 + 0.4j, 0.4 + 0.41j]) +for cur_val in selected_values: + + outputs = np.zeros(10,dtype=complex) + outputs[0] = cur_val + + for i in range(9): + outputs[i+1] = f(outputs[i]) #Apply 10 iterations, save each output + + index = np.arange(0,10) + + + fig = plt.figure(figsize=(5,5)) + ax = plt.axes() + + ax.set_xlabel('Real axis') + ax.set_ylabel('Imaginary axis') + ax.set_title(f'Mapping of iterations on {cur_val}') + + cycle = ax.scatter(np.real(outputs),np.imag(outputs),c=index,alpha=0.6); + fig.colorbar(cycle,label='Iteration'); +``` + +To our surprise, the behaviour of the function did not come close to matching our hypothesis. This is a prime example of the chaotic behaviour fractals possess. In the first two plots, the value "exploded" on the last iteration, jumping way beyond the region that it was contained in previously. The third plot on the other hand remained bounded to a small region close to the origin, yielding completely different behaviour despite the tiny change in value. + +This leads us to an extremely important question: **How many iterations can be applied to each value before they diverge (“explode”)?** + +As we saw from the first two plots, the further the values were from the origin, the faster they generally exploded. Although the behaviour is uncertain for smaller values (like $z_1, z_2, z_3$), we can assume that if a value surpasses a certain distance from the origin (say 2) that it is doomed to diverge. We will call this threshold the **radius**. + +This allows us to quantify the behaviour of the function for a particular value without having to perform as many computations. Once the radius is surpassed, we are allowed to stop iterating, which gives us a way of answering the question we posed. If we tally how many computations were applied before divergence, we gain insight into the behaviour of the function that would be hard to keep track of otherwise. + +Of course, we can do much better and design a function that performs the procedure on an entire mesh. + +```{code-cell} ipython3 +def divergence_rate(mesh,num_iter=10,radius=2): + + z = mesh.copy() + diverge_len = np.zeros(mesh.shape) #Keep tally of the number of iterations + + for i in range(num_iter): + #Iterate on element if and only if |element| < radius (Otherwise assume divergence) + diverge_len[np.abs(z) < radius] += 1 + z[np.abs(z) < radius] = f(z[np.abs(z)< radius]) + + + return diverge_len +``` + +The behaviour of this function may look confusing at first glance, so it will help to explain some of the notation. + +Our goal is to iterate over each value in the mesh and to tally the number of iterations before the value diverges. Since some values will diverge quicker than others, we need a procedure that only iterates over values that have an absolute value that is sufficiently small enough. We also want to stop tallying values once they surpass the radius. For this, we can use **[Boolean Indexing](https://numpy.org/devdocs/reference/arrays.indexing.html#boolean-array-indexing)**, a NumPy procedure that when paired with Universal Functions is unbeatable. Boolean Indexing allows for operations to be performed conditionally on a NumPy array without having to resort to looping over and checking for each array value individually. + +In our case, we use a loop to apply iterations to our function $f(z) = z^2 -1 $ and keep tally. Using Boolean indexing, we only apply the iterations to values that have an absolute value less then 2. + +With that out of the way, we can go about plotting our first fractal! We will use the [**imshow**](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html) function to create a colour-coded visualization of the tallies. + +```{code-cell} ipython3 +x,y = np.meshgrid(np.arange(-2,2,0.01),np.arange(-2,2,0.01)) +mesh = x + (1j *y) + +output = divergence_rate(mesh) + +fig = plt.figure(figsize=(5,5)) +ax = plt.axes() + +ax.set_title('$f(z) = z^2 -1$') +ax.set_xlabel('Real axis') +ax.set_ylabel('Imaginary axis') + +im = ax.imshow(output,extent=[-2,2,-2,2]) +divider = make_axes_locatable(ax) +cax = divider.append_axes("right", size="5%", pad=0.1) +plt.colorbar(im, cax=cax, label = 'Number of iterations'); +``` + +What this stunning visual conveys is the complexity of the function’s behaviour. The yellow region represents values that remain small, while the purple region represents the divergent values. The beautiful pattern that arises on the border of the converging and diverging values is even more fascinating when you realize that it is created from such a simple function. + ++++ + +# Mandelbrot + +What we just explored was an example of a fractal found in the Mandelbrot set. We can write a more generalized version of the above function to gain access to a wider range of fractals. + +Mandelbrot fractals are of the form of $f(z) = z^2 + c$ where c is a fixed complex number. + +```{code-cell} ipython3 +def mandelbrot(mesh,c=-1,num_iter=10,radius=2): + + z = mesh.copy() + diverge_len = np.zeros(z.shape) + + for i in range(num_iter): + z[np.abs(z)< radius] = np.square(z[np.abs(z)< radius]) + c + diverge_len[np.abs(z)< radius] += 1 + + return diverge_len +``` + +To make our lives easier, we will create a couple meshes that we will reuse throughout the rest of the examples. + +```{code-cell} ipython3 +x,y = np.meshgrid(np.arange(-1,1,0.005),np.arange(-1,1,0.005)) +small_mesh = x + (1j*y) + +x,y = np.meshgrid(np.arange(-2,2,0.01),np.arange(-2,2,0.01)) +mesh = x + (1j *y) +``` + +We will also write a function that we will use to create our fractal plots. + +```{code-cell} ipython3 +def plot_fractal(fractal,title='Fractal',figsize=(6,6),cmap='rainbow',extent=[-2,2,-2,2]): + + fig = plt.figure(figsize=figsize) + ax = plt.axes() + + ax.set_title(f'${title}$') + ax.set_xlabel('Real axis') + ax.set_ylabel('Imaginary axis') + + im = ax.imshow(fractal,extent=extent,cmap=cmap) + divider = make_axes_locatable(ax) + cax = divider.append_axes("right", size="5%", pad=0.1) + plt.colorbar(im, cax=cax, label = 'Number of iterations') + +``` + +Using our newly defined functions, we can make a quick plot of the first fractal again. + +```{code-cell} ipython3 +output = mandelbrot(mesh,num_iter=15) +kwargs = {'title':'f(z) = z^2 -1'} + +plot_fractal(output,**kwargs); +``` + +We also can start experimenting with different values of c. It can be surprising how much influence it has on the shape of the fractal. + +For example, setting $c = \frac{\pi}{10}$ gives us a very elegent cloud shape, while setting c = $-\frac{3}{4} + 0.4i$ yields a completely different pattern. + +```{code-cell} ipython3 +output = mandelbrot(mesh,c=np.pi/10,num_iter=20) +kwargs = {'title':'f(z) = z^2 + \dfrac{\pi}{10}', 'cmap':'plasma'} + +plot_fractal(output,**kwargs); +``` + +```{code-cell} ipython3 +output = mandelbrot(mesh,c= -0.75 + 0.4j,num_iter=20) +kwargs = {'title':'f(z) = z^2 - \dfrac{3}{4} + 0.4i', 'cmap':'Greens_r'} + +plot_fractal(output,**kwargs); +``` + +# Generalizing the Mandelbrot function + +We can generalize our Mandelbrot function even further by giving it a parameter for which Universal Function we would like to pass in. This would allow us to plot fractals of the form $f(z) = g(z) + c$ where g is a Universal Function selected by us. + +```{code-cell} ipython3 +def general_mandelbrot(mesh,c=-1,f=np.square,num_iter=100,radius=2): + + z = mesh.copy() + diverge_len = np.zeros(z.shape) + + for i in range(num_iter): + z[np.abs(z)< radius] = f(z[np.abs(z)< radius]) + c + diverge_len[np.abs(z)< radius] += 1 + + return diverge_len +``` + +One cool set of fractals that can be plotted using our general Mandelbrot function are ones of the form $f(z) = z^n + c$ for some positive integer n. A very cool pattern which emerges is that the number of regions that 'stick out' matches the degree in which we raise the function to while iterating over it. + +```{code-cell} ipython3 +fig, axes = plt.subplots(2,3,figsize=(8,8)) +degree = 2 + +for i in range(2): + for j in range(3): + + power = lambda z: np.power(z,degree) #Create power function for current degree + + diverge_len = general_mandelbrot(mesh,f=power,num_iter=15) + axes[i,j].imshow(diverge_len,extent=[-2,2,-2,2],cmap='binary') + axes[i,j].set_title(f'$f(z) = z^{degree} -1$') + + degree += 1 + +fig.tight_layout(); +``` + +Needless to say, there is a large amount of exploring that can be done by fiddling with the inputted function, value of c, number of iterations, radius and even the density of the mesh and choice of colours. + ++++ + +## Newton Fractals + +Newton fractals are a specific class of fractals, where iterations involve adding or subtracting the ratio of a function (often a polynomial) and its derivative to the input values. Mathematically, it can be expressed as: + +$z := z - \frac{f(z)}{f'(z)}$ + +We will define a general version of the fractal which will allow for different variations to be plotted by passing in our functions of choice. + +```{code-cell} ipython3 +def newton_fractal(mesh,f,df,num_iter=10,r=2): + + z = mesh.copy() + diverge_len = np.zeros(z.shape) + + for i in range(num_iter): + pz = f(z[np.abs(z) Date: Sun, 25 Jul 2021 13:15:38 +0300 Subject: [PATCH 14/34] Fix heading levels. --- content/tutorial-plotting-fractals.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md index 263550b9..457a9411 100644 --- a/content/tutorial-plotting-fractals.md +++ b/content/tutorial-plotting-fractals.md @@ -26,7 +26,7 @@ Today we will learn how to plot these beautiful visualizations and will start to +++ -# What you'll do +## What you'll do - Write a function for computing Mandelbrot fractals - Write a function that computes Newton fractals @@ -34,7 +34,7 @@ Today we will learn how to plot these beautiful visualizations and will start to +++ -# What you'll learn +## What you'll learn - A better intuition for how fractals work mathematically - A basic understanding about NumPy Universal Functions and Boolean Indexing @@ -43,7 +43,7 @@ Today we will learn how to plot these beautiful visualizations and will start to +++ -# What you'll need +## What you'll need - [Matplotlib](https://matplotlib.org/) - make_axis_locatable function from mpl_toolkits API @@ -63,7 +63,7 @@ from mpl_toolkits.axes_grid1 import make_axes_locatable +++ -# Warmup +## Warmup To gain some intuition for what fractals are, we will begin with an example. @@ -235,7 +235,7 @@ What this stunning visual conveys is the complexity of the function’s behaviou +++ -# Mandelbrot +## Mandelbrot What we just explored was an example of a fractal found in the Mandelbrot set. We can write a more generalized version of the above function to gain access to a wider range of fractals. @@ -310,7 +310,7 @@ kwargs = {'title':'f(z) = z^2 - \dfrac{3}{4} + 0.4i', 'cmap':'Greens_r'} plot_fractal(output,**kwargs); ``` -# Generalizing the Mandelbrot function +## Generalizing the Mandelbrot function We can generalize our Mandelbrot function even further by giving it a parameter for which Universal Function we would like to pass in. This would allow us to plot fractals of the form $f(z) = g(z) + c$ where g is a Universal Function selected by us. @@ -351,7 +351,7 @@ Needless to say, there is a large amount of exploring that can be done by fiddli +++ -## Newton Fractals +### Newton Fractals Newton fractals are a specific class of fractals, where iterations involve adding or subtracting the ratio of a function (often a polynomial) and its derivative to the input values. Mathematically, it can be expressed as: @@ -456,7 +456,7 @@ It is truly fascinating how distinct yet similar these fractals are with each ot +++ -# Creating your own fractals +## Creating your own fractals What makes fractals more exciting is how much there is to explore once you become familiar with the basics. Now we will wrap up our tutorial by exploring some of the different ways one can experiment in creating unique fractals. I encourage you to try some things out on your own (if you have not done so already). @@ -531,7 +531,7 @@ Needless to say, there are a nearly endless supply of interesting fractal creati +++ -# In conclusion +## In conclusion We learned a lot about generating fractals today. We saw how complicated fractals requiring many iterations could be computed efficiently using Universal Functions. We also took advantage of boolean indexing, which allowed for less computations to be made without having to individually verify each value. Finally, we learned a lot about fractals themselves. As a recap: @@ -543,7 +543,7 @@ We learned a lot about generating fractals today. We saw how complicated fractal +++ -# On your own +## On your own - Play around with the parameters of the Mandelbrot function, try playing with the constant value, number of iterations, function choice, radius, and colour choice. @@ -551,7 +551,7 @@ We learned a lot about generating fractals today. We saw how complicated fractal +++ -# Further reading +## Further reading More information on the theory behind fractals - https://en.wikipedia.org/wiki/Fractal From 72ab103280b840d1eb9fee9e46a83532be91866a Mon Sep 17 00:00:00 2001 From: Ross Barnowski Date: Sun, 25 Jul 2021 13:18:35 +0300 Subject: [PATCH 15/34] html img tag -> markdown for initial img. --- content/tutorial-plotting-fractals.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md index 457a9411..eaeccf5d 100644 --- a/content/tutorial-plotting-fractals.md +++ b/content/tutorial-plotting-fractals.md @@ -16,7 +16,7 @@ kernelspec: +++ -Fractal picture +![Fractal picture](tutorial-plotting-fractals/fractal.png) +++ From 5d812146ddd836e0be8c4f62d0512231d15e4423 Mon Sep 17 00:00:00 2001 From: Ross Barnowski Date: Mon, 26 Jul 2021 13:03:09 +0300 Subject: [PATCH 16/34] Temporary fix for CI dependency problem. --- .circleci/config.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index dc5d4bf9..600b51c6 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -20,7 +20,8 @@ jobs: command: | python3 -m venv venv source venv/bin/activate - pip install --upgrade pip wheel setuptools + pip install pip==21.1.1 + pip install --upgrade wheel setuptools pip install -r site/requirements.txt -r requirements.txt - restore_cache: From 4665e0c8fccd03dee784600305e1a613e46f452b Mon Sep 17 00:00:00 2001 From: MichaelRipa <51883134+MichaelRipa@users.noreply.github.com> Date: Mon, 26 Jul 2021 12:27:39 -0400 Subject: [PATCH 17/34] Update content/tutorial-plotting-fractals.md This looks far better, and fixing up ufunc comments should be pretty easy. Co-authored-by: Ross Barnowski --- content/tutorial-plotting-fractals.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md index eaeccf5d..7c61c40c 100644 --- a/content/tutorial-plotting-fractals.md +++ b/content/tutorial-plotting-fractals.md @@ -93,7 +93,8 @@ f(0) Some values grow, some values shrink, some don't experience much change. ```{code-cell} ipython3 -np.round(f(4),2), np.round(f(1 - 0.2j),2), np.round(f(1.6),2) +z = [4, 1-0.2j, 1.6] +f(z) ``` To see the behaviour of the function on a larger scale, we can apply the function to a subset of the complex plane and plot the result. To create our subset (or mesh), we can make use of the [**meshgrid**](https://numpy.org/doc/stable/reference/generated/numpy.meshgrid.html) function. From 1dcec30f3edb7469dd862e640a70823041c8150b Mon Sep 17 00:00:00 2001 From: MichaelRipa <51883134+MichaelRipa@users.noreply.github.com> Date: Mon, 26 Jul 2021 12:30:10 -0400 Subject: [PATCH 18/34] Update content/tutorial-plotting-fractals.md Co-authored-by: Ross Barnowski --- content/tutorial-plotting-fractals.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md index 7c61c40c..64e9bf4d 100644 --- a/content/tutorial-plotting-fractals.md +++ b/content/tutorial-plotting-fractals.md @@ -100,8 +100,8 @@ f(z) To see the behaviour of the function on a larger scale, we can apply the function to a subset of the complex plane and plot the result. To create our subset (or mesh), we can make use of the [**meshgrid**](https://numpy.org/doc/stable/reference/generated/numpy.meshgrid.html) function. ```{code-cell} ipython3 -x,y = np.meshgrid(np.arange(-10,10,1),np.arange(-10,10,1)) -mesh = x + (1j *y) #Make mesh of complex plane +x, y = np.meshgrid(np.arange(-10,10),np.arange(-10,10)) +mesh = x + (1j *y) # Make mesh of complex plane ``` Now we will apply our function to each value contained in the mesh. Since we used a Universal Function in our design, this means that we can pass in the entire mesh all at once. This is extremely convenient for two reasons: It reduces the amount of code needed to be written and greatly increases the efficiency (as Universal Functions make use of system level C programming in their computations). From 9d74eb380ea51c0ba1c35d21a13bd7f9fd0c4d28 Mon Sep 17 00:00:00 2001 From: MichaelRipa <51883134+MichaelRipa@users.noreply.github.com> Date: Mon, 26 Jul 2021 12:53:06 -0400 Subject: [PATCH 19/34] Update content/tutorial-plotting-fractals.md I like this update, the code looks more compact, and has taught me some new syntax! Co-authored-by: Ross Barnowski --- content/tutorial-plotting-fractals.md | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md index 64e9bf4d..e5253d3e 100644 --- a/content/tutorial-plotting-fractals.md +++ b/content/tutorial-plotting-fractals.md @@ -332,19 +332,16 @@ One cool set of fractals that can be plotted using our general Mandelbrot functi ```{code-cell} ipython3 fig, axes = plt.subplots(2,3,figsize=(8,8)) -degree = 2 +base_degree = 2 -for i in range(2): - for j in range(3): - - power = lambda z: np.power(z,degree) #Create power function for current degree +for deg, ax in enumerate(axes.ravel()): + degree = base_degree + deg + power = lambda z: np.power(z,degree) #Create power function for current degree + + diverge_len = general_mandelbrot(mesh,f=power,num_iter=15) + ax.imshow(diverge_len,extent=[-2,2,-2,2],cmap='binary') + ax.set_title(f'$f(z) = z^{degree} -1$') - diverge_len = general_mandelbrot(mesh,f=power,num_iter=15) - axes[i,j].imshow(diverge_len,extent=[-2,2,-2,2],cmap='binary') - axes[i,j].set_title(f'$f(z) = z^{degree} -1$') - - degree += 1 - fig.tight_layout(); ``` From fd96bdf14708b741d32dcec2f078c86a18ee3d4c Mon Sep 17 00:00:00 2001 From: MichaelRipa <51883134+MichaelRipa@users.noreply.github.com> Date: Mon, 26 Jul 2021 12:55:00 -0400 Subject: [PATCH 20/34] Update content/tutorial-plotting-fractals.md Did not know about the Polynomial package, will do some reading and will briefly touch on it in my next commit. Co-authored-by: Ross Barnowski --- content/tutorial-plotting-fractals.md | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md index e5253d3e..2baf4c37 100644 --- a/content/tutorial-plotting-fractals.md +++ b/content/tutorial-plotting-fractals.md @@ -373,24 +373,21 @@ def newton_fractal(mesh,f,df,num_iter=10,r=2): ``` Now we can experiment with some different polynomials. +For example, let's try a higher-degree polynomial: -For $p(z) = z^8 + 15 z^4 - 16$, we have - - -$\frac{dp}{dz} = 8z^7 + 60z^3$. +```{code-cell} ipython3 +p = np.polynomial.Polynomial([-16, 0, 0, 0, 15, 0, 0, 0, 1]) +p +``` -Putting the polynomials to code and calling the function gives us: +which has the derivative: ```{code-cell} ipython3 -def poly(z): - return np.power(z,8) + 15* np.power(z,4) -16 - -def derivative(z): - return 8* np.power(z,7) + 60 * np.power(z,3) +p.deriv() ``` ```{code-cell} ipython3 -output = newton_fractal(mesh,poly,derivative,num_iter=15,r=2) +output = newton_fractal(mesh,p ,p.deriv(), num_iter=15,r=2) kwargs = {'title':'f(z) = z - \dfrac{(z^8 + 15z^4 - 16)}{(8z^7 + 60z^3)}', 'cmap':'copper'} plot_fractal(output,**kwargs) From 508055e4efe3763fa355d88c158c146f033ae75f Mon Sep 17 00:00:00 2001 From: MichaelRipa <51883134+MichaelRipa@users.noreply.github.com> Date: Sun, 8 Aug 2021 08:49:43 -0400 Subject: [PATCH 21/34] Update content/tutorial-plotting-fractals.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Melissa Weber Mendonça --- content/tutorial-plotting-fractals.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md index 2baf4c37..cfafef0c 100644 --- a/content/tutorial-plotting-fractals.md +++ b/content/tutorial-plotting-fractals.md @@ -20,7 +20,7 @@ kernelspec: +++ -Fractals are beautiful, compelling mathematical forms that can be oftentimes created from a relatively simple set of instructions. In nature they can be found in various places, such as coastlines, seashells, and ferns, and even were used in creating certain types of antennas. The mathematical idea of fractals was known for quite some time, but they really began to be truly appreciated in the 1970's as advancements in computer graphics and some accidental discoveries lead researchers like Mandelbrot to stumble upon the truly mystifying visualizations that fractals possess. +Fractals are beautiful, compelling mathematical forms that can be oftentimes created from a relatively simple set of instructions. In nature they can be found in various places, such as coastlines, seashells, and ferns, and even were used in creating certain types of antennas. The mathematical idea of fractals was known for quite some time, but they really began to be truly appreciated in the 1970's as advancements in computer graphics and some accidental discoveries lead researchers like [Benoît Mandelbrot](https://en.wikipedia.org/wiki/Benoit_Mandelbrot) to stumble upon the truly mystifying visualizations that fractals possess. Today we will learn how to plot these beautiful visualizations and will start to do a bit of exploring for ourselves as we gain familiarity of the mathematics behind fractals and will use the ever powerful NumPy universal functions to perform the necessary calculations efficiently. From 0d038d6de14ae5139f7905a20fb3a70f7e71b6e7 Mon Sep 17 00:00:00 2001 From: MichaelRipa <51883134+MichaelRipa@users.noreply.github.com> Date: Sun, 8 Aug 2021 08:50:08 -0400 Subject: [PATCH 22/34] Update content/tutorial-plotting-fractals.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Melissa Weber Mendonça --- content/tutorial-plotting-fractals.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md index cfafef0c..b8ff6e32 100644 --- a/content/tutorial-plotting-fractals.md +++ b/content/tutorial-plotting-fractals.md @@ -46,7 +46,7 @@ Today we will learn how to plot these beautiful visualizations and will start to ## What you'll need - [Matplotlib](https://matplotlib.org/) -- make_axis_locatable function from mpl_toolkits API +- `make_axis_locatable` function from mpl_toolkits API which can be imported as follows: From 0568965b826e72443076e6b50cdc059a65e856b0 Mon Sep 17 00:00:00 2001 From: MichaelRipa <51883134+MichaelRipa@users.noreply.github.com> Date: Sun, 8 Aug 2021 08:50:25 -0400 Subject: [PATCH 23/34] Update content/tutorial-plotting-fractals.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Melissa Weber Mendonça --- content/tutorial-plotting-fractals.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md index b8ff6e32..b727f058 100644 --- a/content/tutorial-plotting-fractals.md +++ b/content/tutorial-plotting-fractals.md @@ -84,7 +84,7 @@ Note that the square function we used is an example of a **[NumPy Universal Func To gain some intuition for the behaviour of the function, we can try plugging in some different values. -For z = 0, we would expect to get -1 +For $z = 0$, we would expect to get $-1$: ```{code-cell} ipython3 f(0) From 54e34db17c8179075384540fa5c9da202788a533 Mon Sep 17 00:00:00 2001 From: MichaelRipa <51883134+MichaelRipa@users.noreply.github.com> Date: Sun, 8 Aug 2021 08:50:45 -0400 Subject: [PATCH 24/34] Update content/tutorial-plotting-fractals.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Melissa Weber Mendonça --- content/tutorial-plotting-fractals.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md index b727f058..10f6c1de 100644 --- a/content/tutorial-plotting-fractals.md +++ b/content/tutorial-plotting-fractals.md @@ -71,7 +71,7 @@ Consider the following equation: $f(z) = z^2 -1 $ -where z is a complex number (i.e of the form $a + bi$ ) +where `z` is a complex number (i.e of the form $a + bi$ ) For our convenience, we will write a Python function for it From 3bbe1272a97eb5fdc78ecae67414da1c273a4b84 Mon Sep 17 00:00:00 2001 From: MichaelRipa <51883134+MichaelRipa@users.noreply.github.com> Date: Sun, 8 Aug 2021 08:54:35 -0400 Subject: [PATCH 25/34] Update content/tutorial-plotting-fractals.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Melissa Weber Mendonça --- content/tutorial-plotting-fractals.md | 1 - 1 file changed, 1 deletion(-) diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md index 10f6c1de..c95a88b5 100644 --- a/content/tutorial-plotting-fractals.md +++ b/content/tutorial-plotting-fractals.md @@ -201,7 +201,6 @@ def divergence_rate(mesh,num_iter=10,radius=2): diverge_len[np.abs(z) < radius] += 1 z[np.abs(z) < radius] = f(z[np.abs(z)< radius]) - return diverge_len ``` From 5ad66fad5eb331b5ded07532e2aff062d3105254 Mon Sep 17 00:00:00 2001 From: MichaelRipa <51883134+MichaelRipa@users.noreply.github.com> Date: Sun, 8 Aug 2021 08:55:49 -0400 Subject: [PATCH 26/34] Update content/tutorial-plotting-fractals.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Melissa Weber Mendonça --- content/tutorial-plotting-fractals.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md index c95a88b5..04390a9f 100644 --- a/content/tutorial-plotting-fractals.md +++ b/content/tutorial-plotting-fractals.md @@ -206,7 +206,7 @@ def divergence_rate(mesh,num_iter=10,radius=2): The behaviour of this function may look confusing at first glance, so it will help to explain some of the notation. -Our goal is to iterate over each value in the mesh and to tally the number of iterations before the value diverges. Since some values will diverge quicker than others, we need a procedure that only iterates over values that have an absolute value that is sufficiently small enough. We also want to stop tallying values once they surpass the radius. For this, we can use **[Boolean Indexing](https://numpy.org/devdocs/reference/arrays.indexing.html#boolean-array-indexing)**, a NumPy procedure that when paired with Universal Functions is unbeatable. Boolean Indexing allows for operations to be performed conditionally on a NumPy array without having to resort to looping over and checking for each array value individually. +Our goal is to iterate over each value in the mesh and to tally the number of iterations before the value diverges. Since some values will diverge quicker than others, we need a procedure that only iterates over values that have an absolute value that is sufficiently small enough. We also want to stop tallying values once they surpass the radius. For this, we can use **[Boolean Indexing](https://numpy.org/devdocs/reference/arrays.indexing.html#boolean-array-indexing)**, a NumPy feature that when paired with Universal Functions is unbeatable. Boolean Indexing allows for operations to be performed conditionally on a NumPy array without having to resort to looping over and checking for each array value individually. In our case, we use a loop to apply iterations to our function $f(z) = z^2 -1 $ and keep tally. Using Boolean indexing, we only apply the iterations to values that have an absolute value less then 2. From f59f270ad59c8e7c7aac4d4c3d4cda85b6607e3a Mon Sep 17 00:00:00 2001 From: MichaelRipa <51883134+MichaelRipa@users.noreply.github.com> Date: Sun, 8 Aug 2021 08:56:09 -0400 Subject: [PATCH 27/34] Update content/tutorial-plotting-fractals.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Melissa Weber Mendonça --- content/tutorial-plotting-fractals.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md index 04390a9f..f5b0e7c1 100644 --- a/content/tutorial-plotting-fractals.md +++ b/content/tutorial-plotting-fractals.md @@ -294,7 +294,7 @@ plot_fractal(output,**kwargs); We also can start experimenting with different values of c. It can be surprising how much influence it has on the shape of the fractal. -For example, setting $c = \frac{\pi}{10}$ gives us a very elegent cloud shape, while setting c = $-\frac{3}{4} + 0.4i$ yields a completely different pattern. +For example, setting $c = \frac{\pi}{10}$ gives us a very elegant cloud shape, while setting c = $-\frac{3}{4} + 0.4i$ yields a completely different pattern. ```{code-cell} ipython3 output = mandelbrot(mesh,c=np.pi/10,num_iter=20) From d977815c74a915f8c92634c6240ba62c43ac8152 Mon Sep 17 00:00:00 2001 From: MichaelRipa <51883134+MichaelRipa@users.noreply.github.com> Date: Sun, 8 Aug 2021 08:56:17 -0400 Subject: [PATCH 28/34] Update content/tutorial-plotting-fractals.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Melissa Weber Mendonça --- content/tutorial-plotting-fractals.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md index f5b0e7c1..1c09dbcb 100644 --- a/content/tutorial-plotting-fractals.md +++ b/content/tutorial-plotting-fractals.md @@ -473,7 +473,7 @@ kwargs = {'title':'f(z) = tan(z^2)', 'cmap':'gist_stern'} plot_fractal(output,**kwargs); ``` -What happens if we compose our defined function inside of a sin function? +What happens if we compose our defined function inside of a sine function? Let's try defining From cf2eddf4f94f98054b742487c0170432336a5a1d Mon Sep 17 00:00:00 2001 From: MichaelRipa <51883134+MichaelRipa@users.noreply.github.com> Date: Sun, 8 Aug 2021 08:56:41 -0400 Subject: [PATCH 29/34] Update content/tutorial-plotting-fractals.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Melissa Weber Mendonça --- content/tutorial-plotting-fractals.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md index 1c09dbcb..f6219a5d 100644 --- a/content/tutorial-plotting-fractals.md +++ b/content/tutorial-plotting-fractals.md @@ -547,6 +547,5 @@ We learned a lot about generating fractals today. We saw how complicated fractal ## Further reading -More information on the theory behind fractals - https://en.wikipedia.org/wiki/Fractal - -A list of different fractals - https://en.wikipedia.org/wiki/List_of_fractals_by_Hausdorff_dimension +- [More information on the theory behind fractals](https://en.wikipedia.org/wiki/Fractal) +- [A list of different fractals](https://en.wikipedia.org/wiki/List_of_fractals_by_Hausdorff_dimension) From 771c90631c05afab3380ac3aaeb3854daa3e01c9 Mon Sep 17 00:00:00 2001 From: MichaelRipa Date: Tue, 10 Aug 2021 12:52:43 -0400 Subject: [PATCH 30/34] Update content/tutorial-plotting-fractals.md --- content/tutorial-plotting-fractals.md | 284 +++++++++++++++----------- 1 file changed, 160 insertions(+), 124 deletions(-) diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md index f6219a5d..6ffc5a1b 100644 --- a/content/tutorial-plotting-fractals.md +++ b/content/tutorial-plotting-fractals.md @@ -28,7 +28,8 @@ Today we will learn how to plot these beautiful visualizations and will start to ## What you'll do -- Write a function for computing Mandelbrot fractals +- Write a function for plotting various Julia sets +- Create a visualization of the Mandelbrot set - Write a function that computes Newton fractals - Experiment with variations of general fractal types @@ -77,7 +78,7 @@ For our convenience, we will write a Python function for it ```{code-cell} ipython3 def f(z): - return np.square(z) - 1 + return np.square(z) - 1 ``` Note that the square function we used is an example of a **[NumPy Universal Function](https://numpy.org/doc/stable/reference/ufuncs.html)**; we will come back to the significance of this decision shortly. @@ -90,18 +91,20 @@ For $z = 0$, we would expect to get $-1$: f(0) ``` -Some values grow, some values shrink, some don't experience much change. +Since we used a Universal Function in our design, we can compute multiple inputs at the same time: ```{code-cell} ipython3 z = [4, 1-0.2j, 1.6] f(z) ``` +Some values grow, some values shrink, some don't experience much change. + To see the behaviour of the function on a larger scale, we can apply the function to a subset of the complex plane and plot the result. To create our subset (or mesh), we can make use of the [**meshgrid**](https://numpy.org/doc/stable/reference/generated/numpy.meshgrid.html) function. ```{code-cell} ipython3 -x, y = np.meshgrid(np.arange(-10,10),np.arange(-10,10)) -mesh = x + (1j *y) # Make mesh of complex plane +x, y = np.meshgrid(np.linspace(-10, 10, 20), np.linspace(-10, 10, 20)) +mesh = x + (1j * y) # Make mesh of complex plane ``` Now we will apply our function to each value contained in the mesh. Since we used a Universal Function in our design, this means that we can pass in the entire mesh all at once. This is extremely convenient for two reasons: It reduces the amount of code needed to be written and greatly increases the efficiency (as Universal Functions make use of system level C programming in their computations). @@ -110,12 +113,12 @@ Now we will apply our function to each value contained in the mesh. Since we use Here we plot the absolute value (or modulus) of each element in the mesh after one “iteration” of the function using a [**3D scatterplot**](https://matplotlib.org/2.0.2/mpl_toolkits/mplot3d/tutorial.html#scatter-plots): ```{code-cell} ipython3 -output = np.abs(f(mesh)) #Take the absolute value of the output (for plotting) +output = np.abs(f(mesh)) # Take the absolute value of the output (for plotting) fig = plt.figure() ax = plt.axes(projection='3d') - -ax.scatter(x,y,output,alpha=0.2) + +ax.scatter(x, y, output, alpha=0.2) ax.set_xlabel('Real axis') ax.set_ylabel('Imaginary axis') @@ -123,7 +126,7 @@ ax.set_zlabel('Absolute value') ax.set_title('One Iteration: $ f(z) = z^2 - 1$'); ``` -This gives us a rough idea of what one iteration of the function does. Certain areas (notably in the areas closest to (0,0i)) remain rather small while other areas grow quite considerably. Note that we lose information about the output by taking the absolute value, but it is the only way for us to be able to make a plot. +This gives us a rough idea of what one iteration of the function does. Certain areas (notably in the areas closest to $(0,0i)$) remain rather small while other areas grow quite considerably. Note that we lose information about the output by taking the absolute value, but it is the only way for us to be able to make a plot. Let’s see what happens when we apply 2 iterations to the mesh: @@ -132,7 +135,7 @@ output = np.abs(f(f(mesh))) ax = plt.axes(projection='3d') -ax.scatter(x,y,output,alpha=0.2) +ax.scatter(x, y, output, alpha=0.2) ax.set_xlabel('Real axis') ax.set_ylabel('Imaginary axis') @@ -157,27 +160,26 @@ $z_3 = z_1 + 0.1i$ Given the shape of our first two plots, we would expect that these values would remain near the origin as we apply iterations to them. Let us see what happens when we apply 10 iterations to each value: ```{code-cell} ipython3 -selected_values = np.array([0.4 + 0.4j, 0.41 + 0.4j, 0.4 + 0.41j]) +selected_values = np.array([0.4 + 0.4j, 0.41 + 0.4j, 0.4 + 0.41j]) for cur_val in selected_values: - - outputs = np.zeros(10,dtype=complex) + + outputs = np.zeros(10, dtype=complex) outputs[0] = cur_val for i in range(9): - outputs[i+1] = f(outputs[i]) #Apply 10 iterations, save each output - - index = np.arange(0,10) + outputs[i+1] = f(outputs[i]) # Apply 10 iterations, save each output + index = np.linspace(0, 10, 10) - fig = plt.figure(figsize=(5,5)) + fig = plt.figure(figsize=(5, 5)) ax = plt.axes() ax.set_xlabel('Real axis') ax.set_ylabel('Imaginary axis') ax.set_title(f'Mapping of iterations on {cur_val}') - cycle = ax.scatter(np.real(outputs),np.imag(outputs),c=index,alpha=0.6); - fig.colorbar(cycle,label='Iteration'); + cycle = ax.scatter(np.real(outputs), np.imag(outputs), c=index, alpha=0.6) + fig.colorbar(cycle, label='Iteration'); ``` To our surprise, the behaviour of the function did not come close to matching our hypothesis. This is a prime example of the chaotic behaviour fractals possess. In the first two plots, the value "exploded" on the last iteration, jumping way beyond the region that it was contained in previously. The third plot on the other hand remained bounded to a small region close to the origin, yielding completely different behaviour despite the tiny change in value. @@ -191,16 +193,16 @@ This allows us to quantify the behaviour of the function for a particular value Of course, we can do much better and design a function that performs the procedure on an entire mesh. ```{code-cell} ipython3 -def divergence_rate(mesh,num_iter=10,radius=2): - +def divergence_rate(mesh, num_iter=10, radius=2): + z = mesh.copy() - diverge_len = np.zeros(mesh.shape) #Keep tally of the number of iterations - + diverge_len = np.zeros(mesh.shape) # Keep tally of the number of iterations + for i in range(num_iter): - #Iterate on element if and only if |element| < radius (Otherwise assume divergence) + # Iterate on element if and only if |element| < radius (Otherwise assume divergence) diverge_len[np.abs(z) < radius] += 1 - z[np.abs(z) < radius] = f(z[np.abs(z)< radius]) - + z[np.abs(z) < radius] = f(z[np.abs(z) < radius]) + return diverge_len ``` @@ -210,141 +212,167 @@ Our goal is to iterate over each value in the mesh and to tally the number of it In our case, we use a loop to apply iterations to our function $f(z) = z^2 -1 $ and keep tally. Using Boolean indexing, we only apply the iterations to values that have an absolute value less then 2. -With that out of the way, we can go about plotting our first fractal! We will use the [**imshow**](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html) function to create a colour-coded visualization of the tallies. +With that out of the way, we can go about plotting our first fractal! We will use the [**imshow**](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html) function to create a colour-coded visualization of the tallies. ```{code-cell} ipython3 -x,y = np.meshgrid(np.arange(-2,2,0.01),np.arange(-2,2,0.01)) -mesh = x + (1j *y) +x, y = np.meshgrid(np.linspace(-2, 2, 400), np.linspace(-2, 2, 400)) +mesh = x + (1j * y) output = divergence_rate(mesh) -fig = plt.figure(figsize=(5,5)) +fig = plt.figure(figsize=(5, 5)) ax = plt.axes() ax.set_title('$f(z) = z^2 -1$') ax.set_xlabel('Real axis') ax.set_ylabel('Imaginary axis') -im = ax.imshow(output,extent=[-2,2,-2,2]) +im = ax.imshow(output, extent=[-2, 2, -2, 2]) divider = make_axes_locatable(ax) cax = divider.append_axes("right", size="5%", pad=0.1) -plt.colorbar(im, cax=cax, label = 'Number of iterations'); +plt.colorbar(im, cax=cax, label='Number of iterations'); ``` What this stunning visual conveys is the complexity of the function’s behaviour. The yellow region represents values that remain small, while the purple region represents the divergent values. The beautiful pattern that arises on the border of the converging and diverging values is even more fascinating when you realize that it is created from such a simple function. +++ -## Mandelbrot +## Julia set -What we just explored was an example of a fractal found in the Mandelbrot set. We can write a more generalized version of the above function to gain access to a wider range of fractals. +What we just explored was an example of a fractal visualization of a specific Julia Set. -Mandelbrot fractals are of the form of $f(z) = z^2 + c$ where c is a fixed complex number. +Consider the function $f(z) = z^2 + c$ where $c$ is a complex number. The **filled-in Julia set** of $c$ is the set of all complex numbers `z` in which the function converges at $f(z)$. Likewise, the boundary of the filled-in Julia set is what we call the **Julia set**. In our above visualization, we can see that the yellow region represents an approximation of the filled-in Julia set for $c = -1$ and the greenish-yellow border would contain the Julia set. + +To gain access to a wider range of "Julia fractals", we can write a function that allows for different values of $c$ to be passed in: ```{code-cell} ipython3 -def mandelbrot(mesh,c=-1,num_iter=10,radius=2): - +def julia(mesh, c=-1, num_iter=10, radius=2): + z = mesh.copy() - diverge_len = np.zeros(z.shape) - + diverge_len = np.zeros(z.shape) + for i in range(num_iter): - z[np.abs(z)< radius] = np.square(z[np.abs(z)< radius]) + c - diverge_len[np.abs(z)< radius] += 1 - + z[np.abs(z) < radius] = np.square(z[np.abs(z) < radius]) + c + diverge_len[np.abs(z) < radius] += 1 + return diverge_len ``` -To make our lives easier, we will create a couple meshes that we will reuse throughout the rest of the examples. +To make our lives easier, we will create a couple meshes that we will reuse throughout the rest of the examples: ```{code-cell} ipython3 -x,y = np.meshgrid(np.arange(-1,1,0.005),np.arange(-1,1,0.005)) -small_mesh = x + (1j*y) +x, y = np.meshgrid(np.linspace(-1, 1, 400), np.linspace(-1, 1, 400)) +small_mesh = x + (1j * y) -x,y = np.meshgrid(np.arange(-2,2,0.01),np.arange(-2,2,0.01)) -mesh = x + (1j *y) +x, y = np.meshgrid(np.linspace(-2, 2, 400), np.linspace(-2, 2, 400)) +mesh = x + (1j * y) ``` -We will also write a function that we will use to create our fractal plots. +We will also write a function that we will use to create our fractal plots: ```{code-cell} ipython3 -def plot_fractal(fractal,title='Fractal',figsize=(6,6),cmap='rainbow',extent=[-2,2,-2,2]): +def plot_fractal(fractal, title='Fractal', figsize=(6, 6), cmap='rainbow', extent=[-2, 2, -2, 2]): - fig = plt.figure(figsize=figsize) + plt.figure(figsize=figsize) ax = plt.axes() ax.set_title(f'${title}$') ax.set_xlabel('Real axis') ax.set_ylabel('Imaginary axis') - im = ax.imshow(fractal,extent=extent,cmap=cmap) + im = ax.imshow(fractal, extent=extent, cmap=cmap) divider = make_axes_locatable(ax) cax = divider.append_axes("right", size="5%", pad=0.1) - plt.colorbar(im, cax=cax, label = 'Number of iterations') - + plt.colorbar(im, cax=cax, label='Number of iterations') ``` -Using our newly defined functions, we can make a quick plot of the first fractal again. +Using our newly defined functions, we can make a quick plot of the first fractal again: ```{code-cell} ipython3 -output = mandelbrot(mesh,num_iter=15) -kwargs = {'title':'f(z) = z^2 -1'} +output = julia(mesh, num_iter=15) +kwargs = {'title': 'f(z) = z^2 -1'} -plot_fractal(output,**kwargs); +plot_fractal(output, **kwargs); ``` -We also can start experimenting with different values of c. It can be surprising how much influence it has on the shape of the fractal. +We also can explore some different Julia sets by experimenting with different values of $c$. It can be surprising how much influence it has on the shape of the fractal. For example, setting $c = \frac{\pi}{10}$ gives us a very elegant cloud shape, while setting c = $-\frac{3}{4} + 0.4i$ yields a completely different pattern. ```{code-cell} ipython3 -output = mandelbrot(mesh,c=np.pi/10,num_iter=20) -kwargs = {'title':'f(z) = z^2 + \dfrac{\pi}{10}', 'cmap':'plasma'} +output = julia(mesh, c=np.pi/10, num_iter=20) +kwargs = {'title': 'f(z) = z^2 + \dfrac{\pi}{10}', 'cmap': 'plasma'} + +plot_fractal(output, **kwargs); +``` + +```{code-cell} ipython3 +output = julia(mesh, c=-0.75 + 0.4j, num_iter=20) +kwargs = {'title': 'f(z) = z^2 - \dfrac{3}{4} + 0.4i', 'cmap': 'Greens_r'} + +plot_fractal(output, **kwargs); +``` + +## Mandelbrot set + +Closely related to the Julia set is the famous **Mandelbrot set**, which has a slightly different definition. Once again, we define $f(z) = z^2 + c$ where $c$ is a complex number, but this time our focus is on our choice of $c$. We say that $c$ is an element of the Mandelbrot set if f converges at $z = 0$. An equivalent definition is to say that $c$ is an element of the Mandelbrot set if $f(c)$ can be iterated infinitely and not 'explode'. We will tweak our Julia function slightly (and rename it appropriately) so that we can plot a visualization of the Mandelbrot set, which possesses an elegant fractal pattern. + +```{code-cell} ipython3 +def mandelbrot(mesh, num_iter=10, radius=2): -plot_fractal(output,**kwargs); + c = mesh.copy() + z = np.zeros(mesh.shape, dtype=np.complex128) + diverge_len = np.zeros(z.shape) + + for i in range(num_iter): + z[np.abs(z) < radius] = np.square(z[np.abs(z) < radius]) + c[np.abs(z) < radius] + diverge_len[np.abs(z) < radius] += 1 + + return diverge_len ``` ```{code-cell} ipython3 -output = mandelbrot(mesh,c= -0.75 + 0.4j,num_iter=20) -kwargs = {'title':'f(z) = z^2 - \dfrac{3}{4} + 0.4i', 'cmap':'Greens_r'} +output = mandelbrot(mesh, num_iter=50) +kwargs = {'title': 'Mandelbrot \ set', 'cmap': 'hot'} -plot_fractal(output,**kwargs); +plot_fractal(output, **kwargs); ``` -## Generalizing the Mandelbrot function +## Generalizing the Julia set -We can generalize our Mandelbrot function even further by giving it a parameter for which Universal Function we would like to pass in. This would allow us to plot fractals of the form $f(z) = g(z) + c$ where g is a Universal Function selected by us. +We can generalize our Julia function even further by giving it a parameter for which Universal Function we would like to pass in. This would allow us to plot fractals of the form $f(z) = g(z) + c$ where g is a Universal Function selected by us. ```{code-cell} ipython3 -def general_mandelbrot(mesh,c=-1,f=np.square,num_iter=100,radius=2): - +def general_julia(mesh, c=-1, f=np.square, num_iter=100, radius=2): + z = mesh.copy() - diverge_len = np.zeros(z.shape) - + diverge_len = np.zeros(z.shape) + for i in range(num_iter): - z[np.abs(z)< radius] = f(z[np.abs(z)< radius]) + c - diverge_len[np.abs(z)< radius] += 1 - + z[np.abs(z) < radius] = f(z[np.abs(z) < radius]) + c + diverge_len[np.abs(z) < radius] += 1 + return diverge_len ``` -One cool set of fractals that can be plotted using our general Mandelbrot function are ones of the form $f(z) = z^n + c$ for some positive integer n. A very cool pattern which emerges is that the number of regions that 'stick out' matches the degree in which we raise the function to while iterating over it. +One cool set of fractals that can be plotted using our general Julia function are ones of the form $f(z) = z^n + c$ for some positive integer n. A very cool pattern which emerges is that the number of regions that 'stick out' matches the degree in which we raise the function to while iterating over it. ```{code-cell} ipython3 -fig, axes = plt.subplots(2,3,figsize=(8,8)) +fig, axes = plt.subplots(2, 3, figsize=(8, 8)) base_degree = 2 for deg, ax in enumerate(axes.ravel()): degree = base_degree + deg - power = lambda z: np.power(z,degree) #Create power function for current degree + power = lambda z: np.power(z, degree) # Create power function for current degree - diverge_len = general_mandelbrot(mesh,f=power,num_iter=15) - ax.imshow(diverge_len,extent=[-2,2,-2,2],cmap='binary') + diverge_len = general_julia(mesh, f=power, num_iter=15) + ax.imshow(diverge_len, extent=[-2, 2, -2, 2], cmap='binary') ax.set_title(f'$f(z) = z^{degree} -1$') fig.tight_layout(); ``` -Needless to say, there is a large amount of exploring that can be done by fiddling with the inputted function, value of c, number of iterations, radius and even the density of the mesh and choice of colours. +Needless to say, there is a large amount of exploring that can be done by fiddling with the inputted function, value of $c$, number of iterations, radius and even the density of the mesh and choice of colours. +++ @@ -357,21 +385,22 @@ $z := z - \frac{f(z)}{f'(z)}$ We will define a general version of the fractal which will allow for different variations to be plotted by passing in our functions of choice. ```{code-cell} ipython3 -def newton_fractal(mesh,f,df,num_iter=10,r=2): - +def newton_fractal(mesh, f, df, num_iter=10, r=2): + z = mesh.copy() - diverge_len = np.zeros(z.shape) - + diverge_len = np.zeros(z.shape) + for i in range(num_iter): - pz = f(z[np.abs(z) Date: Tue, 10 Aug 2021 13:15:15 -0400 Subject: [PATCH 31/34] Update tutorial-plotting-fractals.md Updated an incorrect link. --- content/tutorial-plotting-fractals.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md index 6ffc5a1b..4c5892c7 100644 --- a/content/tutorial-plotting-fractals.md +++ b/content/tutorial-plotting-fractals.md @@ -399,7 +399,7 @@ def newton_fractal(mesh, f, df, num_iter=10, r=2): return diverge_len ``` -Now we can experiment with some different functions. For polynomials, we can create our plots quite effortlessly using the [NumPy Polynomial class]('www.google.ca'), which has built in functionality for computing derivatives. +Now we can experiment with some different functions. For polynomials, we can create our plots quite effortlessly using the [NumPy Polynomial class]('https://numpy.org/doc/stable/reference/generated/numpy.polynomial.polynomial.Polynomial.html'), which has built in functionality for computing derivatives. For example, let's try a higher-degree polynomial: From 0da26714e6ac44f3c3a34dd7d0a47a106438f60b Mon Sep 17 00:00:00 2001 From: MichaelRipa <51883134+MichaelRipa@users.noreply.github.com> Date: Tue, 10 Aug 2021 13:58:00 -0400 Subject: [PATCH 32/34] Update tutorial-plotting-fractals.md --- content/tutorial-plotting-fractals.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md index 4c5892c7..b42dfe6c 100644 --- a/content/tutorial-plotting-fractals.md +++ b/content/tutorial-plotting-fractals.md @@ -399,7 +399,7 @@ def newton_fractal(mesh, f, df, num_iter=10, r=2): return diverge_len ``` -Now we can experiment with some different functions. For polynomials, we can create our plots quite effortlessly using the [NumPy Polynomial class]('https://numpy.org/doc/stable/reference/generated/numpy.polynomial.polynomial.Polynomial.html'), which has built in functionality for computing derivatives. +Now we can experiment with some different functions. For polynomials, we can create our plots quite effortlessly using the [NumPy Polynomial class](https://numpy.org/doc/stable/reference/generated/numpy.polynomial.polynomial.Polynomial.html), which has built in functionality for computing derivatives. For example, let's try a higher-degree polynomial: From 4057f60952b8da4c950c696c7c9f33920f9a5683 Mon Sep 17 00:00:00 2001 From: Ross Barnowski Date: Sat, 14 Aug 2021 14:53:32 +0300 Subject: [PATCH 33/34] Fix ufunc capitalization and rm trailing whitespaces. --- content/tutorial-plotting-fractals.md | 58 +++++++++++++-------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md index b42dfe6c..80b970a9 100644 --- a/content/tutorial-plotting-fractals.md +++ b/content/tutorial-plotting-fractals.md @@ -20,7 +20,7 @@ kernelspec: +++ -Fractals are beautiful, compelling mathematical forms that can be oftentimes created from a relatively simple set of instructions. In nature they can be found in various places, such as coastlines, seashells, and ferns, and even were used in creating certain types of antennas. The mathematical idea of fractals was known for quite some time, but they really began to be truly appreciated in the 1970's as advancements in computer graphics and some accidental discoveries lead researchers like [Benoît Mandelbrot](https://en.wikipedia.org/wiki/Benoit_Mandelbrot) to stumble upon the truly mystifying visualizations that fractals possess. +Fractals are beautiful, compelling mathematical forms that can be oftentimes created from a relatively simple set of instructions. In nature they can be found in various places, such as coastlines, seashells, and ferns, and even were used in creating certain types of antennas. The mathematical idea of fractals was known for quite some time, but they really began to be truly appreciated in the 1970's as advancements in computer graphics and some accidental discoveries lead researchers like [Benoît Mandelbrot](https://en.wikipedia.org/wiki/Benoit_Mandelbrot) to stumble upon the truly mystifying visualizations that fractals possess. Today we will learn how to plot these beautiful visualizations and will start to do a bit of exploring for ourselves as we gain familiarity of the mathematics behind fractals and will use the ever powerful NumPy universal functions to perform the necessary calculations efficiently. @@ -30,16 +30,16 @@ Today we will learn how to plot these beautiful visualizations and will start to - Write a function for plotting various Julia sets - Create a visualization of the Mandelbrot set -- Write a function that computes Newton fractals +- Write a function that computes Newton fractals - Experiment with variations of general fractal types +++ ## What you'll learn -- A better intuition for how fractals work mathematically -- A basic understanding about NumPy Universal Functions and Boolean Indexing -- The basics of working with complex numbers in NumPy +- A better intuition for how fractals work mathematically +- A basic understanding about NumPy universal functions and Boolean Indexing +- The basics of working with complex numbers in NumPy - How to create your own unique fractal visualizations +++ @@ -48,7 +48,7 @@ Today we will learn how to plot these beautiful visualizations and will start to - [Matplotlib](https://matplotlib.org/) - `make_axis_locatable` function from mpl_toolkits API - + which can be imported as follows: ```{code-cell} ipython3 @@ -68,9 +68,9 @@ from mpl_toolkits.axes_grid1 import make_axes_locatable To gain some intuition for what fractals are, we will begin with an example. -Consider the following equation: +Consider the following equation: -$f(z) = z^2 -1 $ +$f(z) = z^2 -1 $ where `z` is a complex number (i.e of the form $a + bi$ ) @@ -81,7 +81,7 @@ def f(z): return np.square(z) - 1 ``` -Note that the square function we used is an example of a **[NumPy Universal Function](https://numpy.org/doc/stable/reference/ufuncs.html)**; we will come back to the significance of this decision shortly. +Note that the square function we used is an example of a **[NumPy universal function](https://numpy.org/doc/stable/reference/ufuncs.html)**; we will come back to the significance of this decision shortly. To gain some intuition for the behaviour of the function, we can try plugging in some different values. @@ -91,7 +91,7 @@ For $z = 0$, we would expect to get $-1$: f(0) ``` -Since we used a Universal Function in our design, we can compute multiple inputs at the same time: +Since we used a universal function in our design, we can compute multiple inputs at the same time: ```{code-cell} ipython3 z = [4, 1-0.2j, 1.6] @@ -107,7 +107,7 @@ x, y = np.meshgrid(np.linspace(-10, 10, 20), np.linspace(-10, 10, 20)) mesh = x + (1j * y) # Make mesh of complex plane ``` -Now we will apply our function to each value contained in the mesh. Since we used a Universal Function in our design, this means that we can pass in the entire mesh all at once. This is extremely convenient for two reasons: It reduces the amount of code needed to be written and greatly increases the efficiency (as Universal Functions make use of system level C programming in their computations). +Now we will apply our function to each value contained in the mesh. Since we used a universal function in our design, this means that we can pass in the entire mesh all at once. This is extremely convenient for two reasons: It reduces the amount of code needed to be written and greatly increases the efficiency (as universal functions make use of system level C programming in their computations). Here we plot the absolute value (or modulus) of each element in the mesh after one “iteration” of the function using a [**3D scatterplot**](https://matplotlib.org/2.0.2/mpl_toolkits/mplot3d/tutorial.html#scatter-plots): @@ -143,7 +143,7 @@ ax.set_zlabel('Absolute value') ax.set_title('Two Iterations: $ f(z) = z^2 - 1$'); ``` -Once again, we see that values around the origin remain small, and values with a larger absolute value (or modulus) “explode”. +Once again, we see that values around the origin remain small, and values with a larger absolute value (or modulus) “explode”. From first impression, its behaviour appears to be normal, and may even seem mundane. Fractals tend to have more to them then what meets the eye; the exotic behavior shows itself when we begin applying more iterations. @@ -151,7 +151,7 @@ From first impression, its behaviour appears to be normal, and may even seem mun Consider three complex numbers: -$z_1 = 0.4 + 0.4i $, +$z_1 = 0.4 + 0.4i $, $z_2 = z_1 + 0.1$, @@ -184,9 +184,9 @@ for cur_val in selected_values: To our surprise, the behaviour of the function did not come close to matching our hypothesis. This is a prime example of the chaotic behaviour fractals possess. In the first two plots, the value "exploded" on the last iteration, jumping way beyond the region that it was contained in previously. The third plot on the other hand remained bounded to a small region close to the origin, yielding completely different behaviour despite the tiny change in value. -This leads us to an extremely important question: **How many iterations can be applied to each value before they diverge (“explode”)?** +This leads us to an extremely important question: **How many iterations can be applied to each value before they diverge (“explode”)?** -As we saw from the first two plots, the further the values were from the origin, the faster they generally exploded. Although the behaviour is uncertain for smaller values (like $z_1, z_2, z_3$), we can assume that if a value surpasses a certain distance from the origin (say 2) that it is doomed to diverge. We will call this threshold the **radius**. +As we saw from the first two plots, the further the values were from the origin, the faster they generally exploded. Although the behaviour is uncertain for smaller values (like $z_1, z_2, z_3$), we can assume that if a value surpasses a certain distance from the origin (say 2) that it is doomed to diverge. We will call this threshold the **radius**. This allows us to quantify the behaviour of the function for a particular value without having to perform as many computations. Once the radius is surpassed, we are allowed to stop iterating, which gives us a way of answering the question we posed. If we tally how many computations were applied before divergence, we gain insight into the behaviour of the function that would be hard to keep track of otherwise. @@ -208,9 +208,9 @@ def divergence_rate(mesh, num_iter=10, radius=2): The behaviour of this function may look confusing at first glance, so it will help to explain some of the notation. -Our goal is to iterate over each value in the mesh and to tally the number of iterations before the value diverges. Since some values will diverge quicker than others, we need a procedure that only iterates over values that have an absolute value that is sufficiently small enough. We also want to stop tallying values once they surpass the radius. For this, we can use **[Boolean Indexing](https://numpy.org/devdocs/reference/arrays.indexing.html#boolean-array-indexing)**, a NumPy feature that when paired with Universal Functions is unbeatable. Boolean Indexing allows for operations to be performed conditionally on a NumPy array without having to resort to looping over and checking for each array value individually. +Our goal is to iterate over each value in the mesh and to tally the number of iterations before the value diverges. Since some values will diverge quicker than others, we need a procedure that only iterates over values that have an absolute value that is sufficiently small enough. We also want to stop tallying values once they surpass the radius. For this, we can use **[Boolean Indexing](https://numpy.org/devdocs/reference/arrays.indexing.html#boolean-array-indexing)**, a NumPy feature that when paired with universal functions is unbeatable. Boolean Indexing allows for operations to be performed conditionally on a NumPy array without having to resort to looping over and checking for each array value individually. -In our case, we use a loop to apply iterations to our function $f(z) = z^2 -1 $ and keep tally. Using Boolean indexing, we only apply the iterations to values that have an absolute value less then 2. +In our case, we use a loop to apply iterations to our function $f(z) = z^2 -1 $ and keep tally. Using Boolean indexing, we only apply the iterations to values that have an absolute value less then 2. With that out of the way, we can go about plotting our first fractal! We will use the [**imshow**](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html) function to create a colour-coded visualization of the tallies. @@ -239,9 +239,9 @@ What this stunning visual conveys is the complexity of the function’s behaviou ## Julia set -What we just explored was an example of a fractal visualization of a specific Julia Set. +What we just explored was an example of a fractal visualization of a specific Julia Set. -Consider the function $f(z) = z^2 + c$ where $c$ is a complex number. The **filled-in Julia set** of $c$ is the set of all complex numbers `z` in which the function converges at $f(z)$. Likewise, the boundary of the filled-in Julia set is what we call the **Julia set**. In our above visualization, we can see that the yellow region represents an approximation of the filled-in Julia set for $c = -1$ and the greenish-yellow border would contain the Julia set. +Consider the function $f(z) = z^2 + c$ where $c$ is a complex number. The **filled-in Julia set** of $c$ is the set of all complex numbers `z` in which the function converges at $f(z)$. Likewise, the boundary of the filled-in Julia set is what we call the **Julia set**. In our above visualization, we can see that the yellow region represents an approximation of the filled-in Julia set for $c = -1$ and the greenish-yellow border would contain the Julia set. To gain access to a wider range of "Julia fractals", we can write a function that allows for different values of $c$ to be passed in: @@ -340,7 +340,7 @@ plot_fractal(output, **kwargs); ## Generalizing the Julia set -We can generalize our Julia function even further by giving it a parameter for which Universal Function we would like to pass in. This would allow us to plot fractals of the form $f(z) = g(z) + c$ where g is a Universal Function selected by us. +We can generalize our Julia function even further by giving it a parameter for which universal function we would like to pass in. This would allow us to plot fractals of the form $f(z) = g(z) + c$ where g is a universal function selected by us. ```{code-cell} ipython3 def general_julia(mesh, c=-1, f=np.square, num_iter=100, radius=2): @@ -445,7 +445,7 @@ kwargs = {'title': 'f(z) = z - \dfrac{sin(z)cos(z)}{2}', 'cmap': 'binary'} plot_fractal(output, **kwargs); ``` -Note that you sometimes have to play with the radius in order to get a neat looking fractal. +Note that you sometimes have to play with the radius in order to get a neat looking fractal. Finally, we can go a little bit wild with our function selection @@ -484,9 +484,9 @@ It is truly fascinating how distinct yet similar these fractals are with each ot ## Creating your own fractals -What makes fractals more exciting is how much there is to explore once you become familiar with the basics. Now we will wrap up our tutorial by exploring some of the different ways one can experiment in creating unique fractals. I encourage you to try some things out on your own (if you have not done so already). +What makes fractals more exciting is how much there is to explore once you become familiar with the basics. Now we will wrap up our tutorial by exploring some of the different ways one can experiment in creating unique fractals. I encourage you to try some things out on your own (if you have not done so already). -One of the first places to experiment would be with the function for the generalized Julia set, where we can try passing in different functions as parameters. +One of the first places to experiment would be with the function for the generalized Julia set, where we can try passing in different functions as parameters. Let's start by choosing @@ -506,7 +506,7 @@ plot_fractal(output, **kwargs); What happens if we compose our defined function inside of a sine function? -Let's try defining +Let's try defining $g(z) = sin(f(z)) = sin(tan(z^2))$ @@ -552,15 +552,15 @@ kwargs = {'title': 'Accidental \ fractal', 'cmap': 'Blues'} plot_fractal(output, **kwargs); ``` -Needless to say, there are a nearly endless supply of interesting fractal creations that can be made just by playing around with various combinations of NumPy Universal Functions and by tinkering with the parameters. +Needless to say, there are a nearly endless supply of interesting fractal creations that can be made just by playing around with various combinations of NumPy universal functions and by tinkering with the parameters. +++ ## In conclusion -We learned a lot about generating fractals today. We saw how complicated fractals requiring many iterations could be computed efficiently using Universal Functions. We also took advantage of boolean indexing, which allowed for less computations to be made without having to individually verify each value. Finally, we learned a lot about fractals themselves. As a recap: +We learned a lot about generating fractals today. We saw how complicated fractals requiring many iterations could be computed efficiently using universal functions. We also took advantage of boolean indexing, which allowed for less computations to be made without having to individually verify each value. Finally, we learned a lot about fractals themselves. As a recap: -- Fractal images are created by iterating a function over a set of values, and keeping tally of how long it takes for each value to pass a certain threshold +- Fractal images are created by iterating a function over a set of values, and keeping tally of how long it takes for each value to pass a certain threshold - The colours in the image correspond to the tally counts of the values - The filled-in Julia set for $c$ consists of all complex numbers `z` in which $f(z) = z^2 + c$ converges - The Julia set for $c$ is the set of complex numbers that make up the boundary of the filled-in Julia set @@ -572,13 +572,13 @@ We learned a lot about generating fractals today. We saw how complicated fractal ## On your own -- Play around with the parameters of the generalized Julia set function, try playing with the constant value, number of iterations, function choice, radius, and colour choice. +- Play around with the parameters of the generalized Julia set function, try playing with the constant value, number of iterations, function choice, radius, and colour choice. - Visit the “List of fractals by Hausdorff dimension” Wikipedia page (linked in the Further reading section) and try writing a function for a fractal not mentioned in this tutorial. +++ -## Further reading +## Further reading - [More information on the theory behind fractals](https://en.wikipedia.org/wiki/Fractal) - [Further reading on Julia sets](https://en.wikipedia.org/wiki/Julia_set) From 516210828c71e64f53c332f007b3a3b19d86a858 Mon Sep 17 00:00:00 2001 From: Ross Barnowski Date: Sat, 14 Aug 2021 15:11:57 +0300 Subject: [PATCH 34/34] Typos and math typesetting. --- content/tutorial-plotting-fractals.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/tutorial-plotting-fractals.md b/content/tutorial-plotting-fractals.md index 80b970a9..d53b8307 100644 --- a/content/tutorial-plotting-fractals.md +++ b/content/tutorial-plotting-fractals.md @@ -210,7 +210,7 @@ The behaviour of this function may look confusing at first glance, so it will he Our goal is to iterate over each value in the mesh and to tally the number of iterations before the value diverges. Since some values will diverge quicker than others, we need a procedure that only iterates over values that have an absolute value that is sufficiently small enough. We also want to stop tallying values once they surpass the radius. For this, we can use **[Boolean Indexing](https://numpy.org/devdocs/reference/arrays.indexing.html#boolean-array-indexing)**, a NumPy feature that when paired with universal functions is unbeatable. Boolean Indexing allows for operations to be performed conditionally on a NumPy array without having to resort to looping over and checking for each array value individually. -In our case, we use a loop to apply iterations to our function $f(z) = z^2 -1 $ and keep tally. Using Boolean indexing, we only apply the iterations to values that have an absolute value less then 2. +In our case, we use a loop to apply iterations to our function $f(z) = z^2 -1 $ and keep tally. Using Boolean indexing, we only apply the iterations to values that have an absolute value less than 2. With that out of the way, we can go about plotting our first fractal! We will use the [**imshow**](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html) function to create a colour-coded visualization of the tallies. @@ -355,7 +355,7 @@ def general_julia(mesh, c=-1, f=np.square, num_iter=100, radius=2): return diverge_len ``` -One cool set of fractals that can be plotted using our general Julia function are ones of the form $f(z) = z^n + c$ for some positive integer n. A very cool pattern which emerges is that the number of regions that 'stick out' matches the degree in which we raise the function to while iterating over it. +One cool set of fractals that can be plotted using our general Julia function are ones of the form $f(z) = z^n + c$ for some positive integer $n$. A very cool pattern which emerges is that the number of regions that 'stick out' matches the degree in which we raise the function to while iterating over it. ```{code-cell} ipython3 fig, axes = plt.subplots(2, 3, figsize=(8, 8))