added more images, changed wording

main
romanamo 2024-07-12 13:17:55 +02:00
parent 85de993d2b
commit 03e525cf3a
6 changed files with 66 additions and 27 deletions

View File

@ -0,0 +1,22 @@
using Lindenmayer, Luxor
f(t::Turtle) = begin
t.pencolor = (0.0,0.0,0.0)
setline(4)
end
hilbert_curve = LSystem(Dict(
"L" => "*+RF-LFL-tFR+",
"R" => "*-LF+RFR+FL-"),
"3L")
drawLSystem(hilbert_curve,
forward = 25,
turn = 90,
iterations = 4,
startingx = -200,
startingy = -200,
filename = "./images/hilbert_curve.png",
backgroundcolor = "white",
asteriskfunction = f,
showpreview = true)

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

View File

@ -37,8 +37,9 @@
% Kurze Zusammenfassung des Dokuments % Kurze Zusammenfassung des Dokuments
\begin{abstract} \begin{abstract}
In dieser Arbeit wird die Programmiersprache Julia bzgl. der Eignung für Visualisierungen innerhalb der fraktalen Geometrie untersucht. Betrachtet werden die Kriterien Performanz, Nachhaltigkeit, Parallelisierbarkeit, Verfügbarkeit von Softwarepaketen und Entwicklungsumgebungen. In dieser Arbeit wird untersucht ob sich die Programmiersprache Julia zu Erstellung von Visualisierungen innerhalb der fraktalen Geometrie eignet. Betrachtet werden die Kriterien Performanz, Nachhaltigkeit, Parallelisierbarkeit, Verfügbarkeit von Softwarepaketen und Entwicklungsumgebungen.
Das Ergebnis zeigt, dass Julia einen Kompromiss als Skriptsprache mit der Performanz bildet. Der Einsatz von Julia in einem ausgeweiteten Rahmen, lässt sich mithilfe der gegebenen Parallelisierung beschleunigen und nachhaltig gestalten. Das Julia-Ecosystem bietet aktuell die ausreichenden Mittel um Fraktale Kurven mittels Rastergrafiken darzustellen oder diese in 3-dimensionaler Form betrachten zu können. Die Erstellung eigener Visualisierungen gestaltet sich durch eine eingeschränkte Wahl von Entwicklungsumgebungen und einer hohen Kompilierzeit meist als langwieriger Prozess. Das Ergebnis zeigt, dass Julia seinem Ruf gerecht wird. Die Zusammenführung als Skriptsprache mit hoher Performanz eignet sich für den ausgewählten Anwendungsbereich. Der Einsatz von Julia in einem ausgeweiteten Rahmen, lässt sich parallelisieren und somit nachhaltig gestalten. Das Julia-Ecosystem bietet die ausreichenden Mittel um Fraktale Kurven bequem darzustellen. Zusätzliche Softwarepakete ermöglichen die Darstellung in 2- und 3-dimensionaler Form.
Die eingeschränkte Auswahl an Entwicklungsumgebungen und die teilweise hohe Kompilierzeit stellen ein Hindernis in der Erstellung eigener komplexerer Visualisierungen dar.
\end{abstract} \end{abstract}
% Inhaltsverzeichnis erzeugen % Inhaltsverzeichnis erzeugen
@ -49,15 +50,16 @@ Das Ergebnis zeigt, dass Julia einen Kompromiss als Skriptsprache mit der Perfor
% ------------------------------------------------------- % -------------------------------------------------------
\section{Einleitung} \section{Einleitung}
Helge von Koch erfand 1904, die nach ihm benannte, \emph{Kochsche kurve}, bei der Suche nach einer nicht differenzierbare Kurve. Die Entdeckungen aus der damaligen Zeit wurden von Mathematiker aus dem 19. Jahrhundert als \enquote{Monster} bezeichnet, da diese seltsame Eigenschaften aufweisen \autocite{smithFractalGeometryHistory2011}. Im Jahr 1891 beschäftigte sich der Mathematiker David Hilbert mit einer besonderen Kurve, die durch alle Punkte eines Quadrates mit Seitenlänge 1 durchläuft. \autocite{walterFraktaleGeometrischenElemente2018}.
Diese besonderen Objekte weist man im zeitlichen Verlauf der fraktalen Geometrie, einem Teilgebiet der Mathematik zu. Eine feste eindeutige Definition für ein Fraktal konnte sich nicht etablieren \autocite{walterFraktaleGeometrischenElemente2018}. Eine Eigenschaft, die besonders häufig bei der Arbeit mit Fraktalen auftritt ist der Begriff der \emph{Selbstähnlichkeit}. Helge von Koch entdeckte 1904, die nach ihm benannte \emph{Kochsche kurve} bei der Suche nach einer nicht differenzierbare Kurve. Diese Entdeckungen wurden von Mathematiker aus dem 19. Jahrhundert als \enquote{Monster} bezeichnet, da diese seltsame Eigenschaften aufweisen \autocite{smithFractalGeometryHistory2011}.
Diese besonderen Objekte weist man im zeitlichen Verlauf der fraktalen Geometrie, einem relativ jungen Teilgebiet der Mathematik zu. Eine feste eindeutige Definition für ein Fraktal konnte sich nicht etablieren \autocite{walterFraktaleGeometrischenElemente2018}. Eine Eigenschaft, die dennoch besonders häufig bei der Arbeit mit Fraktalen auftritt ist der Begriff der \emph{Selbstähnlichkeit}.
Lässt sich ein Objekt aus kleineren Kopien seiner selbst zusammenbauen, so wird dies als selbstähnlich bezeichnet \autocite{walterFraktaleGeometrischenElemente2018}.\\ Lässt sich ein Objekt aus kleineren Kopien seiner selbst zusammenbauen, so wird dies als selbstähnlich bezeichnet \autocite{walterFraktaleGeometrischenElemente2018}.\\
Ein einführendes Beispiel zur Selbstähnlichkeit ist die \emph{Kochsche Kurve} \autoref{fig:koch_curve}. Diese lässt sich aus 4 Kopien mit Verkleinerungsfaktor $\frac{1}{3}$ zusammenbasteln \autocite{walterFraktaleGeometrischenElemente2018}. Man lege dafür 2 Kopien an den linken und rechten Rand. Die übrig bleibenden 2 Kopien werden nach oben spitz aufeinander zulaufend zwischen die beiden äußeren Kopien gelegt. Ein einführendes Beispiel zur Selbstähnlichkeit ist die \emph{Kochsche Kurve}. Diese lässt sich aus 4 Kopien mit Verkleinerungsfaktor $\frac{1}{3}$ zusammenbasteln \autocite{walterFraktaleGeometrischenElemente2018}. Man lege dafür 2 Kopien an den linken und rechten Rand. Die übrig bleibenden 2 Kopien werden nach oben spitz aufeinander zulaufend zwischen die beiden äußeren Kopien gelegt.
\begin{figure}[h!] \begin{figure}[h!]
\centering \centering
\label{fig:koch_curve} \label{fig:koch_curve}
\includegraphics[width=\columnwidth]{images/koch_curve.png} \includegraphics[width=0.8\columnwidth]{images/koch_curve.png}
\caption{Kochsche Kurve} \caption{Kochsche Kurve}
\end{figure} \end{figure}
@ -73,20 +75,20 @@ Die Mandelbrot-Menge $\mathbb{M}$ ist die Menge der komplexen Zahlen $c \in \mat
\caption{Mandelbrot-Menge} \caption{Mandelbrot-Menge}
\end{figure} \end{figure}
Färben wir die Elemente der komplexen Zahlenebene die innerhalb der Mandelbrot-Menge $\mathbb{M}$ liegen schwarz und die außerhalb weiß erhalten wir \autoref{fig:mandelbrotset}. Mithilfe der Darstellung lassen sich neue Vermutungen über die Eigenschaften der Mandelbrot-Menge aufstellen, welche ohne Visualisierung schwer zu erkennen sind. Färben wir die Elemente der komplexen Zahlenebene, die innerhalb der Mandelbrot-Menge $\mathbb{M}$ liegen schwarz und die außerhalb weiß, erhalten wir \autoref{fig:mandelbrotset}. Mithilfe der Darstellung lassen sich neue Vermutungen über die Eigenschaften der Mandelbrot-Menge aufstellen, welche ohne Visualisierung schwer zu erkennen sind.
Die Begründer Gaston und Julia besaßen zur damaligen Zeit noch keine Computer, mit denen Sie ihre Forschungsobjekte darstellen konnten. \autocite{walterFraktaleGeometrischenElemente2018} Die Begründer Gaston und Julia besaßen zur damaligen Zeit noch keine Computer, mit denen Sie ihre Forschungsobjekte darstellen konnten. \autocite{walterFraktaleGeometrischenElemente2018}
Mit dem Lauf der Zeit wächst die Rechenleistung der verfügbaren Computer stetig an und erschließt neue Möglichkeiten innerhalb der Forschung. Nach \textit{Moore's Law} \autocite{mollickEstablishingMooreLaw2006} verdoppelt sich die Anzahl der Komponenten die auf einen Chip passt jedes Jahr. Innerhalb der 70er Jahre wurde die Mandelbrotmenge mithilfe von ASCII-Art visualisiert \autocite{weitzKonkreteMathematikNicht2021}. Aktuell steht uns die Rechenleistung zur Verfügung Einblicke in die Welt der Fraktale mittels hochauflösender Rastergrafik zu gelangen. Mit dem Lauf der Zeit wächst die Rechenleistung der verfügbaren Computer stetig an und erschließt neue Möglichkeiten innerhalb der Forschung. Nach \textit{Moore's Law} \autocite{mollickEstablishingMooreLaw2006} verdoppelt sich die Anzahl der Komponenten die auf einen Chip passt jedes Jahr. Innerhalb der 70er Jahre wurde die Mandelbrotmenge mithilfe von ASCII-Art visualisiert \autocite{weitzKonkreteMathematikNicht2021}. Aktuell steht uns die Rechenleistung zur Verfügung Einblicke in die Welt der Fraktale mittels hochauflösender Rastergrafik zu gelangen.
Die resultierenden Bilder wecken aufgrund der Ästhetik auch das Interesse vieler Nicht-Mathematiker sich mit dem Themengebiet zu befassen Die resultierenden Bilder wecken aufgrund der Ästhetik auch das Interesse vieler Nicht-Mathematiker sich mit dem Themengebiet zu befassen
\autocite{smithFractalGeometryHistory2011}. \autocite{smithFractalGeometryHistory2011}.
In der Informatik, die einen Spagat zwischen Formalwissenschaft und Ingenieurswissenschaft bildet, stellt sich die Herausforderung die Vielzahl an Objekten aus dem Zoo der fraktalen Geometrie auf effiziente und anschauliche Weise zu visualisieren. Um sich die Rechenleistung der Computer zunutze zu machen dient eine Programmiersprache als Schnittstelle zwischen Computer und Mensch. Wir betrachten genauer ob sich die Programmiersprache \emph{Julia} zur Erstellung von Visualisierungen im Rahmen der fraktalen Geometrie eignet. In der Informatik, die einen Spagat zwischen Formalwissenschaft und Ingenieurswissenschaft bildet, stellt sich die Herausforderung, die Vielzahl an Objekten aus dem Zoo der fraktalen Geometrie auf effiziente und anschauliche Weise zu visualisieren. Um sich die Rechenleistung der Computer zunutze zu machen dient eine Programmiersprache als Schnittstelle zwischen Computer und Mensch. Wir betrachten genauer ob sich die Programmiersprache \emph{Julia} zur Erstellung von Visualisierungen im Rahmen der fraktalen Geometrie eignet.
\section{Hintergrund} \section{Hintergrund}
Für das Angehen von technischen Problemen werden ist populärste Ansatz zwei Sprachen zu verwenden. Eine Sprache mit leichter Syntax auf hoher Ebene wird in Kombination mit einer Sprache auf niedriger Abstraktionsebene mit hoher Performanz verwendet. Ein bekanntes Beispiel ist die Python-Bibliothek \textit{NumPy}, die in C geschrieben ist \autocite{bezansonAbstractionTechnicalComputing2015}. Ein anderer Ansatz zur Lösung dieses Problems war es vorerst Algorithmen innerhalb von Skriptsprachen zu schreiben und diese später in hardware-nahe Sprachen zu übertragen. Dieses Vorgehen ist mit einem hohen zeitlichen Aufwand und einer hohen Fehleranfälligkeit während des Übertragungsprozess verbunden \cite{perkelJuliaComeSyntax2019}. Für das Angehen von technischen Problemen ist der populärste Ansatz zwei Programmiersprachen zu verwenden. Eine Sprache mit leichter Syntax auf hoher Ebene wird in Kombination mit einer Sprache auf niedriger Abstraktionsebene mit hoher Performanz verwendet. Ein bekanntes Beispiel ist die Python-Bibliothek \textit{NumPy}, die in C geschrieben ist \autocite{bezansonAbstractionTechnicalComputing2015}. Ein anderer Ansatz zur Lösung dieses Problems ist: vorerst Algorithmen innerhalb von Skriptsprachen zu schreiben und diese später in hardware-nahe Sprachen zu übertragen. Dieses Vorgehen ist mit einem hohen zeitlichen Aufwand und einer hohen Fehleranfälligkeit während des Übertragungsprozess verbunden \cite{perkelJuliaComeSyntax2019}.
Julia wird als eine Lösung für diese Problematik, dem \textit{Zwei Sprachen Problem} angesehen. Julia wird als eine Lösung für diese Problematik, dem \textit{Zwei Sprachen Problem} angesehen.
Ein Team aus unabhängigen Entwicklern entschied sich 2009 den Startschuss für die Entwicklung von Julia zu setzen. Bis zur ersten Veröffentlichung von Julia verliefen 3 weitere Jahre . Ein Team aus unabhängigen Entwicklern startete 2009 die Entwicklung von Julia. Bis zur ersten Veröffentlichung von Julia verliefen 3 weitere Jahre.
Im August 2018 wurde die Veröffentlichung von Julia 1.0.0 bekanntgegeben \autocite{januszekComparativeAnalysisEfficiency2018}. Im August 2018 wurde die Veröffentlichung von Julia 1.0.0 bekanntgegeben \autocite{januszekComparativeAnalysisEfficiency2018}.
Julia ist eine dynamische Programmiersprache in welcher Variablen zwingend definiert werden müssen, bevor diese zum Einsatz kommen \autocite{cabuttoOverviewJuliaProgramming2018}. Eine Vielzahl an Elementen aus imperativen, funktionalen und objekt-orientieren Programmiersprachen lassen sich in Julia wiederfinden. Julia wurde für wissenschaftliches Berechnen konzeptioniert, aber ermöglicht auch allgemeine Programmierung. Die Inspiration von Julia liegt in den Sprachen Lisp, Perl, Lua und Ruby \autocite{bezansonJuliaLanguageDocumentation}. Wichtige Merkmale die Julia von anderen dynamischen Programmiersprachen abgrenzt sind nach Julia-Handbuch: Julia ist eine dynamische Programmiersprache in welcher Variablen zwingend definiert werden müssen, bevor diese zum Einsatz kommen \autocite{cabuttoOverviewJuliaProgramming2018}. Eine Vielzahl an Konzepten aus imperativen, funktionalen und objekt-orientieren Programmiersprachen lassen sich in Julia wiederfinden. Julia wurde für wissenschaftliches Berechnen konzeptioniert, aber ermöglicht auch allgemeine Programmierung \autocite{bezansonJuliaLanguageDocumentation}. Wichtige Merkmale, die Julia von anderen dynamischen Programmiersprachen abgrenzt sind nach Julia-Handbuch:
\begin{itemize} \begin{itemize}
\item Eine sehr schlanke Standard-Bibliothek, die alle grundlegenden numerischen Operationen und Typen bereitstellt \item Eine sehr schlanke Standard-Bibliothek, die alle grundlegenden numerischen Operationen und Typen bereitstellt
\item Ein breit aufgestellte Sprache um Objekte zu konstruieren und deren Typen zu beschreiben \item Ein breit aufgestellte Sprache um Objekte zu konstruieren und deren Typen zu beschreiben
@ -94,6 +96,7 @@ Julia ist eine dynamische Programmiersprache in welcher Variablen zwingend defin
\item Eine gute Performanz, die derer statisch-kompilierter Sprachen wie beispielsweise C nahekommt \item Eine gute Performanz, die derer statisch-kompilierter Sprachen wie beispielsweise C nahekommt
\end{itemize} \autocite{bezansonJuliaLanguageDocumentation}. \end{itemize} \autocite{bezansonJuliaLanguageDocumentation}.
Die Einsatzmöglichkeiten beschränken sich nicht auf einen konkreten Bereich. Julia stellt einen Werkzeug zur Lösung von Problemen innerhalb der Informatik, Mathematik, Ingenieurswissenschaft, Medizin und Wirtschaft dar \autocite{cabuttoOverviewJuliaProgramming2018}. Von höherem Interesse ist für uns der Einsatz von Julia innerhalb Mathematik, konkreter als Werkzeug für Visualisierungen im Teilgebiet der fraktalen Geometrie. Die Einsatzmöglichkeiten beschränken sich nicht auf einen konkreten Bereich. Julia stellt einen Werkzeug zur Lösung von Problemen innerhalb der Informatik, Mathematik, Ingenieurswissenschaft, Medizin und Wirtschaft dar \autocite{cabuttoOverviewJuliaProgramming2018}. Von höherem Interesse ist für uns der Einsatz von Julia innerhalb Mathematik, konkreter als Werkzeug für Visualisierungen im Teilgebiet der fraktalen Geometrie.
\section{Kriterien} \section{Kriterien}
Im folgenden Abschnitt betrachten wir die ausgewählten Kriterien bezüglich der Programmiersprache Julia und stellen jeweils die Relation der einzelnen Kriterien zur Fraktalen Geometrie her. Diese lassen sich unterteilen in generelle Eigenschaften der Programmiersprache Julia und welche, die speziell für Visualisierung innerhalb fraktale Geometrie von hoher Signifikanz sind. Wir evaluieren im Laufe der nächsten Abschnitte, weshalb die ausgewählten Kriterien für unsere Fragestellung relevant sind. Im folgenden Abschnitt betrachten wir die ausgewählten Kriterien bezüglich der Programmiersprache Julia und stellen jeweils die Relation der einzelnen Kriterien zur Fraktalen Geometrie her. Diese lassen sich unterteilen in generelle Eigenschaften der Programmiersprache Julia und welche, die speziell für Visualisierung innerhalb fraktale Geometrie von hoher Signifikanz sind. Wir evaluieren im Laufe der nächsten Abschnitte, weshalb die ausgewählten Kriterien für unsere Fragestellung relevant sind.
@ -112,7 +115,7 @@ Am Ende jedes Abschnitts beurteilen wir, wie gut das jeweilig genannte Kriterium
Für die Gestaltung interaktiver Software und der Erstellung von Bildern bzw. von Animationen bezüglich Fraktalen wird ein Anspruch auf eine schnelle Verarbeitung der Eingaben gesetzt. Besonders für Programme mit denen in Echtzeit verschiedene Formen von Fraktalen erkundet werden können ist eine gute Performanz von hoher Relevanz. Für die Gestaltung interaktiver Software und der Erstellung von Bildern bzw. von Animationen bezüglich Fraktalen wird ein Anspruch auf eine schnelle Verarbeitung der Eingaben gesetzt. Besonders für Programme mit denen in Echtzeit verschiedene Formen von Fraktalen erkundet werden können ist eine gute Performanz von hoher Relevanz.
Da viele Programmiersprachen heutzutage alle notwendigen Funktionalität zur Lösungen unterschiedlichen Problemtypen bereitstellen, spielt die Effizienz eine höhere Rolle innerhalb der Auswahl der Sprache, als im Vergleich zur Umsetzbarkeit \autocite{januszekComparativeAnalysisEfficiency2018}\\ Da viele Programmiersprachen heutzutage alle notwendigen Funktionalität zur Lösungen unterschiedlichen Problemtypen bereitstellen, spielt die Effizienz eine höhere Rolle innerhalb der Auswahl der Sprache, als im Vergleich zur Umsetzbarkeit \autocite{januszekComparativeAnalysisEfficiency2018}\\
In folgendem Abschnitt werden Performanz-Tests in den Programmiersprachen Julia 1.10.2, Python 3.12.2 und Java Open-JDK 19.0.2 durchgeführt. Die verwendete \ac{CPU} ist ein AMD Ryzen 5 3600 unter Windows 10 mit 16GB verfügbaren Arbeitsspeicher. Der zu testende Code wird aus Sicht eines Einsteigers der jeweiligen Programmiersprache geschrieben. Der Code macht keinen Gebrauch von explizit verwendeter Parallelisierung. Außerdem vermeiden wir Optimierung einzugehen die von genaueren Wissen technischer Details, der jeweiligen Programmiersprache ausgehen. Die Zeiten werden mithilfe des Julia Package \texttt{BenchmarkTools.jl}, des Python Moduls \texttt{timeit} und in Java per Aufruf der Methode \texttt{System.nanoTime()} erfasst. Jeder parametrisierte Aufruf eine Funktion wird 10-Mal durchgeführt. Aus den 10 Aufrufen wählen wir das Minimum aus. Dieses Vorgehen liefert eine Untergrenze der Ausführungszeit des Codes. Die Kompilierzeit der jeweiligen Sprache wird in unseren Tests nicht miteinbezogen.\\~\\ In folgendem Abschnitt werden Performanz-Tests in den Programmiersprachen Julia 1.10.2, Python 3.12.2 und Java Open-JDK 19.0.2 durchgeführt. Die verwendete \ac{CPU} ist ein AMD Ryzen 5 3600 unter Windows 10 mit 16GB verfügbaren Arbeitsspeicher. Der zu testende Code wird aus Sicht eines Einsteigers der jeweiligen Programmiersprache geschrieben. Der Code macht keinen Gebrauch von explizit verwendeter Parallelisierung. Außerdem vermeiden wir Optimierung einzugehen die von genaueren Wissen technischer Details, der jeweiligen Programmiersprache ausgehen. Die Zeiten werden mithilfe des Julia Package \texttt{BenchmarkTools.jl}, des Python Moduls \texttt{timeit} und in Java per Aufruf der Methode \texttt{System.nanoTime()} erfasst. Jeder parametrisierte Aufruf eine Funktion wird 10-Mal durchgeführt. Aus den 10 Aufrufen wählen wir das Minimum aus. Dieses Vorgehen liefert eine Untergrenze der Ausführungszeit des Codes. Die Kompilierzeit der jeweiligen Sprache wird in unseren Tests nicht miteinbezogen. Während der Arbeit mit Julia ist aufgefallen, dass Kompilierzeiten in der Länge stark variieren können.\\~\\
\subsubsection*{Performanz-Test} \subsubsection*{Performanz-Test}
Die Elemente der Mandelbrot-Menge $\mathbb{M}$ können nicht genau bestimmt werden. Es ist dennoch möglich Näherungsbilder der Mandelbrot-Menge $\mathbb{M}$ zu skizzieren \autocite{weitzKonkreteMathematikNicht2021}. Wir überprüfen die Performanz von Julia indem wir die beanspruchte Zeit für die Erstellung eine solchen Näherungsbildes betrachten. Komplexe Zahlen sind im Kontext dieses Tests festgelegt als Datenstruktur bestehende aus zwei 64-Bit Fließkommazahlen nach Spezifikation IEEE-754. Die Elemente der Mandelbrot-Menge $\mathbb{M}$ können nicht genau bestimmt werden. Es ist dennoch möglich Näherungsbilder der Mandelbrot-Menge $\mathbb{M}$ zu skizzieren \autocite{weitzKonkreteMathematikNicht2021}. Wir überprüfen die Performanz von Julia indem wir die beanspruchte Zeit für die Erstellung eine solchen Näherungsbildes betrachten. Komplexe Zahlen sind im Kontext dieses Tests festgelegt als Datenstruktur bestehende aus zwei 64-Bit Fließkommazahlen nach Spezifikation IEEE-754.
Die Mandelbrot-Menge ist nach Definition Teilmenge der komplexen Zahlen. Es lässt sich zeigen, dass alle Elemente der Mandelbrotmenge vollständig in der Kreisscheibe um 0 mit dem Radius 2 liegen \autocite{walterFraktaleGeometrischenElemente2018}. Diese Eigenschaft machen wir uns in unserem Näherungsbild zu nutze. Die Mandelbrot-Menge ist nach Definition Teilmenge der komplexen Zahlen. Es lässt sich zeigen, dass alle Elemente der Mandelbrotmenge vollständig in der Kreisscheibe um 0 mit dem Radius 2 liegen \autocite{walterFraktaleGeometrischenElemente2018}. Diese Eigenschaft machen wir uns in unserem Näherungsbild zu nutze.
@ -171,7 +174,7 @@ In folgendem Abschnitt betrachten wir ob die durch das Julia Ecosystem bereitges
\begin{itemize} \begin{itemize}
\item Fraktale, die Teilmenge der komplexen Zahlenebene sind. Beispiele dafür sind die Mandelbrot-Menge, sowie die Julia-Menge \autocite{walterFraktaleGeometrischenElemente2018}. \item Fraktale, die Teilmenge der komplexen Zahlenebene sind. Beispiele dafür sind die Mandelbrot-Menge, sowie die Julia-Menge \autocite{walterFraktaleGeometrischenElemente2018}.
\item Fraktale, die sich mithilfe eines Lindenmayer-Systems darstellen lassen, beispielsweise die Peano-Kurve oder die Kochsche Schneeflocke \autocite{alfonsecaRepresentationFractalCurves1996} \item Fraktale, die sich mithilfe eines Lindenmayer-Systems darstellen lassen, beispielsweise die Peano-Kurve oder die Kochsche Schneeflocke \autocite{alfonsecaRepresentationFractalCurves1996}
\item 3-dimensionale Fraktale, wie zum Beispiel den Menger-Schwamm oder eine 3-dimensionale Form des Sierpinski-Dreiecks \autocite{sternemannPlatonischeFraktaleIm} \item Fraktale innerhalb des 3-dimensionalen Raum, wie zum Beispiel den Menger-Schwamm oder eine 3-dimensionale Form des Sierpinski-Dreiecks \autocite{sternemannPlatonischeFraktaleIm}
\end{itemize} \end{itemize}
\subsubsection*{Julias Ecosystem} \subsubsection*{Julias Ecosystem}
@ -199,7 +202,7 @@ Neben den Standardbibliotheken, die mit der Installation einer Programmiersprach
Nach dem \ac{PYPL} Index wird Python als populärste Programmiersprache evaluiert. Julia hingegen belegt hingegen Platz 24 \autocite{carbonellePYPLPopularityProgramming2023}. Zwischen beiden Enden liegen die Programmiersprache R und MATLAB. Da MATLAB keinen klassischen Paketmanager besitzt wird hier zum Vergleich die Anzahl der von Nutzer bereit gestellten Programme auf dem MATLAB FileExchange verwendet. Aufallend ist das MATLAB trotz einer proprietären Lizenz eine höhere Anzahl an Paketen bzw. Programmen bereitstellt. Nach dem \ac{PYPL} Index wird Python als populärste Programmiersprache evaluiert. Julia hingegen belegt hingegen Platz 24 \autocite{carbonellePYPLPopularityProgramming2023}. Zwischen beiden Enden liegen die Programmiersprache R und MATLAB. Da MATLAB keinen klassischen Paketmanager besitzt wird hier zum Vergleich die Anzahl der von Nutzer bereit gestellten Programme auf dem MATLAB FileExchange verwendet. Aufallend ist das MATLAB trotz einer proprietären Lizenz eine höhere Anzahl an Paketen bzw. Programmen bereitstellt.
Diese hohe Popularität erklärt weshalb die Anzahl zwischen Paketen auf \ac{PyPi}, dem Python Package Index, und \textit{JuliaRegistry} sich dem Verhältnis 50:1 nähert. Diese hohe Popularität erklärt weshalb die Anzahl zwischen Paketen auf \ac{PyPi}, dem Python Package Index, und \textit{JuliaRegistry} sich dem Verhältnis 50:1 nähert.
Aufgrund des relativ jungen Alters, mit Veröffentlichung von Julia im Jahr 2012 \autocite{cabuttoOverviewJuliaProgramming2018} und der niedrigeren Popularität, besitzt Julia im Vergleich zu den restlichen ausgewählten Programmiersprachen die geringste Anzahl an Paketen. Aufgrund des relativ jungen Alters, mit Veröffentlichung von Julia im Jahr 2012 \autocite{cabuttoOverviewJuliaProgramming2018} und der niedrigeren Popularität, besitzt Julia im Vergleich zu den restlichen ausgewählten Programmiersprachen die geringste Anzahl an Paketen \autocite{perkelJuliaComeSyntax2019}.
\subsubsection*{Schildkröten und Kurven} \subsubsection*{Schildkröten und Kurven}
Eine häufig verwendete Strategie zur Darstellung von Fraktalen Kurven sind die von Seymour Papert im Jahr 1980 entwickelten Turtle-Grafiken. Eine häufig verwendete Strategie zur Darstellung von Fraktalen Kurven sind die von Seymour Papert im Jahr 1980 entwickelten Turtle-Grafiken.
@ -211,30 +214,43 @@ Dabei bewegt sich eine unsichtbare \enquote{Schildkröte} über eine Leinwand un
\end{itemize} \end{itemize}
Alleine mit einer kleinen Auswahl an Aktionen können komplexe Fraktale erschaffen werden. in Julia wird das Zeichnen von Turtle Grafiken durch das Paket \texttt{Luxor.jl} abgedeckt. Neben unserem Beispiel an 3 Aktionen stellt \texttt{Luxor.jl} 17 weitere möglichen Aktionen zur Bewegung der Schildkröte bereit \autocite{cormullionLuxorJlDokumentation}. Alleine mit einer kleinen Auswahl an Aktionen können komplexe Fraktale erschaffen werden. in Julia wird das Zeichnen von Turtle Grafiken durch das Paket \texttt{Luxor.jl} abgedeckt. Neben unserem Beispiel an 3 Aktionen stellt \texttt{Luxor.jl} 17 weitere möglichen Aktionen zur Bewegung der Schildkröte bereit \autocite{cormullionLuxorJlDokumentation}.
Mithilfe der Regeln der Turtle-Grafiken lassen sich Lindenmayer Systeme, kurz L-System, darstellen. Ein L-System liefert eine Liste an Ersetzungsregeln die alle gleichzeitig auf eine Zeichenkette angewendet werden. \autocite{mcandrewLindenmayerSystemsFractals}. Diese Ersetzungsregeln können beispielsweise auf Zeichenketten bzw. die Aktionen unserer Schildkröte, bestehend aus F, +, - angewendet werden. Mithilfe der Regeln der Turtle-Grafiken lassen sich Lindenmayer Systeme, kurz L-System, darstellen. Ein L-System liefert eine Liste an Ersetzungsregeln die alle gleichzeitig auf eine Zeichenkette angewendet werden. \autocite{mcandrewLindenmayerSystemsFractals}. Diese Ersetzungsregeln können beispielsweise auf Zeichenketten bzw. die Aktionen unserer Schildkröte, bestehend aus F, +, - angewendet werden. Das $n$-fache Anwenden der festgelegten Ersetzungsregeln liefert uns eine Näherung der $n$-ten Iteration des Fraktals. Alle hier gezeigten Kurven werden in vierter Iteration dargestellt.
Der übrigbleibende Aufwand besteht nur noch darin das L-System in die Aktionen einer Turtle-Grafik zu übersetzen. Das Softwarepaket \texttt{Lindenmayer.jl} abstrahiert uns diesen Arbeitsaufwand weg. Der übrigbleibende Aufwand besteht nur noch darin das L-System in die Aktionen einer Turtle-Grafik zu übersetzen. Das Softwarepaket \texttt{Lindenmayer.jl} abstrahiert uns diesen Arbeitsaufwand weg.
Verwenden wir 3 Kopien der \emph{kochschen Kurve} und legen diese zu einem Dreieck zusammen, so erhalten wir die \emph{kochsche Schneeflocke}. Beide Visualisierungen wurden mithilfe von \texttt{Lindenmayer.jl} erstellt. Verwenden wir 3 Kopien der \emph{kochschen Kurve} und legen diese zu einem Dreieck zusammen, so erhalten wir die \emph{kochsche Schneeflocke}. Auch die erstmalig erwähnte Hilbert-Kurve können wir visualisieren. Beide Visualisierungen wurden mithilfe von \texttt{Lindenmayer.jl} erstellt.
\begin{figure}[h!] \begin{figure}[!h]
\centering \centering
\label{fig:koch_snowflake} \begin{minipage}[b]{0.49\columnwidth}
\includegraphics[width=0.5\columnwidth]{images/koch_snowflake.png} \includegraphics[width=\textwidth]{images/koch_snowflake.png}
\caption{Kochsche Schneeflocke} \caption{Koch Schneeflocke}
\end{minipage}
\hfill
\begin{minipage}[b]{0.49\columnwidth}
\includegraphics[width=\textwidth]{images/hilbert_curve.png}
\caption{Hilbert Kurve}
\end{minipage}
\end{figure} \end{figure}
\subsubsection*{Fraktale in $\mathbb{C}$} \subsubsection*{Fraktale in $\mathbb{C}$}
Die Mandelbrot-Menge, sowie die Julia-Menge liegen innerhalb der komplexen Zahlen. Mithilfe der Stratege die Mandelbrot-Menge in Form eines Rasters unter Nutzung des \textit{Escape Time Algorithmus} \autoref{alg:escape_time_algorithm} erhalten wir ein Raster bzw. eine Matrix mit den Fluchtzeiten der jeweiligen Eingabewerte. Die Mandelbrot-Menge, sowie die Julia-Menge liegen innerhalb der komplexen Zahlen. Mithilfe der Stratege die Mandelbrot-Menge in Form eines Rasters unter Nutzung des \textit{Escape Time Algorithmus} \autoref{alg:escape_time_algorithm} erhalten wir ein Raster bzw. eine Matrix mit den Fluchtzeiten der jeweiligen Eingabewerte.
Für vielseitige Visualisierungen ist eine einheitliche Schnittstelle für Farbmodelle und Rastergrafiken vonnöten. Diese geforderte Funktionalität wird durch das Julia-Paket \texttt{JuliaImages.jl} realisiert. Das Paket \texttt{Makie.jl} liefert eine Darstellungsmöglichkeit für 2-dimensionale Rastergrafiken in Form interaktiver Anwendungen mithilfe Benutzereingaben wie bspw. Textboxen, Knöpfe, Slider \autocite{danischMakieJlFlexible2021}. Für vielseitige Visualisierungen ist eine einheitliche Schnittstelle für Farbmodelle und Rastergrafiken vonnöten. Diese geforderte Funktionalität wird durch das Julia-Paket \emph{JuliaImages}: \texttt{Images.jl} realisiert. Das Paket \texttt{Makie.jl} liefert eine Darstellungsmöglichkeit für 2-dimensionale Rastergrafiken in Form interaktiver Anwendungen mithilfe Benutzereingaben wie bspw. Textboxen, Knöpfe, Slider \autocite{danischMakieJlFlexible2021}.
Die kolorierten Visualisierungen der Mandelbrot- und einer konkreten Julia-Menge wurden mithilfe von \texttt{Makie.jl} erstellt:
\begin{figure}[h!] \begin{figure}[!h]
\centering \centering
\label{fig:juliaset} \begin{minipage}[b]{0.49\columnwidth}
\includegraphics[width=0.6\columnwidth]{images/juliaset.png} \includegraphics[width=\textwidth]{images/julia_abs.png}
\caption{kolorierte Julia-Menge} \caption{Julia-Menge}
\end{minipage}
\hfill
\begin{minipage}[b]{0.49\columnwidth}
\includegraphics[width=\textwidth]{images/mandelbrot_abs.png}
\caption{Mandelbrot-Menge}
\end{minipage}
\end{figure} \end{figure}
\subsubsection*{3-dimensionale Fraktale} \subsubsection*{Fraktale im 3-dimensionalen Raum}
Neben der Möglichkeit 2-dimensionale Rastergrafiken zu erzeugen bietet \texttt{Makie.jl} die Option innerhalb eines 3-dimensionalen Raumes Objekte darzustellen. Mithilfe eines Voxel-Systems können fraktale Objekte mithilfe Würfeln angenähert werden. Neben Würfeln bieten Polygone und Linien weitere Grundbausteine für die Erstellung komplexer Objekte. \autocite{danischMakieJlFlexible2021}. Weitere Möglichkeiten zur Erstellung von 3-dimensionalen Objekten sind das angeben eines Volumens oder das Laden von \texttt{.obj}-Dateien. Die Konstruktion von größeren Objekten erstellt sich aufgrund der zusätzlichen Dimension als schwieriges Unterfangen dar \autocite{danischMakieJlFlexible2021}. Neben der Möglichkeit 2-dimensionale Rastergrafiken zu erzeugen bietet \texttt{Makie.jl} die Option innerhalb eines 3-dimensionalen Raumes Objekte darzustellen. Mithilfe eines Voxel-Systems können fraktale Objekte mithilfe Würfeln angenähert werden. Neben Würfeln bieten Polygone und Linien weitere Grundbausteine für die Erstellung komplexer Objekte. \autocite{danischMakieJlFlexible2021}. Weitere Möglichkeiten zur Erstellung von 3-dimensionalen Objekten sind das angeben eines Volumens oder das Laden von \texttt{.obj}-Dateien. Die Konstruktion von größeren Objekten erstellt sich aufgrund der zusätzlichen Dimension als schwieriges Unterfangen dar \autocite{danischMakieJlFlexible2021}.
@ -274,7 +290,7 @@ Wir klassifizieren eine Auswahl an Entwicklungsumgebungen für Julia. Für jede
\end{footnotesize} \end{footnotesize}
\end{table} \end{table}
Aus \autoref{table:ides} ist zu erkennen, dass die Unterstützung von Julia in Form von Notebooks weiterhin gewährleistet ist. Eine eigenständige Entwicklungsumgebung an der aktiv gearbeitet wird ist in unserer Auswahl nicht zu finden. Aus der Kategorie der \textit{Erweiterungen} wird alleinig Julia für Visual Studio Code unterstützt. Zu bemerken ist das die Programmiersprache Julia, sowie auch alle der genannten Entwicklungsumgebungen \acs{IDE} aus \autoref{table:ides} keiner proprietären Lizenz unterworfen ist \autocite{bezansonJuliaLanguageDocumentation}. Dies sorgt für eine hohe Zugänglichkeit. Aus \autoref{table:ides} ist zu erkennen, dass die Unterstützung von Julia in Form von Notebooks weiterhin gewährleistet ist. Das bekannteste Beispiel sind \emph{Jupyter} Notebooks, dessen Name sich aus den Programmiersprachen \textbf{Ju}lia \textbf{Py}thon und \textbf{R} zusammensetzt \autocite{perkelJuliaComeSyntax2019}. Eine eigenständige Entwicklungsumgebung an der aktiv gearbeitet wird ist in unserer Auswahl nicht zu finden. Aus der Kategorie der \textit{Erweiterungen} wird alleinig Julia für Visual Studio Code unterstützt. Zu bemerken ist das die Programmiersprache Julia, sowie auch alle der genannten Entwicklungsumgebungen \acs{IDE} aus \autoref{table:ides} keiner proprietären Lizenz unterworfen ist \autocite{bezansonJuliaLanguageDocumentation}. Dies sorgt für eine hohe Zugänglichkeit
\section{Ergebnis} \section{Ergebnis}
@ -288,6 +304,7 @@ Die Einschränkungen bezüglich einer getroffenen Auswahl ist auf die ausgewähl
\section{Ausblick} \section{Ausblick}
Um die Popularität der Programmiersprache Julia zu steigern ist es wichtig, dass Nutzern gezeigt wird wie Sie die beste Performanz aus Julia herausholen können. Dieses Ziel kann mittels einer kontinuierlich guten Dokumentation erreicht werden \autocite{cabuttoOverviewJuliaProgramming2018}. Eine größere Nutzerbasis sorgt zudem für eine Weiterentwicklung bzw. Neuentwicklung von Werkzeugen und Paketen für das Julia Ecosystem.
% -------------------------------------------------------------------- % --------------------------------------------------------------------
\section*{Abkürzungen} \section*{Abkürzungen}