From 43bc4098023bd7c343b6717aa7b398ea7086e305 Mon Sep 17 00:00:00 2001 From: Christopher MAZZERBO Date: Mon, 30 Oct 2023 19:17:15 +0100 Subject: [PATCH] update readme and report --- README.md | 9 +- report/Annex/frctl-art-annex.tex | 213 +++++++++++++++++++++++ report/Annex/frctl_refs.bib | 49 ++++++ report/Annex/images/20231028105914.png | Bin 0 -> 21514 bytes report/Annex/images/complementminus1.PNG | Bin 0 -> 8554 bytes report/Annex/makefile | 18 ++ 6 files changed, 288 insertions(+), 1 deletion(-) create mode 100644 report/Annex/frctl-art-annex.tex create mode 100644 report/Annex/frctl_refs.bib create mode 100644 report/Annex/images/20231028105914.png create mode 100644 report/Annex/images/complementminus1.PNG create mode 100644 report/Annex/makefile diff --git a/README.md b/README.md index 84ff6c2..aedfda7 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,12 @@ pip install numpy ``` I also use `pathlib`, but that comes built into Python versions >= 3.4, so make sure your Python version includes `pathlib`. +#### For the fractal viewer + +To run the fractal viewer with Python, you'll need : + +`pygame` (versions 2.0.1 and up), and `PyOpenGL`, both installable with pip. + ### How to use @@ -65,7 +71,8 @@ You can lerp two images of same shape together using the lerp widget, which yiel You can save images as `.frctl` files ( a "fractal file" containing metadata, array data and the actual image). You can then load `.npy` or `.frctl` files (`npy` files need to be arrays of shape `(2,n)` representing a Taylor expansion of the function of order $n$, separating real and imaginary parts). -`frctl` files can also be opened outside of the browser, opening them if it's through the executable, but to set this as default, either use the `reg` key generator or set it yourself. +`frctl` files can also be opened outside of the browser, you can open them using the explorer executable or the browser executable. I recommend setting the explorer executable as the default application. +*If you want to set the explorer executable as the default application for these in the **Windows** registry, I included a regkey file in this repository where you only have to change `%directory%` to the directory in which the executable is.* Of course, if you like a function but don't want to save it, just view it in higher resolution (or lower resolution), you can "enhance" a selected image. diff --git a/report/Annex/frctl-art-annex.tex b/report/Annex/frctl-art-annex.tex new file mode 100644 index 0000000..5aa42f9 --- /dev/null +++ b/report/Annex/frctl-art-annex.tex @@ -0,0 +1,213 @@ +\documentclass{article} +\usepackage[document]{ragged2e} +\usepackage{enumitem} +\usepackage{amssymb} +\usepackage[spaces,hyphens]{url} +\usepackage{amsthm} +\usepackage{bbm} +\usepackage{dsfont} +\usepackage{fullpage} +\usepackage{fancyhdr} +\usepackage{titlesec} +\usepackage{hyperref} +\usepackage{url} +\usepackage{xcolor} +\usepackage{stmaryrd} +\usepackage{tikzpagenodes} +\usepackage[T1]{fontenc} +\usepackage[utf8]{inputenc} +\usepackage{CJKutf8} +\usepackage[english]{babel} +\usepackage{titlesec} +\usepackage{pgfplots} +\pgfplotsset{width=10cm,compat=1.9} +\usepgfplotslibrary{external} +\usepackage{tikz,tkz-tab,amsmath} +\usetikzlibrary{arrows} +\graphicspath{ {./images/} } +\newcommand\E{e} +\newcommand\R{\mathbb{R}} +\newcommand\N{\mathbb{N}} +\newcommand\Z{\mathbb{Z}} +\newcommand\K{\mathbb{K}} +\newcommand\Q{\mathbb{Q}} +\newcommand\C{\mathbb{C}} +\newcommand\T{\mathcal{T}} +\usepackage[headsep=1cm, headheight=1cm]{geometry} +% !TeX spellcheck = en_GB + +\newcommand\dspst{\displaystyle} +\def\prop#1{\underline{\textbf{#1}}} + +\def\changemargin#1#2{\list{}{\rightmargin#2\leftmargin#1}\item[]} +\let\endchangemargin=\endlist + +%\titleformat{\part}[block]{\filcenter}{}(1em){} +\titleformat{\part}[block]{\Huge\bfseries\filcenter}{\partname{} \\ \thepart}{1em}{\huge} +\renewcommand{\thesubsection}{\Alph{section}.\arabic{subsection}} +\renewcommand{\thesubsubsection}{\Alph{section}.\arabic{subsection}.\arabic{subsubsection}} + +%Defines emphasis color +\definecolor{rycolor}{RGB}{200,20,255} +\definecolor{note}{RGB}{100,100,100} + +%Defining a multi-line comment +\newcommand{\comment}[1]{} + +\title{Programming and Algorithms Project \\ Annex - Julia and Fatou sets} + +\author{Christopher Mazzerbo} +\date{Last updated on \today} + + +\begin{document} +\setcounter{section}{1} + +\titlespacing{\subsubsection}{5mm}{0cm}{0cm} + +%title + +\fancypagestyle{plain}{ +\fancyfoot{} +} +\pagestyle{plain} +\maketitle +\vspace{5mm} +\hrule +\pagebreak + + +%Edit header +\pagestyle{fancy} +\fancyhf{} +\fancyhfoffset[L]{1cm} % left extra length +\fancyhfoffset[R]{1cm} % right extra length +\rhead{Programming and Algorithms Project - fractal art} +\lhead{\bfseries Christopher Mazzerbo} +\fancyfoot{} +\fancyfoot[C]{\thepage} + +\tableofcontents +\pagebreak + + + +In this document we will use the notation $\overline{\C}$ to denote the Riemann sphere : $\overline{\C} = \C \cup \lbrace \infty \rbrace$. \\ + +\subsection{Definitions} + +\prop{Meromorphic function} : \\ +\begin{changemargin}{1cm}{0cm} +Let $f : \overline{\C} \to \overline{\C}$. We say $f$ is \textit{meromorphic} on an open set $D \subset \overline{\C}$ if $f$ is holomorphic (that is to say, complex-differentiable) on $D \backslash S$ where $S$ is a set of isolated points ($\#S < \infty$). \\ +\vspace{2mm} +I will write $M(X)$ the space of all complex functions that are meromorphic on $X \subseteq \overline{\C}$. +\end{changemargin} +\vspace{5mm} + + +\prop{Julia sets, Fatou sets} : \\ +\begin{changemargin}{1cm}{0cm} +Let $U$ be an open subset of $\overline{\C}$ and let $f : U \to \overline{\C}$ be a meromorphic function. \\ +$$\mathcal{F}_f = \biggr\lbrace z \in U, \, \, \exists V_z \subset U, \, \, \exists (f^{n_k})_{n_k \in \N}, n_1 < n_2 < \dots, \quad (f^{n_k}) \text{ converges uniformly on compacts subsets of } V_z \biggr\rbrace$$ +Taking $U = \C$ yields what we call the \underline{Fatou set} of $f$, and we call the complement of this set, the \underline{Julia set} \cite{Sut14} section 5. We then have $\C = \mathcal{F}_f \oplus \mathcal{J}_f$. \\ +\vspace{2mm} +It's important to know that $M(\overline{\C}) \ni f \mapsto \mathcal{J}_f \in \text{Julia sets of }M(\overline{\C})$ is not a bijection. \\ +Two \textit{different} functions can have the same Julia set \cite{Lev97}. +\end{changemargin} +\vspace{5mm} +\pagebreak + +\subsection{Two examples} + +\subsubsection{Example of $w \in \mathcal{J}_f$ for a very simple $f$} + +Consider $f : z \mapsto z^2$, and $w = 1$. \\ +\vspace{5mm} +We will prove $w \in \mathcal{J}_f$ by finding a sequence $(z_k)_k$ for which iterates of $f$ around any neighbourhood $U$ of $w$ do not have any uniformly converging subsequences on any compact subset of said neighbourhood. \\ +\vspace{5mm} +\begin{proof} +Consider $r > 0$, defining a neighbourhood $U$ of $w$ by $U = B(w,3r)$. \\ +\vspace{2mm} + +Let's take a sequence $(z_k)_{k \in \N}$ defined by $z_k = w - \frac{r}{k}$. It's easy to see $z_k$ converges to $w$. \\ +\vspace{5mm} +Now consider $f^n(z_k)$ for a fixed $k$. \\ +We can deduce from basic power properties that : \\ +$$f^n(z_k) \underset{n \to \infty}{\longrightarrow} 0$$ +However : \\ +$$f^n(w) \underset{n \to \infty}{\longrightarrow} 1 \text{ because } f^n(w) = f^n(1) = 1 \text{ for all } n$$ +But then we have $\lVert f^n(z_k) - f^n(w) \rVert \underset{n \to \infty}{\longrightarrow} 1$ for all $k$, which contradicts uniform convergence of $f^n$ or any of its subsequences. \\ +This result is true without having to bring up compactness as the discontinuity of $f^n$'s limit in this neighbourhood is independent of the subset we're studying. \\ +\vspace{2mm} +Therefore, $w = 1$ is \textbf{not} in the Fatou set. \\ +\vspace{5mm} +We know that $\overline{\C} = \mathcal{F}_f \oplus \mathcal{J}_f$, so $w \notin \mathcal{F}_f \Rightarrow w \in \mathcal{J}_f$. +\end{proof} + +\subsubsection{Example of an interesting $w \in \mathcal{F}_f$} + +In this example, subsequences of the iterates are required, to illustrate the necessity of this argument in $\mathcal{J}_f$'s definition. \\ +\vspace{5mm} + +Consider $f(z) = z^2-1$. \\ +\vspace{2mm} +Now take $w = -1$. \\ +\vspace{2mm} +We will prove $w \in \mathcal{F}_f$ by choosing a neighbourhood of $w$ in which all sequences have a convergent subsequence on compact subsets of itself. \\ +\vspace{5mm} + +\begin{proof} + +We will consider the ball $\overline{B(w,\varepsilon)}$ for $0 < \varepsilon < \frac{1}{5}$. \\ +A maximal $\varepsilon$ satisfying this proof can be found \textcolor{blue}{\underline{\href{https://www.wolframalpha.com/input?i=positive+solution+of+\%CE\%B5+\%3D+\%282\%CE\%B5\%2B\%CE\%B5\%5E2\%29\%5E2}{here}}}. \\ +\vspace{5mm} + +$$\forall z_0 \in \overline{B(w,\varepsilon)}, \qquad z_0 = w+k_0e^{i \theta_0} \quad 0 \leq k_0 \leq \varepsilon, \quad \theta_0 \in [0, 2 \pi[$$ +and : \\ +\vspace{-3mm} +\begin{align*} +z_1 = f(z_0) &= z_0^2-1 \\ +&= (w+k_0 e^{i \theta_0})^2-1 \\ +&= 1 - 2k_0e^{i \theta_0} + k_0^2 e^{2i \theta_0}-1 \\ +&= -2k_0 \underbrace{\left( e^{i \theta_0}- \frac{k_0}{2} e^{2i \theta_0} \right)}_{\text{modulus } \leq 1+ \frac{k_0}{2} } +\end{align*} +\vspace{-2mm} +It's then easy to see that $f(z_0) \in \overline{B(0,2 \varepsilon + \varepsilon^2)}$. \\ +\vspace{5mm} + +From $z_1 \in \overline{B(0, 2\varepsilon)}$, as $\varepsilon < \frac{1}{5}$ we have $\lvert z_1 \rvert < \frac{2}{5} + \frac{1}{25} = \frac{11}{25}$. \\ +Reusing the notation from earlier, we have $z_1 = 0 + k_1 e^{i \theta_1}$ for $0 \leq k_1 \leq 2\varepsilon + \varepsilon^2$ and $\theta_1 \in [0,2 \pi[$. \\ +$$f(z_1) = \underbrace{k_1^2}_{\leq \frac{121}{625} < \frac{125}{625} = \frac{1}{5}}e^{2i \theta_1}-1$$ +Which finally implies $f(z_1) \in \overline{B(w,\varepsilon)}$ again. \\ +\vspace{5mm} + +We have found a neighbourhood $B(w,\varepsilon)$ of $w$ in which any sequence of iterates has terms in one of or both of the sets $\overline{B(w, \varepsilon)}$ and $\overline{B(0, 2 \varepsilon)}$. \\ +\vspace{2mm} +$\overline{B(w, \varepsilon)}$ is a the (compact) closure of the neighbourhood, so the Bolzano-Weierstrass theorem guarantees that we can take a subsequence of iterates (specifically such that we exclude all terms in $\overline{B(0, 2 \varepsilon)}$) which will converge (sequential compactness) in $\overline{B(w, \varepsilon)}$. \\ +\vspace{5mm} + +Thus we conclude $w \in \mathcal{F}_f$. +\end{proof} + +Note that this proof \textit{requires} the definition to extend to subsequences, because of how the given sequences of iterates of $f$ have values in disjoint sets. \\ +\vspace{2mm} + +Here is a visual representation of this disjointness (made interactive \textcolor{blue}{\underline{\href{https://www.geogebra.org/m/eee6ukbk}{here}}}) : \\ +\vspace{-3mm} +\begin{center} +\includegraphics[scale=0.9]{complementminus1} \\ +\textit{Fig. 1 - First terms of a sequence of sets $(b_n)$ where $b_n = f^n(B(w, \varepsilon))$} +\end{center} + +As goes the proof, the maximal possible $\varepsilon$ for which the proof is valid is actually slightly greater than $\frac{1}{5}$ and can be obtained by solving $\varepsilon = (2 \varepsilon + \varepsilon^2)^2$ for $\varepsilon > 0$. Here is an image showing how this $\varepsilon$ appears in the Fatou component $w$ is in : \\ +\begin{center} +\includegraphics[scale=0.3]{20231028105914} +\textit{$Bas(0)$ (black) for $z \mapsto z^2-1$ with biggest neighbourhood of $w = -1$ that is still in $Bas(0)$ (red).} \\ +Image obtained using "Inverted lightness RGB" colourmap of my \textcolor{blue}{\underline{\href{https://github.com/ChrisMzz/pyogl-shader-tester/blob/main/shaders/frag_incriter.glsl}{Julia set shader}}}, with fixed $c$. +\end{center} + + +\bibliographystyle{alphaurl.bst} +\bibliography{frctl_refs.bib} + +\end{document} \ No newline at end of file diff --git a/report/Annex/frctl_refs.bib b/report/Annex/frctl_refs.bib new file mode 100644 index 0000000..00b9372 --- /dev/null +++ b/report/Annex/frctl_refs.bib @@ -0,0 +1,49 @@ + +@article{Jon19, + url = {https://theses.liacs.nl/1714}, + author = {Jonckheere, L.S. (Luc) de}, + publisher = {Thesis Bachelor Informatica LIACS}, + title = {Efficiently Generating the Mandelbrot and Julia Sets}, + year = {2019} +}, + +@misc{Sil13, + url = {https://solarianprogrammer.com/2013/02/28/mandelbrot-set-cpp-11/}, + author = {Paul Silisteanu}, + title = {The Mandelbrot set in C++11}, + year = {2013} +} + + +@article{Sut14, +author = {Sutherland, Scott}, +year = {2014}, +month = {01}, +pages = {37-60}, +title = {An Introduction to Julia and Fatou Sets}, +volume = {92}, +isbn = {978-3-319-08104-5}, +journal = {Springer Proceedings in Mathematics and Statistics}, +url={https://www.researchgate.net/publication/287394590_An_Introduction_to_Julia_and_Fatou_Sets} +} + +@inproceedings{Lev97, + title={When do two rational functions have the same Julia set}, + author={Genadi Levin and Feliks Przytycki}, + year={1997}, + url={https://api.semanticscholar.org/CorpusID:15478232} +} + +@misc{Buz19, + title={Measures of maximal entropy for surface diffeomorphisms}, + author={Jérôme Buzzi and Sylvain Crovisier and Omri Sarig}, + year={2019}, + eprint={1811.02240}, + archivePrefix={arXiv}, + primaryClass={math.DS} +} + + + + + diff --git a/report/Annex/images/20231028105914.png b/report/Annex/images/20231028105914.png new file mode 100644 index 0000000000000000000000000000000000000000..de5305246bb5c1f89f6c61542222d34d692fb8bf GIT binary patch literal 21514 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 P0(9q=@lDkAhkyMS2GZ9A literal 0 HcmV?d00001 diff --git a/report/Annex/makefile b/report/Annex/makefile new file mode 100644 index 0000000..cb5c5f2 --- /dev/null +++ b/report/Annex/makefile @@ -0,0 +1,18 @@ +# from https://tex.stackexchange.com/a/40759/297129 + + +.PHONY: frctl-art-annex.pdf all clean + +all: frctl-art-annex.pdf + +%.tex: %.raw + ./raw2tex $< > $@ + +%.tex: %.dat + ./dat2tex $< > $@ + +frctl-art-annex.pdf: frctl-art-annex.tex + latexmk -pdf -pdflatex="pdflatex -interaction=nonstopmode" -use-make frctl-art-annex.tex + +clean: + latexmk -CA \ No newline at end of file