From f3ced170faef47bcdf76f96eabf0534a58fd348e Mon Sep 17 00:00:00 2001 From: Fabian <@> Date: Fri, 22 Jul 2022 16:31:41 +0200 Subject: 0f1, struktur --- buch/papers/0f1/images/airy.pdf | Bin 0 -> 25568 bytes buch/papers/0f1/images/konvergenzAiry.pdf | Bin 0 -> 15137 bytes buch/papers/0f1/images/konvergenzNegativ.pdf | Bin 0 -> 16312 bytes buch/papers/0f1/images/konvergenzPositiv.pdf | Bin 0 -> 18924 bytes buch/papers/0f1/images/stabilitaet.pdf | Bin 0 -> 20944 bytes buch/papers/0f1/listings/kettenbruchIterativ.c | 45 ++++++++++++++++++++++++ buch/papers/0f1/listings/kettenbruchRekursion.c | 19 ++++++++++ buch/papers/0f1/listings/potenzreihe.c | 13 +++++++ 8 files changed, 77 insertions(+) create mode 100644 buch/papers/0f1/images/airy.pdf create mode 100644 buch/papers/0f1/images/konvergenzAiry.pdf create mode 100644 buch/papers/0f1/images/konvergenzNegativ.pdf create mode 100644 buch/papers/0f1/images/konvergenzPositiv.pdf create mode 100644 buch/papers/0f1/images/stabilitaet.pdf create mode 100644 buch/papers/0f1/listings/kettenbruchIterativ.c create mode 100644 buch/papers/0f1/listings/kettenbruchRekursion.c create mode 100644 buch/papers/0f1/listings/potenzreihe.c (limited to 'buch/papers/0f1') diff --git a/buch/papers/0f1/images/airy.pdf b/buch/papers/0f1/images/airy.pdf new file mode 100644 index 0000000..672d789 Binary files /dev/null and b/buch/papers/0f1/images/airy.pdf differ diff --git a/buch/papers/0f1/images/konvergenzAiry.pdf b/buch/papers/0f1/images/konvergenzAiry.pdf new file mode 100644 index 0000000..2e635ea Binary files /dev/null and b/buch/papers/0f1/images/konvergenzAiry.pdf differ diff --git a/buch/papers/0f1/images/konvergenzNegativ.pdf b/buch/papers/0f1/images/konvergenzNegativ.pdf new file mode 100644 index 0000000..3b58be4 Binary files /dev/null and b/buch/papers/0f1/images/konvergenzNegativ.pdf differ diff --git a/buch/papers/0f1/images/konvergenzPositiv.pdf b/buch/papers/0f1/images/konvergenzPositiv.pdf new file mode 100644 index 0000000..24e3fd5 Binary files /dev/null and b/buch/papers/0f1/images/konvergenzPositiv.pdf differ diff --git a/buch/papers/0f1/images/stabilitaet.pdf b/buch/papers/0f1/images/stabilitaet.pdf new file mode 100644 index 0000000..be4af42 Binary files /dev/null and b/buch/papers/0f1/images/stabilitaet.pdf differ diff --git a/buch/papers/0f1/listings/kettenbruchIterativ.c b/buch/papers/0f1/listings/kettenbruchIterativ.c new file mode 100644 index 0000000..befea8e --- /dev/null +++ b/buch/papers/0f1/listings/kettenbruchIterativ.c @@ -0,0 +1,45 @@ +static double fractionRekursion0f1(const double c, const double x, unsigned int n) +{ + double a = 0.0; + double b = 0.0; + double Ak = 0.0; + double Bk = 0.0; + double Ak_1 = 0.0; + double Bk_1 = 0.0; + double Ak_2 = 0.0; + double Bk_2 = 0.0; + + for (unsigned int k = 0; k <= n; ++k) + { + if (k == 0) + { + a = 1.0; //a0 + //recursion fomula for A0, B0 + Ak = a; + Bk = 1.0; + } + else if (k == 1) + { + a = 1.0; //a1 + b = x/c; //b1 + //recursion fomula for A1, B1 + Ak = a * Ak_1 + b * 1.0; + Bk = a * Bk_1; + } + else + { + a = 1 + (x / (k * ((k - 1) + c)));//ak + b = -(x / (k * ((k - 1) + c))); //bk + //recursion fomula for Ak, Bk + Ak = a * Ak_1 + b * Ak_2; + Bk = a * Bk_1 + b * Bk_2; + } + //save old values + Ak_2 = Ak_1; + Bk_2 = Bk_1; + Ak_1 = Ak; + Bk_1 = Bk; + } + //approximation fraction + return Ak/Bk; +} diff --git a/buch/papers/0f1/listings/kettenbruchRekursion.c b/buch/papers/0f1/listings/kettenbruchRekursion.c new file mode 100644 index 0000000..958d4e1 --- /dev/null +++ b/buch/papers/0f1/listings/kettenbruchRekursion.c @@ -0,0 +1,19 @@ +static double fractionIter0f1(const double b0, const double z, unsigned int n) +{ + double a = 0.0; + double b = 0.0; + double abn = 0.0; + double temp = 0.0; + + for (; n > 0; --n) + { + abn = z / (n * ((n - 1) + b0)); //abn = ak, bk + + a = n > 1 ? (1 + abn) : 1; //a0, a1 + b = n > 1 ? -abn : abn; //b1 + + temp = b / (a + temp); + } + + return a + temp; //a0 + temp +} \ No newline at end of file diff --git a/buch/papers/0f1/listings/potenzreihe.c b/buch/papers/0f1/listings/potenzreihe.c new file mode 100644 index 0000000..bfaa0e3 --- /dev/null +++ b/buch/papers/0f1/listings/potenzreihe.c @@ -0,0 +1,13 @@ +#include + +static double powerseries(const double b, const double z, unsigned int n) +{ + double temp = 0.0; + + for (unsigned int k = 0; k < n; ++k) + { + temp += pow(z, k) / (factorial(k) * pochhammer(b, k)); + } + + return temp; +} \ No newline at end of file -- cgit v1.2.1 From bed0b6e09967200014ab83444a8b4316f285781a Mon Sep 17 00:00:00 2001 From: Fabian <@> Date: Mon, 25 Jul 2022 00:27:05 +0200 Subject: 0f1, inhalt struktur --- buch/papers/0f1/main.tex | 32 ++++-------- buch/papers/0f1/teil0.tex | 31 +++++------- buch/papers/0f1/teil1.tex | 121 ++++++++++++++++++++++++++++------------------ buch/papers/0f1/teil2.tex | 103 ++++++++++++++++++++++++++------------- buch/papers/0f1/teil3.tex | 85 +++++++++++++++++++------------- 5 files changed, 215 insertions(+), 157 deletions(-) (limited to 'buch/papers/0f1') diff --git a/buch/papers/0f1/main.tex b/buch/papers/0f1/main.tex index 264ad56..b8cdc21 100644 --- a/buch/papers/0f1/main.tex +++ b/buch/papers/0f1/main.tex @@ -3,29 +3,17 @@ % % (c) 2020 Hochschule Rapperswil % -\chapter{Thema\label{chapter:0f1}} -\lhead{Thema} +% + + + +\chapter{Algorithmus zur Berechnung von $\mathstrut_0F_1$\label{chapter:0f1}} +\lhead{Algorithmus zur Berechnung von $\mathstrut_0F_1$} \begin{refsection} -\chapterauthor{Hans Muster} - -Ein paar Hinweise für die korrekte Formatierung des Textes -\begin{itemize} -\item -Absätze werden gebildet, indem man eine Leerzeile einfügt. -Die Verwendung von \verb+\\+ ist nur in Tabellen und Arrays gestattet. -\item -Die explizite Platzierung von Bildern ist nicht erlaubt, entsprechende -Optionen werden gelöscht. -Verwenden Sie Labels und Verweise, um auf Bilder hinzuweisen. -\item -Beginnen Sie jeden Satz auf einer neuen Zeile. -Damit ermöglichen Sie dem Versionsverwaltungssysteme, Änderungen -in verschiedenen Sätzen von verschiedenen Autoren ohne Konflikt -anzuwenden. -\item -Bilden Sie auch für Formeln kurze Zeilen, einerseits der besseren -Übersicht wegen, aber auch um GIT die Arbeit zu erleichtern. -\end{itemize} +\chapterauthor{Fabian Dünki} + + + \input{papers/0f1/teil0.tex} \input{papers/0f1/teil1.tex} diff --git a/buch/papers/0f1/teil0.tex b/buch/papers/0f1/teil0.tex index 9087808..bfc265f 100644 --- a/buch/papers/0f1/teil0.tex +++ b/buch/papers/0f1/teil0.tex @@ -1,22 +1,15 @@ % -% einleitung.tex -- Beispiel-File für die Einleitung +% einleitung.tex -- Einleitung % -% (c) 2020 Prof Dr Andreas Müller, Hochschule Rapperswil +% (c) 2022 Fabian Dünki, Hochschule Rapperswil % -\section{Teil 0\label{0f1:section:teil0}} -\rhead{Teil 0} -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam -nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam -erat, sed diam voluptua \cite{0f1:bibtex}. -At vero eos et accusam et justo duo dolores et ea rebum. -Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum -dolor sit amet. - -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam -nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam -erat, sed diam voluptua. -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita -kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit -amet. - - +\section{Ausgangslage\label{0f1:section:ausgangslage}} +\rhead{Ausgangslage} +Die Hypergeometrische Funktion $\mathstrut_0F_1$ wird in vielen Funktionen als Basisfunktion benutzt, +zum Beispiel um die Airy Funktion zu berechnen. +In der GNU Scientific Library \cite{library-gsl} +ist die Funktion $\mathstrut_0F_1$ vorhanden. +Allerdings wirft die Funktion, bei negativen Übergabenwerten wie zum Beispiel \verb+gsl_sf_hyperg_0F1(1, -1)+, eine Exception. +Bei genauerer Untersuchung hat sich gezeigt, dass die Funktion je nach Betriebssystem funktioniert oder eben nicht. +So kann die Funktion unter Windows fehlerfrei aufgerufen werden, beim Mac OS und Linux sind negative Übergabeparameter im Moment nicht möglich. +Ziel dieser Arbeit war es zu evaluieren, ob es mit einfachen mathematischen Operationen möglich ist, die Hypergeometrische Funktion $\mathstrut_0F_1$ zu implementieren. diff --git a/buch/papers/0f1/teil1.tex b/buch/papers/0f1/teil1.tex index aca84d2..910e8bb 100644 --- a/buch/papers/0f1/teil1.tex +++ b/buch/papers/0f1/teil1.tex @@ -1,55 +1,80 @@ % -% teil1.tex -- Beispiel-File für das Paper +% teil1.tex -- Mathematischer Hintergrund % -% (c) 2020 Prof Dr Andreas Müller, Hochschule Rapperswil +% (c) 2022 Fabian Dünki, Hochschule Rapperswil % -\section{Teil 1 -\label{0f1:section:teil1}} -\rhead{Problemstellung} -Sed ut perspiciatis unde omnis iste natus error sit voluptatem -accusantium doloremque laudantium, totam rem aperiam, eaque ipsa -quae ab illo inventore veritatis et quasi architecto beatae vitae -dicta sunt explicabo. -Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit -aut fugit, sed quia consequuntur magni dolores eos qui ratione -voluptatem sequi nesciunt -\begin{equation} -\int_a^b x^2\, dx +\section{Mathematischer Hintergrund +\label{0f1:section:mathHintergrund}} +\rhead{Mathematischer Hintergrund} + +\subsection{Hypergeometrische Funktion $\mathstrut_0F_1$ +\label{0f1:subsection:0f1}} +Wie in Kapitel \ref{buch:rekursion:section:hypergeometrische-funktion} beschrieben, +wird die Funktion $\mathstrut_0F_1$ folgendermassen definiert. +\begin{definition} + \label{0f1:rekursion:hypergeometrisch:def} + Die hypergeometrische Funktion + $\mathstrut_0F_1$ ist definiert durch die Reihe + \[ + \mathstrut_0F_1 + \biggl( + \begin{matrix} + \\ + b_1 + \end{matrix} + ; + x + \biggr) + = + \mathstrut_0F_1(;b_1;x) + = + \sum_{k=0}^\infty + \frac{1}{(b_1)_k}\frac{x^k}{k!}. + \] +\end{definition} + + +\subsection{Airy Funktion +\label{0f1:subsection:airy}} +Wie in \ref{buch:differentialgleichungen:section:hypergeometrisch} dargestellt, ist die Airy-Differentialgleichung +folgendermassen definiert. +\begin{definition} + y'' - xy = 0 + \label{0f1:airy:eq:differentialgleichung} +\end{definition} + +Daraus ergibt sich wie in Aufgabe~\ref{503} gefundenen Lösungen der +Airy-Differentialgleichung als hypergeometrische Funktionen. + + +\begin{align*} +y_1(x) += +\sum_{k=0}^\infty +\frac{1}{(\frac23)_k} \frac{1}{k!}\biggl(\frac{x^3}{9}\biggr)^k += +\mathstrut_0F_1\biggl( +\begin{matrix}\text{---}\\\frac23\end{matrix};\frac{x^3}{9} +\biggr). +\\ +y_2(x) = -\left[ \frac13 x^3 \right]_a^b +\sum_{k=0}^\infty +\frac{1}{(\frac43)_k} \frac{1}{k!}\biggl(\frac{x^3}{9}\biggr)^k = -\frac{b^3-a^3}3. -\label{0f1:equation1} -\end{equation} -Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, -consectetur, adipisci velit, sed quia non numquam eius modi tempora -incidunt ut labore et dolore magnam aliquam quaerat voluptatem. - -Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis -suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? -Quis autem vel eum iure reprehenderit qui in ea voluptate velit -esse quam nihil molestiae consequatur, vel illum qui dolorem eum -fugiat quo voluptas nulla pariatur? - -\subsection{De finibus bonorum et malorum -\label{0f1:subsection:finibus}} -At vero eos et accusamus et iusto odio dignissimos ducimus qui -blanditiis praesentium voluptatum deleniti atque corrupti quos -dolores et quas molestias excepturi sint occaecati cupiditate non -provident, similique sunt in culpa qui officia deserunt mollitia -animi, id est laborum et dolorum fuga \eqref{000tempmlate:equation1}. - -Et harum quidem rerum facilis est et expedita distinctio -\ref{0f1:section:loesung}. -Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil -impedit quo minus id quod maxime placeat facere possimus, omnis -voluptas assumenda est, omnis dolor repellendus -\ref{0f1:section:folgerung}. -Temporibus autem quibusdam et aut officiis debitis aut rerum -necessitatibus saepe eveniet ut et voluptates repudiandae sint et -molestiae non recusandae. -Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis -voluptatibus maiores alias consequatur aut perferendis doloribus -asperiores repellat. +x\cdot\mathstrut_0F_1\biggl( +\begin{matrix}\text{---}\\\frac43\end{matrix}; +\frac{x^3}{9} +\biggr). +\qedhere +\end{align*} +\begin{figure} + \centering + \includegraphics{papers/0f1/images/airy.pdf} + \caption{Plot der Lösungen der Airy-Differentialgleichung $y''-xy=0$ + zu den Anfangsbedingungen $y(0)=1$ und $y'(0)=0$ in {\color{red}rot} + und $y(0)=0$ und $y'(0)=1$ in {\color{blue}blau}. + \label{0f1:airy:plot:vorgabe}} +\end{figure} \ No newline at end of file diff --git a/buch/papers/0f1/teil2.tex b/buch/papers/0f1/teil2.tex index 804d11b..07e17c0 100644 --- a/buch/papers/0f1/teil2.tex +++ b/buch/papers/0f1/teil2.tex @@ -1,40 +1,75 @@ % -% teil2.tex -- Beispiel-File für teil2 +% teil2.tex -- Umsetzung in C Programmen % -% (c) 2020 Prof Dr Andreas Müller, Hochschule Rapperswil +% (c) 2022 Fabian Dünki, Hochschule Rapperswil % -\section{Teil 2 +\section{Umsetzung \label{0f1:section:teil2}} -\rhead{Teil 2} -Sed ut perspiciatis unde omnis iste natus error sit voluptatem -accusantium doloremque laudantium, totam rem aperiam, eaque ipsa -quae ab illo inventore veritatis et quasi architecto beatae vitae -dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit -aspernatur aut odit aut fugit, sed quia consequuntur magni dolores -eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam -est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci -velit, sed quia non numquam eius modi tempora incidunt ut labore -et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima -veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, -nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure -reprehenderit qui in ea voluptate velit esse quam nihil molestiae -consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla -pariatur? - -\subsection{De finibus bonorum et malorum -\label{0f1:subsection:bonorum}} -At vero eos et accusamus et iusto odio dignissimos ducimus qui -blanditiis praesentium voluptatum deleniti atque corrupti quos -dolores et quas molestias excepturi sint occaecati cupiditate non -provident, similique sunt in culpa qui officia deserunt mollitia -animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis -est et expedita distinctio. Nam libero tempore, cum soluta nobis -est eligendi optio cumque nihil impedit quo minus id quod maxime -placeat facere possimus, omnis voluptas assumenda est, omnis dolor -repellendus. Temporibus autem quibusdam et aut officiis debitis aut -rerum necessitatibus saepe eveniet ut et voluptates repudiandae -sint et molestiae non recusandae. Itaque earum rerum hic tenetur a -sapiente delectus, ut aut reiciendis voluptatibus maiores alias -consequatur aut perferendis doloribus asperiores repellat. +\rhead{Umsetzung} +Zur Umsetzung wurden drei Ansätze gewählt und +Die Unterprogramme wurde jeweils, wie die GNU Scientific Library, in C geschrieben. +\subsection{Potenzreihe +\label{0f1:subsection:potenzreihe}} +Die naheliegendste Lösung ist die Programmierung der Potenzreihe. +\begin{equation} + \label{0f1:rekursion:hypergeometrisch:eq} + \mathstrut_0F_1(;b;z) + = + \sum_{k=0}^\infty + \frac{z^k}{(b)_k \cdot k!} +\end{equation} + +\lstinputlisting[style=C,float,caption={Rekursivformel für Kettenbruch.},label={0f1:listing:potenzreihe}]{papers/0f1/listings/potenzreihe.c} + +\subsection{Kettenbruch +\label{0f1:subsection:kettenbruch}} +Ein endlicher Kettenbruch ist ein Bruch der Form +\begin{equation} +a_0 + \cfrac{b_1}{a_1+\cfrac{b_2}{a_2+\cfrac{\cdots}{\cdots+\cfrac{b_{n-1}}{a_{n-1} + \cfrac{b_n}{a_n}}}}} +\end{equation} +in welchem $a_0, a_1,\dots,a_n$ und $b_1,b_2,\dots,b_n$ ganze Zahlen +darstellen. + +{\color{red}TODO: Bessere Beschreibung mit Verknüpfung zur Potenzreihe} + +%Gauss hat durch + +\lstinputlisting[style=C,float,caption={Rekursivformel für Kettenbruch.},label={0f1:listing:kettenbruchIterativ}]{papers/0f1/listings/kettenbruchIterativ.c} +\subsection{Rekursionsformel +\label{0f1:subsection:rekursionsformel}} +Wesentlich effizienter zur Berechnung eines Kettenbruches ist die Rekursionsformel. + +\begin{align*} +\frac{A_n}{B_n} += +a_0 + \cfrac{b_1}{a_1+\cfrac{b_2}{a_2+\cfrac{\cdots}{\cdots+\cfrac{b_{n-1}}{a_{n-1} + \cfrac{b_n}{a_n}}}}} +\end{align*} + +Die Berechnung von $A_n, B_n$ kann man auch ohne die Matrizenschreibweise +aufschreiben: +\begin{itemize} +\item Start: +\begin{align*} +A_{-1} &= 0 & A_0 &= a_0 \\ +B_{-1} &= 1 & B_0 &= 1 +\end{align*} +$\rightarrow$ 0-te Näherung: $\displaystyle\frac{A_0}{B_0} = a_0$ +\item Schritt $k\to k+1$: +\[ +\begin{aligned} +k &\rightarrow k + 1: +& +A_{k+1} &= A_{k-1} \cdot b_k + A_k \cdot a_k \\ +&& +B_{k+1} &= B_{k-1} \cdot b_k + B_k \cdot a_k +\end{aligned} +\] +\item +Näherungsbruch $n$: \qquad$\displaystyle\frac{A_n}{B_n}$ +\end{itemize} +{\color{red}TODO: Verweis Numerik} + + +\lstinputlisting[style=C,float,caption={Rekursivformel für Kettenbruch.},label={0f1:listing:kettenbruchRekursion}]{papers/0f1/listings/kettenbruchRekursion.c} \ No newline at end of file diff --git a/buch/papers/0f1/teil3.tex b/buch/papers/0f1/teil3.tex index 25472cb..dca61f8 100644 --- a/buch/papers/0f1/teil3.tex +++ b/buch/papers/0f1/teil3.tex @@ -1,40 +1,57 @@ % -% teil3.tex -- Beispiel-File für Teil 3 +% teil3.tex -- Resultate und Ausblick % -% (c) 2020 Prof Dr Andreas Müller, Hochschule Rapperswil +% (c) 2022 Fabian Dünki, Hochschule Rapperswil % -\section{Teil 3 +\section{Resultate \label{0f1:section:teil3}} -\rhead{Teil 3} -Sed ut perspiciatis unde omnis iste natus error sit voluptatem -accusantium doloremque laudantium, totam rem aperiam, eaque ipsa -quae ab illo inventore veritatis et quasi architecto beatae vitae -dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit -aspernatur aut odit aut fugit, sed quia consequuntur magni dolores -eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam -est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci -velit, sed quia non numquam eius modi tempora incidunt ut labore -et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima -veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, -nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure -reprehenderit qui in ea voluptate velit esse quam nihil molestiae -consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla -pariatur? - -\subsection{De finibus bonorum et malorum -\label{0f1:subsection:malorum}} -At vero eos et accusamus et iusto odio dignissimos ducimus qui -blanditiis praesentium voluptatum deleniti atque corrupti quos -dolores et quas molestias excepturi sint occaecati cupiditate non -provident, similique sunt in culpa qui officia deserunt mollitia -animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis -est et expedita distinctio. Nam libero tempore, cum soluta nobis -est eligendi optio cumque nihil impedit quo minus id quod maxime -placeat facere possimus, omnis voluptas assumenda est, omnis dolor -repellendus. Temporibus autem quibusdam et aut officiis debitis aut -rerum necessitatibus saepe eveniet ut et voluptates repudiandae -sint et molestiae non recusandae. Itaque earum rerum hic tenetur a -sapiente delectus, ut aut reiciendis voluptatibus maiores alias -consequatur aut perferendis doloribus asperiores repellat. +\rhead{Resultate} +Im Verlauf des Seminares hat sich gezeigt, +das ein einfacher mathematischer Algorithmus zu implementieren gar nicht so einfach ist. +So haben alle drei umgesetzten Ansätze Probleme mit grossen negativen x in der Funktion $\mathstrut_0F_1(;b;x)$. +Ebenso wird, je grösser der Wert x wird $\mathstrut_0F_1(;b;x)$, desto mehr weichen die berechneten Resultate +von den erwarteten ab. +{\color{red}TODO cite wolfram alpha rechner} + +\subsection{Auswertung +\label{0f1:subsection:auswertung}} +\begin{figure} + \centering + \includegraphics[width=0.8\textwidth]{papers/0f1/images/konvergenzAiry.pdf} + \caption{Konvergenz nach drei Iterationen, dargestellt anhand der Airy Funktion}. + \label{0f1:ausblick:plot:airy:konvergenz}} +\end{figure} + +\begin{figure} + \centering + \includegraphics[width=0.8\textwidth]{papers/0f1/images/konvergenzPositiv.pdf} + \caption{Konvergenz: Logarithmisch dargestellte Differenz vom erwarteten Endresultat}. + \label{0f1:ausblick:plot:konvergenz:positiv}} +\end{figure} + +\begin{figure} + \centering + \includegraphics[width=0.8\textwidth]{papers/0f1/images/konvergenzNegativ.pdf} + \caption{Konvergenz: Logarithmisch dargestellte Differenz vom erwarteten Endresultat}. + \label{0f1:ausblick:plot:konvergenz:negativ}} +\end{figure} + +\begin{figure} + \centering + \includegraphics[width=1\textwidth]{papers/0f1/images/stabilitaet.pdf} + \caption{Stabilität der 3 Algorithmen verglichen mit der GNU Scientific Library}. + \label{0f1:ausblick:plot:airy:stabilitaet}} +\end{figure} + +\begin{itemize} + \item Negative Zahlen sind sowohl für die Potenzreihe als auch für den Kettenbruch ein Problem. + \item Die Potenzreihe hat das Problem, je tiefer die Rekursionstiefe, desto mehr machen die Brüche ein Problem. Also der Nenner mit der Fakultät und dem Pochhammer Symbol. + \item Die Rekursionformel liefert für sehr grosse positive Werte die genausten Ergebnisse, verglichen mit der GNU Scientific Library. +\end{itemize} + + +\subsection{Ausblick +\label{0f1:subsection:ausblick}} + -- cgit v1.2.1 From c558a668bcc6d820c489dad980dc0f8f83acdbde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20M=C3=BCller?= Date: Mon, 25 Jul 2022 08:33:08 +0200 Subject: fix brace-problem --- buch/papers/0f1/teil3.tex | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'buch/papers/0f1') diff --git a/buch/papers/0f1/teil3.tex b/buch/papers/0f1/teil3.tex index dca61f8..44a4600 100644 --- a/buch/papers/0f1/teil3.tex +++ b/buch/papers/0f1/teil3.tex @@ -18,28 +18,28 @@ von den erwarteten ab. \begin{figure} \centering \includegraphics[width=0.8\textwidth]{papers/0f1/images/konvergenzAiry.pdf} - \caption{Konvergenz nach drei Iterationen, dargestellt anhand der Airy Funktion}. + \caption{Konvergenz nach drei Iterationen, dargestellt anhand der Airy Funktion. \label{0f1:ausblick:plot:airy:konvergenz}} \end{figure} \begin{figure} \centering \includegraphics[width=0.8\textwidth]{papers/0f1/images/konvergenzPositiv.pdf} - \caption{Konvergenz: Logarithmisch dargestellte Differenz vom erwarteten Endresultat}. + \caption{Konvergenz: Logarithmisch dargestellte Differenz vom erwarteten Endresultat. \label{0f1:ausblick:plot:konvergenz:positiv}} \end{figure} \begin{figure} \centering \includegraphics[width=0.8\textwidth]{papers/0f1/images/konvergenzNegativ.pdf} - \caption{Konvergenz: Logarithmisch dargestellte Differenz vom erwarteten Endresultat}. + \caption{Konvergenz: Logarithmisch dargestellte Differenz vom erwarteten Endresultat. \label{0f1:ausblick:plot:konvergenz:negativ}} \end{figure} \begin{figure} \centering \includegraphics[width=1\textwidth]{papers/0f1/images/stabilitaet.pdf} - \caption{Stabilität der 3 Algorithmen verglichen mit der GNU Scientific Library}. + \caption{Stabilität der 3 Algorithmen verglichen mit der GNU Scientific Library. \label{0f1:ausblick:plot:airy:stabilitaet}} \end{figure} -- cgit v1.2.1 From f064b343115255b4a6ae19cb09f397dcd8c6f25a Mon Sep 17 00:00:00 2001 From: Fabian <@> Date: Tue, 26 Jul 2022 16:23:27 +0200 Subject: 0f1, Mathe done --- buch/papers/0f1/references.bib | 92 ++++++++++++++++++------ buch/papers/0f1/teil0.tex | 2 +- buch/papers/0f1/teil1.tex | 82 ++++++++++++++-------- buch/papers/0f1/teil2.tex | 155 ++++++++++++++++++++++++++++++++++------- buch/papers/0f1/teil3.tex | 9 ++- 5 files changed, 255 insertions(+), 85 deletions(-) (limited to 'buch/papers/0f1') diff --git a/buch/papers/0f1/references.bib b/buch/papers/0f1/references.bib index fb9cd8b..2d3f874 100644 --- a/buch/papers/0f1/references.bib +++ b/buch/papers/0f1/references.bib @@ -4,32 +4,78 @@ % (c) 2020 Autor, Hochschule Rapperswil % -@online{0f1:bibtex, - title = {BibTeX}, - url = {https://de.wikipedia.org/wiki/BibTeX}, - date = {2020-02-06}, - year = {2020}, - month = {2}, - day = {6} +@online{0f1:library-gsl, + title = {GNU Scientific Library}, + url ={https://www.gnu.org/software/gsl/}, + date = {2022-07-07}, + year = {2022}, + month = {7}, + day = {19} } -@book{0f1:numerical-analysis, - title = {Numerical Analysis}, - author = {David Kincaid and Ward Cheney}, - publisher = {American Mathematical Society}, - year = {2002}, - isbn = {978-8-8218-4788-6}, - inseries = {Pure and applied undegraduate texts}, - volume = {2} +@online{0f1:wiki-airyFunktion, + title = {Airy-Funktion}, + url ={https://de.wikipedia.org/wiki/Airy-Funktion}, + date = {2022-07-07}, + year = {2022}, + month = {7}, + day = {25} } -@article{0f1:mendezmueller, - author = { Tabea Méndez and Andreas Müller }, - title = { Noncommutative harmonic analysis and image registration }, - journal = { Appl. Comput. Harmon. Anal.}, - year = 2019, - volume = 47, - pages = {607--627}, - url = {https://doi.org/10.1016/j.acha.2017.11.004} +@online{0f1:wiki-kettenbruch, + title = {Kettenbruch}, + url ={https://de.wikipedia.org/wiki/Kettenbruch}, + date = {2022-07-07}, + year = {2022}, + month = {7}, + day = {25} } +@online{0f1:double, + title = {C - Data Types}, + url ={https://www.tutorialspoint.com/cprogramming/c_data_types.htm}, + date = {2022-07-07}, + year = {2022}, + month = {7}, + day = {25} +} + +@online{0f1:wolfram-0f1, + title = {Hypergeometric 0F1}, + url ={https://functions.wolfram.com/webMathematica/FunctionEvaluation.jsp?name=Hypergeometric0F1}, + date = {2022-07-07}, + year = {2022}, + month = {7}, + day = {25} +} + +@online{0f1:wiki-fraction, + title = {Gauss continued fraction}, + url ={https://en.wikipedia.org/wiki/Gauss%27s_continued_fraction}, + date = {2022-07-07}, + year = {2022}, + month = {7}, + day = {25} +} + +@book{0f1:SeminarNumerik, + title = {Mathematisches Seminar Numerik}, + author = {Andreas Müller, Benjamin Bouhafs-Keller, Daniel Bucher, Manuel Cattaneo +Patrick Elsener, Reto Fritsche, Niccolò Galliani, Tobias Grab +Thomas Kistler, Fabio Marti, Joël Rechsteiner, Cédric Renda +Michael Schmid, Mike Schmid, Michael Schneeberger +Martin Stypinski, Manuel Tischhauser, Nicolas Tobler +Raphael Unterer, Severin Weiss}, + publisher = {Andreas Müller}, + year = {2022}, +} + +@article{0f1:kettenbrueche, + author = { Benjamin Bouhafs-Keller }, + title = { Kettenbrüche }, + journal = { Mathematisches Seminar Numerik }, + year = 2020, + volume = 13, + pages = {363--376}, + url = {https://github.com/AndreasFMueller/SeminarNumerik} +} \ No newline at end of file diff --git a/buch/papers/0f1/teil0.tex b/buch/papers/0f1/teil0.tex index bfc265f..780d432 100644 --- a/buch/papers/0f1/teil0.tex +++ b/buch/papers/0f1/teil0.tex @@ -7,7 +7,7 @@ \rhead{Ausgangslage} Die Hypergeometrische Funktion $\mathstrut_0F_1$ wird in vielen Funktionen als Basisfunktion benutzt, zum Beispiel um die Airy Funktion zu berechnen. -In der GNU Scientific Library \cite{library-gsl} +In der GNU Scientific Library \cite{0f1:library-gsl} ist die Funktion $\mathstrut_0F_1$ vorhanden. Allerdings wirft die Funktion, bei negativen Übergabenwerten wie zum Beispiel \verb+gsl_sf_hyperg_0F1(1, -1)+, eine Exception. Bei genauerer Untersuchung hat sich gezeigt, dass die Funktion je nach Betriebssystem funktioniert oder eben nicht. diff --git a/buch/papers/0f1/teil1.tex b/buch/papers/0f1/teil1.tex index 910e8bb..2a60737 100644 --- a/buch/papers/0f1/teil1.tex +++ b/buch/papers/0f1/teil1.tex @@ -6,16 +6,40 @@ \section{Mathematischer Hintergrund \label{0f1:section:mathHintergrund}} \rhead{Mathematischer Hintergrund} +Basierend auf den Herleitungen des vorhergehenden Kapitels \ref{buch:rekursion:section:hypergeometrische-funktion} +und dem Seminarbuch Numerik \cite{0f1:kettenbrueche}, werden im nachfolgenden Abschnitt nochmals die Resultate +beschrieben. + +\subsection{Hypergeometrische Funktion +\label{0f1:subsection:hypergeometrisch}} +Als Grundlage der umgesetzten Algorithmen dient die Hypergeometrische Funktion $\mathstrut_0F_1$. Diese ist eine Unterfunktion der allgemein definierten Funktion $\mathstrut_pF_q$. -\subsection{Hypergeometrische Funktion $\mathstrut_0F_1$ -\label{0f1:subsection:0f1}} -Wie in Kapitel \ref{buch:rekursion:section:hypergeometrische-funktion} beschrieben, -wird die Funktion $\mathstrut_0F_1$ folgendermassen definiert. \begin{definition} - \label{0f1:rekursion:hypergeometrisch:def} - Die hypergeometrische Funktion - $\mathstrut_0F_1$ ist definiert durch die Reihe - \[ + \label{0f1:math:qFp:def} + Die hypergeometrische Funktion + $\mathstrut_pF_q$ ist definiert durch die Reihe + \[ + \mathstrut_pF_q + \biggl( + \begin{matrix} + a_1,\dots,a_p\\ + b_1,\dots,b_q + \end{matrix} + ; + x + \biggr) + = + \mathstrut_pF_q(a_1,\dots,a_p;b_1,\dots,b_q;x) + = + \sum_{k=0}^\infty + \frac{(a_1)_k\cdots(a_p)_k}{(b_1)_k\cdots(b_q)_k}\frac{x^k}{k!}. + \] +\end{definition} + +Angewendet auf die Funktion $\mathstrut_pF_q$ ergibt sich für $\mathstrut_0F_1$: + +\begin{equation} + \label{0f1:math:0f1:eq} \mathstrut_0F_1 \biggl( \begin{matrix} @@ -29,26 +53,29 @@ wird die Funktion $\mathstrut_0F_1$ folgendermassen definiert. \mathstrut_0F_1(;b_1;x) = \sum_{k=0}^\infty - \frac{1}{(b_1)_k}\frac{x^k}{k!}. - \] -\end{definition} + \frac{x^k}{(b_1)_k \cdot k!}. +\end{equation} + + \subsection{Airy Funktion \label{0f1:subsection:airy}} -Wie in \ref{buch:differentialgleichungen:section:hypergeometrisch} dargestellt, ist die Airy-Differentialgleichung -folgendermassen definiert. +Die Airy-Funktion $Ai(x)$ und die verwandte Funktion $Bi(x)$ werden als Airy-Funktion bezeichnet. Sie werden zur Lösung verschiedener physikalischer Probleme benutzt, wie zum Beispiel zur Lösung der Schrödinger-Gleichung. \cite{0f1:wiki-airyFunktion} + \begin{definition} - y'' - xy = 0 - \label{0f1:airy:eq:differentialgleichung} + \label{0f1:airy:differentialgleichung:def} + Die Differentialgleichung + $y'' - xy = 0$ + heisst die {\em Airy-Differentialgleichung}. \cite{0f1:wiki-airyFunktion} \end{definition} -Daraus ergibt sich wie in Aufgabe~\ref{503} gefundenen Lösungen der -Airy-Differentialgleichung als hypergeometrische Funktionen. +Die Airy Funktion lässt sich auf verschiedene Arten darstellen. \cite{0f1:wiki-airyFunktion} +Als hypergeometrische Funktion berechnet, ergibt sich wie in Kapitel \ref{buch:differentialgleichungen:section:hypergeometrisch} hergeleitet, folgende Lösungen der Airy-Differentialgleichung zu den Anfangsbedingungen $A(0)=1$ und $A'(0)=0$, sowie $B(0)=0$ und $B'(0)=0$. - -\begin{align*} -y_1(x) +\begin{align} +\label{0f1:airy:hypergeometrisch:eq} +Ai(x) = \sum_{k=0}^\infty \frac{1}{(\frac23)_k} \frac{1}{k!}\biggl(\frac{x^3}{9}\biggr)^k @@ -57,7 +84,7 @@ y_1(x) \begin{matrix}\text{---}\\\frac23\end{matrix};\frac{x^3}{9} \biggr). \\ -y_2(x) +Bi(x) = \sum_{k=0}^\infty \frac{1}{(\frac43)_k} \frac{1}{k!}\biggl(\frac{x^3}{9}\biggr)^k @@ -67,14 +94,9 @@ x\cdot\mathstrut_0F_1\biggl( \frac{x^3}{9} \biggr). \qedhere -\end{align*} +\end{align} + +In diesem speziellem Fall wird die Airy Funktion $Ai(x)$ \eqref{0f1:airy:hypergeometrisch:eq} +benutzt, um die Stabilität der Algorithmen zu $\mathstrut_0F_1$ zu überprüfen. -\begin{figure} - \centering - \includegraphics{papers/0f1/images/airy.pdf} - \caption{Plot der Lösungen der Airy-Differentialgleichung $y''-xy=0$ - zu den Anfangsbedingungen $y(0)=1$ und $y'(0)=0$ in {\color{red}rot} - und $y(0)=0$ und $y'(0)=1$ in {\color{blue}blau}. - \label{0f1:airy:plot:vorgabe}} -\end{figure} \ No newline at end of file diff --git a/buch/papers/0f1/teil2.tex b/buch/papers/0f1/teil2.tex index 07e17c0..446bc93 100644 --- a/buch/papers/0f1/teil2.tex +++ b/buch/papers/0f1/teil2.tex @@ -6,56 +6,158 @@ \section{Umsetzung \label{0f1:section:teil2}} \rhead{Umsetzung} -Zur Umsetzung wurden drei Ansätze gewählt und -Die Unterprogramme wurde jeweils, wie die GNU Scientific Library, in C geschrieben. +Zur Umsetzung wurden drei verschiedene Ansätze gewählt. Dabei wurde der Schwerpunkt auf die Funktionalität und eine gute Lesbarkeit des Codes gelegt. +Die Unterprogramme wurde jeweils, wie die GNU Scientific Library, in C geschrieben. Die Zwischenresultate wurden vom Hauptprogramm in einem CSV-File gespeichert. Anschliessen wurde mit der Matplot-Libray in Python die Resultate geplottet. \subsection{Potenzreihe \label{0f1:subsection:potenzreihe}} -Die naheliegendste Lösung ist die Programmierung der Potenzreihe. +Die naheliegendste Lösung ist die Programmierung der Potenzreihe. Allerdings ist ein Problem dieser Umsetzung \ref{0f1:listing:potenzreihe}, dass die Fakultät im Nenner schnell grosse Werte annimmt und so der Bruch gegen Null strebt. Spätesten ab $k=167$ stösst diese Umsetzung \eqref{0f1:umsetzung:0f1:eq} an ihre Grenzen, da die Fakultät von $168$ eine Bereichsüberschreitung des \textit{double} Bereiches darstellt. \cite{0f1:double} -\begin{equation} - \label{0f1:rekursion:hypergeometrisch:eq} +\begin{align} + \label{0f1:umsetzung:0f1:eq} \mathstrut_0F_1(;b;z) - = + &= \sum_{k=0}^\infty \frac{z^k}{(b)_k \cdot k!} -\end{equation} + &= + \frac{1}{b} + +\frac{z^1}{(1+b) \cdot 1} + + \cdots + + \frac{z^{20}}{(20+b) \cdot 2.4 \cdot 10^{18}} +\end{align} -\lstinputlisting[style=C,float,caption={Rekursivformel für Kettenbruch.},label={0f1:listing:potenzreihe}]{papers/0f1/listings/potenzreihe.c} +\lstinputlisting[style=C,float,caption={Potenzreihe.},label={0f1:listing:potenzreihe}]{papers/0f1/listings/potenzreihe.c} \subsection{Kettenbruch \label{0f1:subsection:kettenbruch}} Ein endlicher Kettenbruch ist ein Bruch der Form +\begin{equation*} +a_0 + \cfrac{b_1}{a_1+\cfrac{b_2}{a_2+\cfrac{b_3}{a_3+\cdots}}} +\end{equation*} +in welchem $a_0, a_1,\dots,a_n$ und $b_1,b_2,\dots,b_n$ ganze Zahlen darstellen. + +Die Kurzschreibweise für einen allgemeinen Kettenbruch ist +\begin{equation*} + a_0 + \frac{a_1|}{|b_1} + \frac{a_2|}{|b_2} + \frac{a_3|}{|b_3} + \cdots +\end{equation*} +und ist somit verknüpfbar mit der Potenzreihe. +\cite{0f1:wiki-kettenbruch} + +Angewendet auf die Funktion $\mathstrut_0F_1$ bedeutet dies: +\begin{equation*} + \mathstrut_0F_1(;b;z) = 1 + \frac{z}{a1!} + \frac{z^2}{a(a+1)2!} + \frac{z^3}{a(a+1)(a+2)3!} + \cdots +\end{equation*} +\cite{0f1:wiki-fraction} + +Nach allen Umformungen ergibt sich folgender, irregulärer Kettenbruch \eqref{0f1:math:kettenbruch:0f1:eq} \begin{equation} -a_0 + \cfrac{b_1}{a_1+\cfrac{b_2}{a_2+\cfrac{\cdots}{\cdots+\cfrac{b_{n-1}}{a_{n-1} + \cfrac{b_n}{a_n}}}}} + \label{0f1:math:kettenbruch:0f1:eq} + \mathstrut_0F_1(;b;z) = 1 + \cfrac{\cfrac{z}{b}}{1+\cfrac{-\cfrac{z}{2(1+b)}}{1+\cfrac{z}{2(1+b)}+\cfrac{-\cfrac{z}{3(2+b)}}{1+\cfrac{z}{5(4+b)} + \cdots}}}, \end{equation} -in welchem $a_0, a_1,\dots,a_n$ und $b_1,b_2,\dots,b_n$ ganze Zahlen -darstellen. +der als Code \ref{0f1:listing:kettenbruchIterativ} umgesetzt wurde. +\cite{0f1:wolfram-0f1} -{\color{red}TODO: Bessere Beschreibung mit Verknüpfung zur Potenzreihe} +\lstinputlisting[style=C,float,caption={Rekursionsformel für Kettenbruch.},label={0f1:listing:kettenbruchIterativ}]{papers/0f1/listings/kettenbruchIterativ.c} -%Gauss hat durch - -\lstinputlisting[style=C,float,caption={Rekursivformel für Kettenbruch.},label={0f1:listing:kettenbruchIterativ}]{papers/0f1/listings/kettenbruchIterativ.c} \subsection{Rekursionsformel \label{0f1:subsection:rekursionsformel}} -Wesentlich effizienter zur Berechnung eines Kettenbruches ist die Rekursionsformel. +Wesentlich stabiler zur Berechnung eines Kettenbruches ist die Rekursionsformel. Nachfolgend wird die verkürzte Herleitung vom Kettenbruch zur Rekursionsformel aufgezeigt. Eine vollständige Schritt für Schritt Herleitung ist im Seminarbuch Numerik, im Kapitel Kettenbrüche zu finden. \cite{0f1:kettenbrueche}) + +\subsubsection{Verkürzte Herleitung} +Ein Näherungsbruch in der Form +\begin{align*} + \cfrac{A_k}{B_k} = a_k + \cfrac{b_{k + 1}}{a_{k + 1} + \cfrac{p}{q}} +\end{align*} +lässt sich zu +\begin{align*} + \cfrac{A_k}{B_k} = \cfrac{b_{k+1}}{a_{k+1} + \cfrac{p}{q}} = \frac{b_{k+1} \cdot q}{a_{k+1} \cdot q + p} +\end{align*} +umformen. +Dies lässt sich auch durch die folgende Matrizenschreibweise ausdrücken: +\begin{equation*} + \begin{pmatrix} + A_k\\ + B_k + \end{pmatrix} + = \begin{pmatrix} + b_{k+1} \cdot q\\ + a_{k+1} \cdot q + p + \end{pmatrix} + =\begin{pmatrix} + 0& b_{k+1}\\ + 1& a_{k+1} + \end{pmatrix} + \begin{pmatrix} + p \\ + q + \end{pmatrix}. + %\label{0f1:math:rekursionsformel:herleitung} +\end{equation*} + +Wendet man dies nun auf den Kettenbruch in der Form +\begin{equation*} + \frac{A_k}{B_k} = a_0 + \cfrac{b_1}{a_1+\cfrac{b_2}{a_2+\cfrac{\cdots}{\cdots+\cfrac{b_{k-1}}{a_{k-1} + \cfrac{b_k}{a_k}}}}} +\end{equation*} +an, ergibt sich folgende Matrixdarstellungen: \begin{align*} -\frac{A_n}{B_n} -= -a_0 + \cfrac{b_1}{a_1+\cfrac{b_2}{a_2+\cfrac{\cdots}{\cdots+\cfrac{b_{n-1}}{a_{n-1} + \cfrac{b_n}{a_n}}}}} + \begin{pmatrix} + A_k\\ + B_k + \end{pmatrix} + &= + \begin{pmatrix} + 1& a_0\\ + 0& 1 + \end{pmatrix} + \begin{pmatrix} + 0& b_1\\ + 1& a_1 + \end{pmatrix} + \cdots + \begin{pmatrix} + 0& b_{k-1}\\ + 1& a_{k-1} + \end{pmatrix} + \begin{pmatrix} + b_k\\ + a_k + \end{pmatrix} \end{align*} -Die Berechnung von $A_n, B_n$ kann man auch ohne die Matrizenschreibweise -aufschreiben: +Nach vollständiger Induktion ergibt sich für den Schritt $k$, die Matrix +\begin{equation} + \label{0f1:math:matrix:ende:eq} + \begin{pmatrix} + A_{k}\\ + B_{k} + \end{pmatrix} + = + \begin{pmatrix} + A_{k-2}& A_{k-1}\\ + B_{k-2}& B_{k-1} + \end{pmatrix} + \begin{pmatrix} + b_k\\ + a_k + \end{pmatrix}. +\end{equation} + +Und Schlussendlich kann der Näherungsbruch +\[ +\frac{Ak}{Bk} +\] +berechnet werden. + + +\subsubsection{Lösung} +Die Berechnung von $A_k, B_k$ \eqref{0f1:math:matrix:ende:eq} kann man auch ohne die Matrizenschreibweise aufschreiben: \cite{0f1:wiki-fraction} \begin{itemize} -\item Start: +\item Startbedingungen: \begin{align*} A_{-1} &= 0 & A_0 &= a_0 \\ B_{-1} &= 1 & B_0 &= 1 \end{align*} -$\rightarrow$ 0-te Näherung: $\displaystyle\frac{A_0}{B_0} = a_0$ \item Schritt $k\to k+1$: \[ \begin{aligned} @@ -67,9 +169,10 @@ B_{k+1} &= B_{k-1} \cdot b_k + B_k \cdot a_k \end{aligned} \] \item -Näherungsbruch $n$: \qquad$\displaystyle\frac{A_n}{B_n}$ +Näherungsbruch: \qquad$\displaystyle\frac{A_k}{B_k}$ \end{itemize} -{\color{red}TODO: Verweis Numerik} +Ein grosser Vorteil dieser Umsetzung \ref{0f1:listing:kettenbruchRekursion} ist, dass im Vergleich zum Code \ref{0f1:listing:kettenbruchIterativ} eine Division gespart werden kann und somit weniger Folgefehler entstehen können. -\lstinputlisting[style=C,float,caption={Rekursivformel für Kettenbruch.},label={0f1:listing:kettenbruchRekursion}]{papers/0f1/listings/kettenbruchRekursion.c} \ No newline at end of file +%Code +\lstinputlisting[style=C,float,caption={Iterativ umgesetzter Kettenbruch.},label={0f1:listing:kettenbruchRekursion}]{papers/0f1/listings/kettenbruchRekursion.c} \ No newline at end of file diff --git a/buch/papers/0f1/teil3.tex b/buch/papers/0f1/teil3.tex index 44a4600..76d6e32 100644 --- a/buch/papers/0f1/teil3.tex +++ b/buch/papers/0f1/teil3.tex @@ -10,15 +10,14 @@ Im Verlauf des Seminares hat sich gezeigt, das ein einfacher mathematischer Algorithmus zu implementieren gar nicht so einfach ist. So haben alle drei umgesetzten Ansätze Probleme mit grossen negativen x in der Funktion $\mathstrut_0F_1(;b;x)$. Ebenso wird, je grösser der Wert x wird $\mathstrut_0F_1(;b;x)$, desto mehr weichen die berechneten Resultate -von den erwarteten ab. -{\color{red}TODO cite wolfram alpha rechner} +von den Erwarteten ab. \cite{0f1:wolfram-0f1} \subsection{Auswertung \label{0f1:subsection:auswertung}} \begin{figure} \centering \includegraphics[width=0.8\textwidth]{papers/0f1/images/konvergenzAiry.pdf} - \caption{Konvergenz nach drei Iterationen, dargestellt anhand der Airy Funktion. + \caption{Konvergenz nach drei Iterationen, dargestellt anhand der Airy Funktion zu den Anfangsbedingungen $y(0)=1$ und $y'(0)=0$. \label{0f1:ausblick:plot:airy:konvergenz}} \end{figure} @@ -52,6 +51,6 @@ von den erwarteten ab. \subsection{Ausblick \label{0f1:subsection:ausblick}} - - +Eine mögliche Lösung zum Problem ist \cite{0f1:SeminarNumerik} +{\color{red} TODO beschreiben Lösung} -- cgit v1.2.1 From 336251607dae5947b3690bbc91e4c57036910d7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20M=C3=BCller?= Date: Tue, 26 Jul 2022 18:53:07 +0200 Subject: fix references.bib --- buch/papers/0f1/references.bib | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) (limited to 'buch/papers/0f1') diff --git a/buch/papers/0f1/references.bib b/buch/papers/0f1/references.bib index 2d3f874..ce9b8da 100644 --- a/buch/papers/0f1/references.bib +++ b/buch/papers/0f1/references.bib @@ -60,12 +60,7 @@ @book{0f1:SeminarNumerik, title = {Mathematisches Seminar Numerik}, - author = {Andreas Müller, Benjamin Bouhafs-Keller, Daniel Bucher, Manuel Cattaneo -Patrick Elsener, Reto Fritsche, Niccolò Galliani, Tobias Grab -Thomas Kistler, Fabio Marti, Joël Rechsteiner, Cédric Renda -Michael Schmid, Mike Schmid, Michael Schneeberger -Martin Stypinski, Manuel Tischhauser, Nicolas Tobler -Raphael Unterer, Severin Weiss}, + author = {Andreas Müller et al}, publisher = {Andreas Müller}, year = {2022}, } @@ -78,4 +73,4 @@ Raphael Unterer, Severin Weiss}, volume = 13, pages = {363--376}, url = {https://github.com/AndreasFMueller/SeminarNumerik} -} \ No newline at end of file +} -- cgit v1.2.1 From c53e9fe25866376d1b3086579c01725444a04702 Mon Sep 17 00:00:00 2001 From: Fabian <@> Date: Tue, 26 Jul 2022 21:27:23 +0200 Subject: 0f1, Code ueberarbeitet --- buch/papers/0f1/listings/kettenbruchIterativ.c | 16 +++++-- buch/papers/0f1/listings/kettenbruchRekursion.c | 22 ++++++---- buch/papers/0f1/listings/potenzreihe.c | 56 +++++++++++++++++++++++++ buch/papers/0f1/teil2.tex | 6 +-- 4 files changed, 86 insertions(+), 14 deletions(-) (limited to 'buch/papers/0f1') diff --git a/buch/papers/0f1/listings/kettenbruchIterativ.c b/buch/papers/0f1/listings/kettenbruchIterativ.c index befea8e..d897b8f 100644 --- a/buch/papers/0f1/listings/kettenbruchIterativ.c +++ b/buch/papers/0f1/listings/kettenbruchIterativ.c @@ -1,5 +1,13 @@ -static double fractionRekursion0f1(const double c, const double x, unsigned int n) +/** + * @brief Calculates the Hypergeometric Function 0F1(;b;z) + * @param b0 in 0F1(;b0;z) + * @param z in 0F1(;b0;z) + * @param n number of itertions (precision) + * @return Result + */ +static double fractionRekursion0f1(const double c, const double z, unsigned int n) { + //declaration double a = 0.0; double b = 0.0; double Ak = 0.0; @@ -21,15 +29,15 @@ static double fractionRekursion0f1(const double c, const double x, unsigned int else if (k == 1) { a = 1.0; //a1 - b = x/c; //b1 + b = z/c; //b1 //recursion fomula for A1, B1 Ak = a * Ak_1 + b * 1.0; Bk = a * Bk_1; } else { - a = 1 + (x / (k * ((k - 1) + c)));//ak - b = -(x / (k * ((k - 1) + c))); //bk + a = 1 + (z / (k * ((k - 1) + c)));//ak + b = -(z / (k * ((k - 1) + c))); //bk //recursion fomula for Ak, Bk Ak = a * Ak_1 + b * Ak_2; Bk = a * Bk_1 + b * Bk_2; diff --git a/buch/papers/0f1/listings/kettenbruchRekursion.c b/buch/papers/0f1/listings/kettenbruchRekursion.c index 958d4e1..143683f 100644 --- a/buch/papers/0f1/listings/kettenbruchRekursion.c +++ b/buch/papers/0f1/listings/kettenbruchRekursion.c @@ -1,18 +1,26 @@ -static double fractionIter0f1(const double b0, const double z, unsigned int n) +/** + * @brief Calculates the Hypergeometric Function 0F1(;c;z) + * @param c in 0F1(;c;z) + * @param z in 0F1(;c;z) + * @param k number of itertions (precision) + * @return Result + */ +static double fractionIter0f1(const double c, const double z, unsigned int k) { + //declaration double a = 0.0; double b = 0.0; - double abn = 0.0; + double abk = 0.0; double temp = 0.0; - for (; n > 0; --n) + for (; k > 0; --k) { - abn = z / (n * ((n - 1) + b0)); //abn = ak, bk + abk = z / (k * ((k - 1) + c)); //abk = ak, bk - a = n > 1 ? (1 + abn) : 1; //a0, a1 - b = n > 1 ? -abn : abn; //b1 + a = k > 1 ? (1 + abk) : 1; //a0, a1 + b = k > 1 ? -abk : abk; //b1 - temp = b / (a + temp); + temp = b / (a + temp); ////bk / (ak + last result) } return a + temp; //a0 + temp diff --git a/buch/papers/0f1/listings/potenzreihe.c b/buch/papers/0f1/listings/potenzreihe.c index bfaa0e3..3eb9b86 100644 --- a/buch/papers/0f1/listings/potenzreihe.c +++ b/buch/papers/0f1/listings/potenzreihe.c @@ -1,5 +1,61 @@ #include +/** + * @brief Calculates pochhammer + * @param (a+n-1)! + * @return Result + */ +static double pochhammer(const double x, double n) +{ + double temp = x; + + if (n > 0) + { + while (n > 1) + { + temp *= (x + n - 1); + --n; + } + + return temp; + } + else + { + return 1; + } +} + +/** + * @brief Calculates the Factorial + * @param n! + * @return Result + */ +static double fac(int n) +{ + double temp = n; + + if (n > 0) + { + while (n > 1) + { + --n; + temp *= n; + } + return temp; + } + else + { + return 1; + } +} + +/** + * @brief Calculates the Hypergeometric Function 0F1(;b;z) + * @param b0 in 0F1(;b0;z) + * @param z in 0F1(;b0;z) + * @param n number of itertions (precision) + * @return Result + */ static double powerseries(const double b, const double z, unsigned int n) { double temp = 0.0; diff --git a/buch/papers/0f1/teil2.tex b/buch/papers/0f1/teil2.tex index 446bc93..ca48e6e 100644 --- a/buch/papers/0f1/teil2.tex +++ b/buch/papers/0f1/teil2.tex @@ -26,7 +26,7 @@ Die naheliegendste Lösung ist die Programmierung der Potenzreihe. Allerdings is + \frac{z^{20}}{(20+b) \cdot 2.4 \cdot 10^{18}} \end{align} -\lstinputlisting[style=C,float,caption={Potenzreihe.},label={0f1:listing:potenzreihe}]{papers/0f1/listings/potenzreihe.c} +\lstinputlisting[style=C,float,caption={Potenzreihe.},label={0f1:listing:potenzreihe}, firstline=59]{papers/0f1/listings/potenzreihe.c} \subsection{Kettenbruch \label{0f1:subsection:kettenbruch}} @@ -57,7 +57,7 @@ Nach allen Umformungen ergibt sich folgender, irregulärer Kettenbruch \eqref{0f der als Code \ref{0f1:listing:kettenbruchIterativ} umgesetzt wurde. \cite{0f1:wolfram-0f1} -\lstinputlisting[style=C,float,caption={Rekursionsformel für Kettenbruch.},label={0f1:listing:kettenbruchIterativ}]{papers/0f1/listings/kettenbruchIterativ.c} +\lstinputlisting[style=C,float,caption={Rekursionsformel für Kettenbruch.},label={0f1:listing:kettenbruchIterativ}, firstline=8]{papers/0f1/listings/kettenbruchIterativ.c} \subsection{Rekursionsformel \label{0f1:subsection:rekursionsformel}} @@ -175,4 +175,4 @@ Näherungsbruch: \qquad$\displaystyle\frac{A_k}{B_k}$ Ein grosser Vorteil dieser Umsetzung \ref{0f1:listing:kettenbruchRekursion} ist, dass im Vergleich zum Code \ref{0f1:listing:kettenbruchIterativ} eine Division gespart werden kann und somit weniger Folgefehler entstehen können. %Code -\lstinputlisting[style=C,float,caption={Iterativ umgesetzter Kettenbruch.},label={0f1:listing:kettenbruchRekursion}]{papers/0f1/listings/kettenbruchRekursion.c} \ No newline at end of file +\lstinputlisting[style=C,float,caption={Iterativ umgesetzter Kettenbruch.},label={0f1:listing:kettenbruchRekursion}, firstline=8]{papers/0f1/listings/kettenbruchRekursion.c} \ No newline at end of file -- cgit v1.2.1 From 220b382cf4b7019b199c3023ddab73ba2658e27a Mon Sep 17 00:00:00 2001 From: Fabian <@> Date: Wed, 27 Jul 2022 13:08:39 +0200 Subject: 0f1, bilder --- buch/papers/0f1/images/airy.pdf | Bin 25568 -> 0 bytes buch/papers/0f1/images/konvergenzAiry.pdf | Bin 15137 -> 15785 bytes buch/papers/0f1/images/konvergenzNegativ.pdf | Bin 16312 -> 18155 bytes buch/papers/0f1/images/konvergenzPositiv.pdf | Bin 18924 -> 18581 bytes buch/papers/0f1/images/stabilitaet.pdf | Bin 20944 -> 19612 bytes buch/papers/0f1/listings/kettenbruchRekursion.c | 8 +- buch/papers/0f1/listings/potenzreihe.c | 8 +- buch/papers/0f1/main.tex | 48 ++-- buch/papers/0f1/teil0.tex | 30 +- buch/papers/0f1/teil1.tex | 204 +++++++------- buch/papers/0f1/teil2.tex | 354 ++++++++++++------------ buch/papers/0f1/teil3.tex | 112 ++++---- 12 files changed, 382 insertions(+), 382 deletions(-) delete mode 100644 buch/papers/0f1/images/airy.pdf (limited to 'buch/papers/0f1') diff --git a/buch/papers/0f1/images/airy.pdf b/buch/papers/0f1/images/airy.pdf deleted file mode 100644 index 672d789..0000000 Binary files a/buch/papers/0f1/images/airy.pdf and /dev/null differ diff --git a/buch/papers/0f1/images/konvergenzAiry.pdf b/buch/papers/0f1/images/konvergenzAiry.pdf index 2e635ea..206cd3a 100644 Binary files a/buch/papers/0f1/images/konvergenzAiry.pdf and b/buch/papers/0f1/images/konvergenzAiry.pdf differ diff --git a/buch/papers/0f1/images/konvergenzNegativ.pdf b/buch/papers/0f1/images/konvergenzNegativ.pdf index 3b58be4..03b2ba1 100644 Binary files a/buch/papers/0f1/images/konvergenzNegativ.pdf and b/buch/papers/0f1/images/konvergenzNegativ.pdf differ diff --git a/buch/papers/0f1/images/konvergenzPositiv.pdf b/buch/papers/0f1/images/konvergenzPositiv.pdf index 24e3fd5..2e45129 100644 Binary files a/buch/papers/0f1/images/konvergenzPositiv.pdf and b/buch/papers/0f1/images/konvergenzPositiv.pdf differ diff --git a/buch/papers/0f1/images/stabilitaet.pdf b/buch/papers/0f1/images/stabilitaet.pdf index be4af42..13dea39 100644 Binary files a/buch/papers/0f1/images/stabilitaet.pdf and b/buch/papers/0f1/images/stabilitaet.pdf differ diff --git a/buch/papers/0f1/listings/kettenbruchRekursion.c b/buch/papers/0f1/listings/kettenbruchRekursion.c index 143683f..3caaf43 100644 --- a/buch/papers/0f1/listings/kettenbruchRekursion.c +++ b/buch/papers/0f1/listings/kettenbruchRekursion.c @@ -17,11 +17,11 @@ static double fractionIter0f1(const double c, const double z, unsigned int k) { abk = z / (k * ((k - 1) + c)); //abk = ak, bk - a = k > 1 ? (1 + abk) : 1; //a0, a1 - b = k > 1 ? -abk : abk; //b1 + a = k > 1 ? (1 + abk) : 1; //a0, a1 + b = k > 1 ? -abk : abk; //b1 - temp = b / (a + temp); ////bk / (ak + last result) + temp = b / (a + temp); //bk / (ak + last result) } - return a + temp; //a0 + temp + return a + temp; //a0 + temp } \ No newline at end of file diff --git a/buch/papers/0f1/listings/potenzreihe.c b/buch/papers/0f1/listings/potenzreihe.c index 3eb9b86..23fdfea 100644 --- a/buch/papers/0f1/listings/potenzreihe.c +++ b/buch/papers/0f1/listings/potenzreihe.c @@ -51,18 +51,18 @@ static double fac(int n) /** * @brief Calculates the Hypergeometric Function 0F1(;b;z) - * @param b0 in 0F1(;b0;z) - * @param z in 0F1(;b0;z) + * @param c in 0F1(;c;z) + * @param z in 0F1(;c;z) * @param n number of itertions (precision) * @return Result */ -static double powerseries(const double b, const double z, unsigned int n) +static double powerseries(const double c, const double z, unsigned int n) { double temp = 0.0; for (unsigned int k = 0; k < n; ++k) { - temp += pow(z, k) / (factorial(k) * pochhammer(b, k)); + temp += pow(z, k) / (factorial(k) * pochhammer(c, k)); } return temp; diff --git a/buch/papers/0f1/main.tex b/buch/papers/0f1/main.tex index b8cdc21..0b1020f 100644 --- a/buch/papers/0f1/main.tex +++ b/buch/papers/0f1/main.tex @@ -1,24 +1,24 @@ -% -% main.tex -- Paper zum Thema <0f1> -% -% (c) 2020 Hochschule Rapperswil -% -% - - - -\chapter{Algorithmus zur Berechnung von $\mathstrut_0F_1$\label{chapter:0f1}} -\lhead{Algorithmus zur Berechnung von $\mathstrut_0F_1$} -\begin{refsection} -\chapterauthor{Fabian Dünki} - - - - -\input{papers/0f1/teil0.tex} -\input{papers/0f1/teil1.tex} -\input{papers/0f1/teil2.tex} -\input{papers/0f1/teil3.tex} - -\printbibliography[heading=subbibliography] -\end{refsection} +% +% main.tex -- Paper zum Thema <0f1> +% +% (c) 2020 Hochschule Rapperswil +% +% + + + +\chapter{Algorithmus zur Berechnung von $\mathstrut_0F_1$\label{chapter:0f1}} +\lhead{Algorithmus zur Berechnung von $\mathstrut_0F_1$} +\begin{refsection} +\chapterauthor{Fabian Dünki} + + + + +\input{papers/0f1/teil0.tex} +\input{papers/0f1/teil1.tex} +\input{papers/0f1/teil2.tex} +\input{papers/0f1/teil3.tex} + +\printbibliography[heading=subbibliography] +\end{refsection} diff --git a/buch/papers/0f1/teil0.tex b/buch/papers/0f1/teil0.tex index 780d432..adccac7 100644 --- a/buch/papers/0f1/teil0.tex +++ b/buch/papers/0f1/teil0.tex @@ -1,15 +1,15 @@ -% -% einleitung.tex -- Einleitung -% -% (c) 2022 Fabian Dünki, Hochschule Rapperswil -% -\section{Ausgangslage\label{0f1:section:ausgangslage}} -\rhead{Ausgangslage} -Die Hypergeometrische Funktion $\mathstrut_0F_1$ wird in vielen Funktionen als Basisfunktion benutzt, -zum Beispiel um die Airy Funktion zu berechnen. -In der GNU Scientific Library \cite{0f1:library-gsl} -ist die Funktion $\mathstrut_0F_1$ vorhanden. -Allerdings wirft die Funktion, bei negativen Übergabenwerten wie zum Beispiel \verb+gsl_sf_hyperg_0F1(1, -1)+, eine Exception. -Bei genauerer Untersuchung hat sich gezeigt, dass die Funktion je nach Betriebssystem funktioniert oder eben nicht. -So kann die Funktion unter Windows fehlerfrei aufgerufen werden, beim Mac OS und Linux sind negative Übergabeparameter im Moment nicht möglich. -Ziel dieser Arbeit war es zu evaluieren, ob es mit einfachen mathematischen Operationen möglich ist, die Hypergeometrische Funktion $\mathstrut_0F_1$ zu implementieren. +% +% einleitung.tex -- Einleitung +% +% (c) 2022 Fabian Dünki, Hochschule Rapperswil +% +\section{Ausgangslage\label{0f1:section:ausgangslage}} +\rhead{Ausgangslage} +Die Hypergeometrische Funktion $\mathstrut_0F_1$ wird in vielen Funktionen als Basisfunktion benutzt, +zum Beispiel um die Airy Funktion zu berechnen. +In der GNU Scientific Library \cite{0f1:library-gsl} +ist die Funktion $\mathstrut_0F_1$ vorhanden. +Allerdings wirft die Funktion, bei negativen Übergabenwerten wie zum Beispiel \verb+gsl_sf_hyperg_0F1(1, -1)+, eine Exception. +Bei genauerer Untersuchung hat sich gezeigt, dass die Funktion je nach Betriebssystem funktioniert oder eben nicht. +So kann die Funktion unter Windows fehlerfrei aufgerufen werden, beim Mac OS und Linux sind negative Übergabeparameter im Moment nicht möglich. +Ziel dieser Arbeit war es zu evaluieren, ob es mit einfachen mathematischen Operationen möglich ist, die Hypergeometrische Funktion $\mathstrut_0F_1$ zu implementieren. diff --git a/buch/papers/0f1/teil1.tex b/buch/papers/0f1/teil1.tex index 2a60737..f8d70a8 100644 --- a/buch/papers/0f1/teil1.tex +++ b/buch/papers/0f1/teil1.tex @@ -1,102 +1,102 @@ -% -% teil1.tex -- Mathematischer Hintergrund -% -% (c) 2022 Fabian Dünki, Hochschule Rapperswil -% -\section{Mathematischer Hintergrund -\label{0f1:section:mathHintergrund}} -\rhead{Mathematischer Hintergrund} -Basierend auf den Herleitungen des vorhergehenden Kapitels \ref{buch:rekursion:section:hypergeometrische-funktion} -und dem Seminarbuch Numerik \cite{0f1:kettenbrueche}, werden im nachfolgenden Abschnitt nochmals die Resultate -beschrieben. - -\subsection{Hypergeometrische Funktion -\label{0f1:subsection:hypergeometrisch}} -Als Grundlage der umgesetzten Algorithmen dient die Hypergeometrische Funktion $\mathstrut_0F_1$. Diese ist eine Unterfunktion der allgemein definierten Funktion $\mathstrut_pF_q$. - -\begin{definition} - \label{0f1:math:qFp:def} - Die hypergeometrische Funktion - $\mathstrut_pF_q$ ist definiert durch die Reihe - \[ - \mathstrut_pF_q - \biggl( - \begin{matrix} - a_1,\dots,a_p\\ - b_1,\dots,b_q - \end{matrix} - ; - x - \biggr) - = - \mathstrut_pF_q(a_1,\dots,a_p;b_1,\dots,b_q;x) - = - \sum_{k=0}^\infty - \frac{(a_1)_k\cdots(a_p)_k}{(b_1)_k\cdots(b_q)_k}\frac{x^k}{k!}. - \] -\end{definition} - -Angewendet auf die Funktion $\mathstrut_pF_q$ ergibt sich für $\mathstrut_0F_1$: - -\begin{equation} - \label{0f1:math:0f1:eq} - \mathstrut_0F_1 - \biggl( - \begin{matrix} - \\ - b_1 - \end{matrix} - ; - x - \biggr) - = - \mathstrut_0F_1(;b_1;x) - = - \sum_{k=0}^\infty - \frac{x^k}{(b_1)_k \cdot k!}. -\end{equation} - - - - -\subsection{Airy Funktion -\label{0f1:subsection:airy}} -Die Airy-Funktion $Ai(x)$ und die verwandte Funktion $Bi(x)$ werden als Airy-Funktion bezeichnet. Sie werden zur Lösung verschiedener physikalischer Probleme benutzt, wie zum Beispiel zur Lösung der Schrödinger-Gleichung. \cite{0f1:wiki-airyFunktion} - -\begin{definition} - \label{0f1:airy:differentialgleichung:def} - Die Differentialgleichung - $y'' - xy = 0$ - heisst die {\em Airy-Differentialgleichung}. \cite{0f1:wiki-airyFunktion} -\end{definition} - -Die Airy Funktion lässt sich auf verschiedene Arten darstellen. \cite{0f1:wiki-airyFunktion} -Als hypergeometrische Funktion berechnet, ergibt sich wie in Kapitel \ref{buch:differentialgleichungen:section:hypergeometrisch} hergeleitet, folgende Lösungen der Airy-Differentialgleichung zu den Anfangsbedingungen $A(0)=1$ und $A'(0)=0$, sowie $B(0)=0$ und $B'(0)=0$. - -\begin{align} -\label{0f1:airy:hypergeometrisch:eq} -Ai(x) -= -\sum_{k=0}^\infty -\frac{1}{(\frac23)_k} \frac{1}{k!}\biggl(\frac{x^3}{9}\biggr)^k -= -\mathstrut_0F_1\biggl( -\begin{matrix}\text{---}\\\frac23\end{matrix};\frac{x^3}{9} -\biggr). -\\ -Bi(x) -= -\sum_{k=0}^\infty -\frac{1}{(\frac43)_k} \frac{1}{k!}\biggl(\frac{x^3}{9}\biggr)^k -= -x\cdot\mathstrut_0F_1\biggl( -\begin{matrix}\text{---}\\\frac43\end{matrix}; -\frac{x^3}{9} -\biggr). -\qedhere -\end{align} - -In diesem speziellem Fall wird die Airy Funktion $Ai(x)$ \eqref{0f1:airy:hypergeometrisch:eq} -benutzt, um die Stabilität der Algorithmen zu $\mathstrut_0F_1$ zu überprüfen. - - +% +% teil1.tex -- Mathematischer Hintergrund +% +% (c) 2022 Fabian Dünki, Hochschule Rapperswil +% +\section{Mathematischer Hintergrund +\label{0f1:section:mathHintergrund}} +\rhead{Mathematischer Hintergrund} +Basierend auf den Herleitungen des vorhergehenden Kapitels \ref{buch:rekursion:section:hypergeometrische-funktion} +und dem Seminarbuch Numerik \cite{0f1:kettenbrueche}, werden im nachfolgenden Abschnitt nochmals die Resultate +beschrieben. + +\subsection{Hypergeometrische Funktion +\label{0f1:subsection:hypergeometrisch}} +Als Grundlage der umgesetzten Algorithmen dient die Hypergeometrische Funktion $\mathstrut_0F_1$. Diese ist eine Unterfunktion der allgemein definierten Funktion $\mathstrut_pF_q$. + +\begin{definition} + \label{0f1:math:qFp:def} + Die hypergeometrische Funktion + $\mathstrut_pF_q$ ist definiert durch die Reihe + \[ + \mathstrut_pF_q + \biggl( + \begin{matrix} + a_1,\dots,a_p\\ + b_1,\dots,b_q + \end{matrix} + ; + x + \biggr) + = + \mathstrut_pF_q(a_1,\dots,a_p;b_1,\dots,b_q;x) + = + \sum_{k=0}^\infty + \frac{(a_1)_k\cdots(a_p)_k}{(b_1)_k\cdots(b_q)_k}\frac{x^k}{k!}. + \] +\end{definition} + +Angewendet auf die Funktion $\mathstrut_pF_q$ ergibt sich für $\mathstrut_0F_1$: + +\begin{equation} + \label{0f1:math:0f1:eq} + \mathstrut_0F_1 + \biggl( + \begin{matrix} + \\ + b_1 + \end{matrix} + ; + x + \biggr) + = + \mathstrut_0F_1(;b_1;x) + = + \sum_{k=0}^\infty + \frac{x^k}{(b_1)_k \cdot k!}. +\end{equation} + + + + +\subsection{Airy Funktion +\label{0f1:subsection:airy}} +Die Airy-Funktion $Ai(x)$ und die verwandte Funktion $Bi(x)$ werden als Airy-Funktion bezeichnet. Sie werden zur Lösung verschiedener physikalischer Probleme benutzt, wie zum Beispiel zur Lösung der Schrödinger-Gleichung. \cite{0f1:wiki-airyFunktion} + +\begin{definition} + \label{0f1:airy:differentialgleichung:def} + Die Differentialgleichung + $y'' - xy = 0$ + heisst die {\em Airy-Differentialgleichung}. \cite{0f1:wiki-airyFunktion} +\end{definition} + +Die Airy Funktion lässt sich auf verschiedene Arten darstellen. \cite{0f1:wiki-airyFunktion} +Als hypergeometrische Funktion berechnet, ergibt sich wie in Kapitel \ref{buch:differentialgleichungen:section:hypergeometrisch} hergeleitet, folgende Lösungen der Airy-Differentialgleichung zu den Anfangsbedingungen $A(0)=1$ und $A'(0)=0$, sowie $B(0)=0$ und $B'(0)=0$. + +\begin{align} +\label{0f1:airy:hypergeometrisch:eq} +Ai(x) += +\sum_{k=0}^\infty +\frac{1}{(\frac23)_k} \frac{1}{k!}\biggl(\frac{x^3}{9}\biggr)^k += +\mathstrut_0F_1\biggl( +\begin{matrix}\text{---}\\\frac23\end{matrix};\frac{x^3}{9} +\biggr). +\\ +Bi(x) += +\sum_{k=0}^\infty +\frac{1}{(\frac43)_k} \frac{1}{k!}\biggl(\frac{x^3}{9}\biggr)^k += +x\cdot\mathstrut_0F_1\biggl( +\begin{matrix}\text{---}\\\frac43\end{matrix}; +\frac{x^3}{9} +\biggr). +\qedhere +\end{align} + +In diesem speziellem Fall wird die Airy Funktion $Ai(x)$ \eqref{0f1:airy:hypergeometrisch:eq} +benutzt, um die Stabilität der Algorithmen zu $\mathstrut_0F_1$ zu überprüfen. + + diff --git a/buch/papers/0f1/teil2.tex b/buch/papers/0f1/teil2.tex index ca48e6e..3c2b5cd 100644 --- a/buch/papers/0f1/teil2.tex +++ b/buch/papers/0f1/teil2.tex @@ -1,178 +1,178 @@ -% -% teil2.tex -- Umsetzung in C Programmen -% -% (c) 2022 Fabian Dünki, Hochschule Rapperswil -% -\section{Umsetzung -\label{0f1:section:teil2}} -\rhead{Umsetzung} -Zur Umsetzung wurden drei verschiedene Ansätze gewählt. Dabei wurde der Schwerpunkt auf die Funktionalität und eine gute Lesbarkeit des Codes gelegt. -Die Unterprogramme wurde jeweils, wie die GNU Scientific Library, in C geschrieben. Die Zwischenresultate wurden vom Hauptprogramm in einem CSV-File gespeichert. Anschliessen wurde mit der Matplot-Libray in Python die Resultate geplottet. - -\subsection{Potenzreihe -\label{0f1:subsection:potenzreihe}} -Die naheliegendste Lösung ist die Programmierung der Potenzreihe. Allerdings ist ein Problem dieser Umsetzung \ref{0f1:listing:potenzreihe}, dass die Fakultät im Nenner schnell grosse Werte annimmt und so der Bruch gegen Null strebt. Spätesten ab $k=167$ stösst diese Umsetzung \eqref{0f1:umsetzung:0f1:eq} an ihre Grenzen, da die Fakultät von $168$ eine Bereichsüberschreitung des \textit{double} Bereiches darstellt. \cite{0f1:double} - -\begin{align} - \label{0f1:umsetzung:0f1:eq} - \mathstrut_0F_1(;b;z) - &= - \sum_{k=0}^\infty - \frac{z^k}{(b)_k \cdot k!} - &= - \frac{1}{b} - +\frac{z^1}{(1+b) \cdot 1} - + \cdots - + \frac{z^{20}}{(20+b) \cdot 2.4 \cdot 10^{18}} -\end{align} - -\lstinputlisting[style=C,float,caption={Potenzreihe.},label={0f1:listing:potenzreihe}, firstline=59]{papers/0f1/listings/potenzreihe.c} - -\subsection{Kettenbruch -\label{0f1:subsection:kettenbruch}} -Ein endlicher Kettenbruch ist ein Bruch der Form -\begin{equation*} -a_0 + \cfrac{b_1}{a_1+\cfrac{b_2}{a_2+\cfrac{b_3}{a_3+\cdots}}} -\end{equation*} -in welchem $a_0, a_1,\dots,a_n$ und $b_1,b_2,\dots,b_n$ ganze Zahlen darstellen. - -Die Kurzschreibweise für einen allgemeinen Kettenbruch ist -\begin{equation*} - a_0 + \frac{a_1|}{|b_1} + \frac{a_2|}{|b_2} + \frac{a_3|}{|b_3} + \cdots -\end{equation*} -und ist somit verknüpfbar mit der Potenzreihe. -\cite{0f1:wiki-kettenbruch} - -Angewendet auf die Funktion $\mathstrut_0F_1$ bedeutet dies: -\begin{equation*} - \mathstrut_0F_1(;b;z) = 1 + \frac{z}{a1!} + \frac{z^2}{a(a+1)2!} + \frac{z^3}{a(a+1)(a+2)3!} + \cdots -\end{equation*} -\cite{0f1:wiki-fraction} - -Nach allen Umformungen ergibt sich folgender, irregulärer Kettenbruch \eqref{0f1:math:kettenbruch:0f1:eq} -\begin{equation} - \label{0f1:math:kettenbruch:0f1:eq} - \mathstrut_0F_1(;b;z) = 1 + \cfrac{\cfrac{z}{b}}{1+\cfrac{-\cfrac{z}{2(1+b)}}{1+\cfrac{z}{2(1+b)}+\cfrac{-\cfrac{z}{3(2+b)}}{1+\cfrac{z}{5(4+b)} + \cdots}}}, -\end{equation} -der als Code \ref{0f1:listing:kettenbruchIterativ} umgesetzt wurde. -\cite{0f1:wolfram-0f1} - -\lstinputlisting[style=C,float,caption={Rekursionsformel für Kettenbruch.},label={0f1:listing:kettenbruchIterativ}, firstline=8]{papers/0f1/listings/kettenbruchIterativ.c} - -\subsection{Rekursionsformel -\label{0f1:subsection:rekursionsformel}} -Wesentlich stabiler zur Berechnung eines Kettenbruches ist die Rekursionsformel. Nachfolgend wird die verkürzte Herleitung vom Kettenbruch zur Rekursionsformel aufgezeigt. Eine vollständige Schritt für Schritt Herleitung ist im Seminarbuch Numerik, im Kapitel Kettenbrüche zu finden. \cite{0f1:kettenbrueche}) - -\subsubsection{Verkürzte Herleitung} -Ein Näherungsbruch in der Form -\begin{align*} - \cfrac{A_k}{B_k} = a_k + \cfrac{b_{k + 1}}{a_{k + 1} + \cfrac{p}{q}} -\end{align*} -lässt sich zu -\begin{align*} - \cfrac{A_k}{B_k} = \cfrac{b_{k+1}}{a_{k+1} + \cfrac{p}{q}} = \frac{b_{k+1} \cdot q}{a_{k+1} \cdot q + p} -\end{align*} -umformen. -Dies lässt sich auch durch die folgende Matrizenschreibweise ausdrücken: -\begin{equation*} - \begin{pmatrix} - A_k\\ - B_k - \end{pmatrix} - = \begin{pmatrix} - b_{k+1} \cdot q\\ - a_{k+1} \cdot q + p - \end{pmatrix} - =\begin{pmatrix} - 0& b_{k+1}\\ - 1& a_{k+1} - \end{pmatrix} - \begin{pmatrix} - p \\ - q - \end{pmatrix}. - %\label{0f1:math:rekursionsformel:herleitung} -\end{equation*} - -Wendet man dies nun auf den Kettenbruch in der Form -\begin{equation*} - \frac{A_k}{B_k} = a_0 + \cfrac{b_1}{a_1+\cfrac{b_2}{a_2+\cfrac{\cdots}{\cdots+\cfrac{b_{k-1}}{a_{k-1} + \cfrac{b_k}{a_k}}}}} -\end{equation*} -an, ergibt sich folgende Matrixdarstellungen: - -\begin{align*} - \begin{pmatrix} - A_k\\ - B_k - \end{pmatrix} - &= - \begin{pmatrix} - 1& a_0\\ - 0& 1 - \end{pmatrix} - \begin{pmatrix} - 0& b_1\\ - 1& a_1 - \end{pmatrix} - \cdots - \begin{pmatrix} - 0& b_{k-1}\\ - 1& a_{k-1} - \end{pmatrix} - \begin{pmatrix} - b_k\\ - a_k - \end{pmatrix} -\end{align*} - -Nach vollständiger Induktion ergibt sich für den Schritt $k$, die Matrix -\begin{equation} - \label{0f1:math:matrix:ende:eq} - \begin{pmatrix} - A_{k}\\ - B_{k} - \end{pmatrix} - = - \begin{pmatrix} - A_{k-2}& A_{k-1}\\ - B_{k-2}& B_{k-1} - \end{pmatrix} - \begin{pmatrix} - b_k\\ - a_k - \end{pmatrix}. -\end{equation} - -Und Schlussendlich kann der Näherungsbruch -\[ -\frac{Ak}{Bk} -\] -berechnet werden. - - -\subsubsection{Lösung} -Die Berechnung von $A_k, B_k$ \eqref{0f1:math:matrix:ende:eq} kann man auch ohne die Matrizenschreibweise aufschreiben: \cite{0f1:wiki-fraction} -\begin{itemize} -\item Startbedingungen: -\begin{align*} -A_{-1} &= 0 & A_0 &= a_0 \\ -B_{-1} &= 1 & B_0 &= 1 -\end{align*} -\item Schritt $k\to k+1$: -\[ -\begin{aligned} -k &\rightarrow k + 1: -& -A_{k+1} &= A_{k-1} \cdot b_k + A_k \cdot a_k \\ -&& -B_{k+1} &= B_{k-1} \cdot b_k + B_k \cdot a_k -\end{aligned} -\] -\item -Näherungsbruch: \qquad$\displaystyle\frac{A_k}{B_k}$ -\end{itemize} - -Ein grosser Vorteil dieser Umsetzung \ref{0f1:listing:kettenbruchRekursion} ist, dass im Vergleich zum Code \ref{0f1:listing:kettenbruchIterativ} eine Division gespart werden kann und somit weniger Folgefehler entstehen können. - -%Code +% +% teil2.tex -- Umsetzung in C Programmen +% +% (c) 2022 Fabian Dünki, Hochschule Rapperswil +% +\section{Umsetzung +\label{0f1:section:teil2}} +\rhead{Umsetzung} +Zur Umsetzung wurden drei verschiedene Ansätze gewählt. Dabei wurde der Schwerpunkt auf die Funktionalität und eine gute Lesbarkeit des Codes gelegt. +Die Unterprogramme wurde jeweils, wie die GNU Scientific Library, in C geschrieben. Die Zwischenresultate wurden vom Hauptprogramm in einem CSV-File gespeichert. Anschliessen wurde mit der Matplot-Libray in Python die Resultate geplottet. + +\subsection{Potenzreihe +\label{0f1:subsection:potenzreihe}} +Die naheliegendste Lösung ist die Programmierung der Potenzreihe. Allerdings ist ein Problem dieser Umsetzung \ref{0f1:listing:potenzreihe}, dass die Fakultät im Nenner schnell grosse Werte annimmt und so der Bruch gegen Null strebt. Spätesten ab $k=167$ stösst diese Umsetzung \eqref{0f1:umsetzung:0f1:eq} an ihre Grenzen, da die Fakultät von $168$ eine Bereichsüberschreitung des \textit{double} Bereiches darstellt. \cite{0f1:double} + +\begin{align} + \label{0f1:umsetzung:0f1:eq} + \mathstrut_0F_1(;c;z) + &= + \sum_{k=0}^\infty + \frac{z^k}{(c)_k \cdot k!} + &= + \frac{1}{c} + +\frac{z^1}{(c+1) \cdot 1} + + \cdots + + \frac{z^{20}}{c(c+1)(c+2)\cdots(c+19) \cdot 2.4 \cdot 10^{18}} +\end{align} + +\lstinputlisting[style=C,float,caption={Potenzreihe.},label={0f1:listing:potenzreihe}, firstline=59]{papers/0f1/listings/potenzreihe.c} + +\subsection{Kettenbruch +\label{0f1:subsection:kettenbruch}} +Ein endlicher Kettenbruch ist ein Bruch der Form +\begin{equation*} +a_0 + \cfrac{b_1}{a_1+\cfrac{b_2}{a_2+\cfrac{b_3}{a_3+\cdots}}} +\end{equation*} +in welchem $a_0, a_1,\dots,a_n$ und $b_1,b_2,\dots,b_n$ ganze Zahlen darstellen. + +Die Kurzschreibweise für einen allgemeinen Kettenbruch ist +\begin{equation*} + a_0 + \frac{a_1|}{|b_1} + \frac{a_2|}{|b_2} + \frac{a_3|}{|b_3} + \cdots +\end{equation*} +und ist somit verknüpfbar mit der Potenzreihe. +\cite{0f1:wiki-kettenbruch} + +Angewendet auf die Funktion $\mathstrut_0F_1$ bedeutet dies: +\begin{equation*} + \mathstrut_0F_1(;c;z) = 1 + \frac{z}{c\cdot1!} + \frac{z^2}{c(c+1)\cdot2!} + \frac{z^3}{c(c+1)(c+2)\cdot3!} + \cdots +\end{equation*} +\cite{0f1:wiki-fraction} + +Nach allen Umformungen ergibt sich folgender, irregulärer Kettenbruch \eqref{0f1:math:kettenbruch:0f1:eq} +\begin{equation} + \label{0f1:math:kettenbruch:0f1:eq} + \mathstrut_0F_1(;c;z) = 1 + \cfrac{\cfrac{z}{c}}{1+\cfrac{-\cfrac{z}{2(c+1)}}{1+\cfrac{z}{2(c+1)}+\cfrac{-\cfrac{z}{3(c+2)}}{1+\cfrac{z}{5(c+4)} + \cdots}}}, +\end{equation} +der als Code \ref{0f1:listing:kettenbruchIterativ} umgesetzt wurde. +\cite{0f1:wolfram-0f1} + +\lstinputlisting[style=C,float,caption={Rekursionsformel für Kettenbruch.},label={0f1:listing:kettenbruchIterativ}, firstline=8]{papers/0f1/listings/kettenbruchIterativ.c} + +\subsection{Rekursionsformel +\label{0f1:subsection:rekursionsformel}} +Wesentlich stabiler zur Berechnung eines Kettenbruches ist die Rekursionsformel. Nachfolgend wird die verkürzte Herleitung vom Kettenbruch zur Rekursionsformel aufgezeigt. Eine vollständige Schritt für Schritt Herleitung ist im Seminarbuch Numerik, im Kapitel Kettenbrüche zu finden. \cite{0f1:kettenbrueche}) + +\subsubsection{Verkürzte Herleitung} +Ein Näherungsbruch in der Form +\begin{align*} + \cfrac{A_k}{B_k} = a_k + \cfrac{b_{k + 1}}{a_{k + 1} + \cfrac{p}{q}} +\end{align*} +lässt sich zu +\begin{align*} + \cfrac{A_k}{B_k} = \cfrac{b_{k+1}}{a_{k+1} + \cfrac{p}{q}} = \frac{b_{k+1} \cdot q}{a_{k+1} \cdot q + p} +\end{align*} +umformen. +Dies lässt sich auch durch die folgende Matrizenschreibweise ausdrücken: +\begin{equation*} + \begin{pmatrix} + A_k\\ + B_k + \end{pmatrix} + = \begin{pmatrix} + b_{k+1} \cdot q\\ + a_{k+1} \cdot q + p + \end{pmatrix} + =\begin{pmatrix} + 0& b_{k+1}\\ + 1& a_{k+1} + \end{pmatrix} + \begin{pmatrix} + p \\ + q + \end{pmatrix}. + %\label{0f1:math:rekursionsformel:herleitung} +\end{equation*} + +Wendet man dies nun auf den Kettenbruch in der Form +\begin{equation*} + \frac{A_k}{B_k} = a_0 + \cfrac{b_1}{a_1+\cfrac{b_2}{a_2+\cfrac{\cdots}{\cdots+\cfrac{b_{k-1}}{a_{k-1} + \cfrac{b_k}{a_k}}}}} +\end{equation*} +an, ergibt sich folgende Matrixdarstellungen: + +\begin{align*} + \begin{pmatrix} + A_k\\ + B_k + \end{pmatrix} + &= + \begin{pmatrix} + 1& a_0\\ + 0& 1 + \end{pmatrix} + \begin{pmatrix} + 0& b_1\\ + 1& a_1 + \end{pmatrix} + \cdots + \begin{pmatrix} + 0& b_{k-1}\\ + 1& a_{k-1} + \end{pmatrix} + \begin{pmatrix} + b_k\\ + a_k + \end{pmatrix} +\end{align*} + +Nach vollständiger Induktion ergibt sich für den Schritt $k$, die Matrix +\begin{equation} + \label{0f1:math:matrix:ende:eq} + \begin{pmatrix} + A_{k}\\ + B_{k} + \end{pmatrix} + = + \begin{pmatrix} + A_{k-2}& A_{k-1}\\ + B_{k-2}& B_{k-1} + \end{pmatrix} + \begin{pmatrix} + b_k\\ + a_k + \end{pmatrix}. +\end{equation} + +Und Schlussendlich kann der Näherungsbruch +\[ +\frac{Ak}{Bk} +\] +berechnet werden. + + +\subsubsection{Lösung} +Die Berechnung von $A_k, B_k$ \eqref{0f1:math:matrix:ende:eq} kann man auch ohne die Matrizenschreibweise aufschreiben: \cite{0f1:wiki-fraction} +\begin{itemize} +\item Startbedingungen: +\begin{align*} +A_{-1} &= 0 & A_0 &= a_0 \\ +B_{-1} &= 1 & B_0 &= 1 +\end{align*} +\item Schritt $k\to k+1$: +\[ +\begin{aligned} +k &\rightarrow k + 1: +& +A_{k+1} &= A_{k-1} \cdot b_k + A_k \cdot a_k \\ +&& +B_{k+1} &= B_{k-1} \cdot b_k + B_k \cdot a_k +\end{aligned} +\] +\item +Näherungsbruch: \qquad$\displaystyle\frac{A_k}{B_k}$ +\end{itemize} + +Ein grosser Vorteil dieser Umsetzung \ref{0f1:listing:kettenbruchRekursion} ist, dass im Vergleich zum Code \ref{0f1:listing:kettenbruchIterativ} eine Division gespart werden kann und somit weniger Rundungsfehler entstehen können. + +%Code \lstinputlisting[style=C,float,caption={Iterativ umgesetzter Kettenbruch.},label={0f1:listing:kettenbruchRekursion}, firstline=8]{papers/0f1/listings/kettenbruchRekursion.c} \ No newline at end of file diff --git a/buch/papers/0f1/teil3.tex b/buch/papers/0f1/teil3.tex index 76d6e32..355e1b7 100644 --- a/buch/papers/0f1/teil3.tex +++ b/buch/papers/0f1/teil3.tex @@ -1,56 +1,56 @@ -% -% teil3.tex -- Resultate und Ausblick -% -% (c) 2022 Fabian Dünki, Hochschule Rapperswil -% -\section{Resultate -\label{0f1:section:teil3}} -\rhead{Resultate} -Im Verlauf des Seminares hat sich gezeigt, -das ein einfacher mathematischer Algorithmus zu implementieren gar nicht so einfach ist. -So haben alle drei umgesetzten Ansätze Probleme mit grossen negativen x in der Funktion $\mathstrut_0F_1(;b;x)$. -Ebenso wird, je grösser der Wert x wird $\mathstrut_0F_1(;b;x)$, desto mehr weichen die berechneten Resultate -von den Erwarteten ab. \cite{0f1:wolfram-0f1} - -\subsection{Auswertung -\label{0f1:subsection:auswertung}} -\begin{figure} - \centering - \includegraphics[width=0.8\textwidth]{papers/0f1/images/konvergenzAiry.pdf} - \caption{Konvergenz nach drei Iterationen, dargestellt anhand der Airy Funktion zu den Anfangsbedingungen $y(0)=1$ und $y'(0)=0$. - \label{0f1:ausblick:plot:airy:konvergenz}} -\end{figure} - -\begin{figure} - \centering - \includegraphics[width=0.8\textwidth]{papers/0f1/images/konvergenzPositiv.pdf} - \caption{Konvergenz: Logarithmisch dargestellte Differenz vom erwarteten Endresultat. - \label{0f1:ausblick:plot:konvergenz:positiv}} -\end{figure} - -\begin{figure} - \centering - \includegraphics[width=0.8\textwidth]{papers/0f1/images/konvergenzNegativ.pdf} - \caption{Konvergenz: Logarithmisch dargestellte Differenz vom erwarteten Endresultat. - \label{0f1:ausblick:plot:konvergenz:negativ}} -\end{figure} - -\begin{figure} - \centering - \includegraphics[width=1\textwidth]{papers/0f1/images/stabilitaet.pdf} - \caption{Stabilität der 3 Algorithmen verglichen mit der GNU Scientific Library. - \label{0f1:ausblick:plot:airy:stabilitaet}} -\end{figure} - -\begin{itemize} - \item Negative Zahlen sind sowohl für die Potenzreihe als auch für den Kettenbruch ein Problem. - \item Die Potenzreihe hat das Problem, je tiefer die Rekursionstiefe, desto mehr machen die Brüche ein Problem. Also der Nenner mit der Fakultät und dem Pochhammer Symbol. - \item Die Rekursionformel liefert für sehr grosse positive Werte die genausten Ergebnisse, verglichen mit der GNU Scientific Library. -\end{itemize} - - -\subsection{Ausblick -\label{0f1:subsection:ausblick}} -Eine mögliche Lösung zum Problem ist \cite{0f1:SeminarNumerik} -{\color{red} TODO beschreiben Lösung} - +% +% teil3.tex -- Resultate und Ausblick +% +% (c) 2022 Fabian Dünki, Hochschule Rapperswil +% +\section{Resultate +\label{0f1:section:teil3}} +\rhead{Resultate} +Im Verlauf des Seminares hat sich gezeigt, +das ein einfacher mathematischer Algorithmus zu implementieren gar nicht so einfach ist. +So haben alle drei umgesetzten Ansätze Probleme mit grossen negativen z in der Funktion $\mathstrut_0F_1(;c;z)$. +Ebenso wird, je grösser der Wert z wird $\mathstrut_0F_1(;c;z)$, desto mehr weichen die berechneten Resultate +von den Erwarteten ab. \cite{0f1:wolfram-0f1} + +\subsection{Auswertung +\label{0f1:subsection:auswertung}} +\begin{figure} + \centering + \includegraphics[width=0.8\textwidth]{papers/0f1/images/konvergenzAiry.pdf} + \caption{Konvergenz nach drei Iterationen, dargestellt anhand der Airy Funktion zu den Anfangsbedingungen $Ai(0)=1$ und $Ai'(0)=0$. + \label{0f1:ausblick:plot:airy:konvergenz}} +\end{figure} + +\begin{figure} + \centering + \includegraphics[width=0.8\textwidth]{papers/0f1/images/konvergenzPositiv.pdf} + \caption{Konvergenz: Logarithmisch dargestellte Differenz vom erwarteten Endresultat. + \label{0f1:ausblick:plot:konvergenz:positiv}} +\end{figure} + +\begin{figure} + \centering + \includegraphics[width=0.8\textwidth]{papers/0f1/images/konvergenzNegativ.pdf} + \caption{Konvergenz: Logarithmisch dargestellte Differenz vom erwarteten Endresultat. + \label{0f1:ausblick:plot:konvergenz:negativ}} +\end{figure} + +\begin{figure} + \centering + \includegraphics[width=1\textwidth]{papers/0f1/images/stabilitaet.pdf} + \caption{Stabilität der 3 Algorithmen verglichen mit der GNU Scientific Library. + \label{0f1:ausblick:plot:airy:stabilitaet}} +\end{figure} + +\begin{itemize} + \item Negative Zahlen sind sowohl für die Potenzreihe als auch für den Kettenbruch ein Problem. + \item Die Potenzreihe hat das Problem, je tiefer die Rekursionstiefe, desto mehr machen die Brüche ein Problem. Also der Nenner mit der Fakultät und dem Pochhammer Symbol. + \item Die Rekursionformel liefert für sehr grosse positive Werte die genausten Ergebnisse, verglichen mit der GNU Scientific Library. +\end{itemize} + + +\subsection{Ausblick +\label{0f1:subsection:ausblick}} +Eine mögliche Lösung zum Problem ist \cite{0f1:SeminarNumerik} +{\color{red} TODO beschreiben Lösung} + -- cgit v1.2.1 From 18378909d070e684c0d7ee0b539be7baeee62cea Mon Sep 17 00:00:00 2001 From: Fabian <@> Date: Wed, 27 Jul 2022 18:45:06 +0200 Subject: 0f1, abgabe --- buch/papers/0f1/references.bib | 19 ++++++++++++----- buch/papers/0f1/teil1.tex | 3 +-- buch/papers/0f1/teil2.tex | 20 +++++++----------- buch/papers/0f1/teil3.tex | 46 +++++++++++++++++++++++++----------------- 4 files changed, 49 insertions(+), 39 deletions(-) (limited to 'buch/papers/0f1') diff --git a/buch/papers/0f1/references.bib b/buch/papers/0f1/references.bib index 2d3f874..ca1b558 100644 --- a/buch/papers/0f1/references.bib +++ b/buch/papers/0f1/references.bib @@ -10,7 +10,7 @@ date = {2022-07-07}, year = {2022}, month = {7}, - day = {19} + day = {7} } @online{0f1:wiki-airyFunktion, @@ -19,7 +19,7 @@ date = {2022-07-07}, year = {2022}, month = {7}, - day = {25} + day = {7} } @online{0f1:wiki-kettenbruch, @@ -37,7 +37,7 @@ date = {2022-07-07}, year = {2022}, month = {7}, - day = {25} + day = {7} } @online{0f1:wolfram-0f1, @@ -46,7 +46,7 @@ date = {2022-07-07}, year = {2022}, month = {7}, - day = {25} + day = {7} } @online{0f1:wiki-fraction, @@ -55,7 +55,16 @@ date = {2022-07-07}, year = {2022}, month = {7}, - day = {25} + day = {7} +} + +@online{0f1:code, + title = {Vollständiger C-Code}, + url ={https://github.com/AndreasFMueller/SeminarSpezielleFunktionen/tree/master/buch/papers/0f1/listings}, + date = {2022-07-07}, + year = {2022}, + month = {7}, + day = {7} } @book{0f1:SeminarNumerik, diff --git a/buch/papers/0f1/teil1.tex b/buch/papers/0f1/teil1.tex index f8d70a8..2ca9647 100644 --- a/buch/papers/0f1/teil1.tex +++ b/buch/papers/0f1/teil1.tex @@ -6,8 +6,7 @@ \section{Mathematischer Hintergrund \label{0f1:section:mathHintergrund}} \rhead{Mathematischer Hintergrund} -Basierend auf den Herleitungen des vorhergehenden Kapitels \ref{buch:rekursion:section:hypergeometrische-funktion} -und dem Seminarbuch Numerik \cite{0f1:kettenbrueche}, werden im nachfolgenden Abschnitt nochmals die Resultate +Basierend auf den Herleitungen des vorhergehenden Kapitels \ref{buch:rekursion:section:hypergeometrische-funktion}, werden im nachfolgenden Abschnitt nochmals die Resultate beschrieben. \subsection{Hypergeometrische Funktion diff --git a/buch/papers/0f1/teil2.tex b/buch/papers/0f1/teil2.tex index 3c2b5cd..9269961 100644 --- a/buch/papers/0f1/teil2.tex +++ b/buch/papers/0f1/teil2.tex @@ -6,7 +6,7 @@ \section{Umsetzung \label{0f1:section:teil2}} \rhead{Umsetzung} -Zur Umsetzung wurden drei verschiedene Ansätze gewählt. Dabei wurde der Schwerpunkt auf die Funktionalität und eine gute Lesbarkeit des Codes gelegt. +Zur Umsetzung wurden drei verschiedene Ansätze gewählt.\cite{0f1:code} Dabei wurde der Schwerpunkt auf die Funktionalität und eine gute Lesbarkeit des Codes gelegt. Die Unterprogramme wurde jeweils, wie die GNU Scientific Library, in C geschrieben. Die Zwischenresultate wurden vom Hauptprogramm in einem CSV-File gespeichert. Anschliessen wurde mit der Matplot-Libray in Python die Resultate geplottet. \subsection{Potenzreihe @@ -35,20 +35,16 @@ Ein endlicher Kettenbruch ist ein Bruch der Form a_0 + \cfrac{b_1}{a_1+\cfrac{b_2}{a_2+\cfrac{b_3}{a_3+\cdots}}} \end{equation*} in welchem $a_0, a_1,\dots,a_n$ und $b_1,b_2,\dots,b_n$ ganze Zahlen darstellen. - Die Kurzschreibweise für einen allgemeinen Kettenbruch ist \begin{equation*} a_0 + \frac{a_1|}{|b_1} + \frac{a_2|}{|b_2} + \frac{a_3|}{|b_3} + \cdots \end{equation*} und ist somit verknüpfbar mit der Potenzreihe. \cite{0f1:wiki-kettenbruch} - -Angewendet auf die Funktion $\mathstrut_0F_1$ bedeutet dies: +Angewendet auf die Funktion $\mathstrut_0F_1$ bedeutet dies\cite{0f1:wiki-fraction}: \begin{equation*} \mathstrut_0F_1(;c;z) = 1 + \frac{z}{c\cdot1!} + \frac{z^2}{c(c+1)\cdot2!} + \frac{z^3}{c(c+1)(c+2)\cdot3!} + \cdots \end{equation*} -\cite{0f1:wiki-fraction} - Nach allen Umformungen ergibt sich folgender, irregulärer Kettenbruch \eqref{0f1:math:kettenbruch:0f1:eq} \begin{equation} \label{0f1:math:kettenbruch:0f1:eq} @@ -57,13 +53,13 @@ Nach allen Umformungen ergibt sich folgender, irregulärer Kettenbruch \eqref{0f der als Code \ref{0f1:listing:kettenbruchIterativ} umgesetzt wurde. \cite{0f1:wolfram-0f1} -\lstinputlisting[style=C,float,caption={Rekursionsformel für Kettenbruch.},label={0f1:listing:kettenbruchIterativ}, firstline=8]{papers/0f1/listings/kettenbruchIterativ.c} +\lstinputlisting[style=C,float,caption={Iterativ umgesetzter Kettenbruch.},label={0f1:listing:kettenbruchIterativ}, firstline=8]{papers/0f1/listings/kettenbruchIterativ.c} \subsection{Rekursionsformel \label{0f1:subsection:rekursionsformel}} -Wesentlich stabiler zur Berechnung eines Kettenbruches ist die Rekursionsformel. Nachfolgend wird die verkürzte Herleitung vom Kettenbruch zur Rekursionsformel aufgezeigt. Eine vollständige Schritt für Schritt Herleitung ist im Seminarbuch Numerik, im Kapitel Kettenbrüche zu finden. \cite{0f1:kettenbrueche}) +Wesentlich stabiler zur Berechnung eines Kettenbruches ist die Rekursionsformel. Nachfolgend wird die verkürzte Herleitung vom Kettenbruch zur Rekursionsformel aufgezeigt. Eine vollständige Schritt für Schritt Herleitung ist im Seminarbuch Numerik, im Kapitel Kettenbrüche zu finden. \cite{0f1:kettenbrueche} -\subsubsection{Verkürzte Herleitung} +\subsubsection{Herleitung} Ein Näherungsbruch in der Form \begin{align*} \cfrac{A_k}{B_k} = a_k + \cfrac{b_{k + 1}}{a_{k + 1} + \cfrac{p}{q}} @@ -93,7 +89,6 @@ Dies lässt sich auch durch die folgende Matrizenschreibweise ausdrücken: \end{pmatrix}. %\label{0f1:math:rekursionsformel:herleitung} \end{equation*} - Wendet man dies nun auf den Kettenbruch in der Form \begin{equation*} \frac{A_k}{B_k} = a_0 + \cfrac{b_1}{a_1+\cfrac{b_2}{a_2+\cfrac{\cdots}{\cdots+\cfrac{b_{k-1}}{a_{k-1} + \cfrac{b_k}{a_k}}}}} @@ -124,7 +119,6 @@ an, ergibt sich folgende Matrixdarstellungen: a_k \end{pmatrix} \end{align*} - Nach vollständiger Induktion ergibt sich für den Schritt $k$, die Matrix \begin{equation} \label{0f1:math:matrix:ende:eq} @@ -142,7 +136,6 @@ Nach vollständiger Induktion ergibt sich für den Schritt $k$, die Matrix a_k \end{pmatrix}. \end{equation} - Und Schlussendlich kann der Näherungsbruch \[ \frac{Ak}{Bk} @@ -161,6 +154,7 @@ B_{-1} &= 1 & B_0 &= 1 \item Schritt $k\to k+1$: \[ \begin{aligned} +\label{0f1:math:loesung:eq} k &\rightarrow k + 1: & A_{k+1} &= A_{k-1} \cdot b_k + A_k \cdot a_k \\ @@ -175,4 +169,4 @@ Näherungsbruch: \qquad$\displaystyle\frac{A_k}{B_k}$ Ein grosser Vorteil dieser Umsetzung \ref{0f1:listing:kettenbruchRekursion} ist, dass im Vergleich zum Code \ref{0f1:listing:kettenbruchIterativ} eine Division gespart werden kann und somit weniger Rundungsfehler entstehen können. %Code -\lstinputlisting[style=C,float,caption={Iterativ umgesetzter Kettenbruch.},label={0f1:listing:kettenbruchRekursion}, firstline=8]{papers/0f1/listings/kettenbruchRekursion.c} \ No newline at end of file +\lstinputlisting[style=C,float,caption={Rekursionsformel für Kettenbruch.},label={0f1:listing:kettenbruchRekursion}, firstline=8]{papers/0f1/listings/kettenbruchRekursion.c} \ No newline at end of file diff --git a/buch/papers/0f1/teil3.tex b/buch/papers/0f1/teil3.tex index 355e1b7..2855e26 100644 --- a/buch/papers/0f1/teil3.tex +++ b/buch/papers/0f1/teil3.tex @@ -3,17 +3,37 @@ % % (c) 2022 Fabian Dünki, Hochschule Rapperswil % -\section{Resultate +\section{Auswertung \label{0f1:section:teil3}} \rhead{Resultate} Im Verlauf des Seminares hat sich gezeigt, das ein einfacher mathematischer Algorithmus zu implementieren gar nicht so einfach ist. -So haben alle drei umgesetzten Ansätze Probleme mit grossen negativen z in der Funktion $\mathstrut_0F_1(;c;z)$. -Ebenso wird, je grösser der Wert z wird $\mathstrut_0F_1(;c;z)$, desto mehr weichen die berechneten Resultate -von den Erwarteten ab. \cite{0f1:wolfram-0f1} +So haben alle drei umgesetzten Ansätze Probleme mit grossen negativen $z$ in der Funktion $\mathstrut_0F_1(;c;z)$. +Ebenso kann festgestellt werden,dass je grösser der Wert $z$ in $\mathstrut_0F_1(;c;z)$ wird, desto mehr weichen die berechneten Resultate von den Erwarteten ab. \cite{0f1:wolfram-0f1} + +\subsection{Konvergenz +\label{0f1:subsection:konvergenz}} +Es zeigt sich in Abbildung \ref{0f1:ausblick:plot:airy:konvergenz}, dass schon nach drei Iterationen ($k = 3$) die Funktionen schon genaue Resultate im Bereich von -2 bis 2 liefert. Ebenso kann festgestellt werden, dass der Kettenbruch schneller konvergiert und im positiven Bereich sogar mit der Referenzfunktion $Ai(x)$ übereinstimmt. Da die Rekursionsformel \ref{0f1:listing:kettenbruchRekursion} eine Abwandlung des Kettenbruches ist, verhalten sich die Funktionen in diesem Fall gleich. + +Erst wenn mehrere Durchläufe gemacht werden, um die Genauigkeit zu verbessern, ist der Kettenbruch den anderen zwei Algorithmen, bezüglich Konvergenz überlegen. +Interessant ist auch, dass die Rekursionsformel nahezu gleich schnell wie die Potenzreihe konvergiert, aber sich danach einschwingt. Dieses Verhalten ist auch bei grösseren $z$ zu beobachten, allerdings ist dann die Differenz zwischen dem ersten lokalen Minimum von k bis zum Abbruch kleiner. +\ref{0f1:ausblick:plot:konvergenz:positiv} +Dieses Phänomen ist auf die Lösung der Rekursionsformel zurück zu führen.\ref{0f1:math:loesung:eq} Da im Gegensatz die ganz kleinen Werte nicht zu einer Konvergenz wie beim Kettenbruch führen, sondern sich noch eine Zeit lang durch die Multiplikation aufschwingen. + +Ist $z$ negativ wie im Abbild \ref{0f1:ausblick:plot:konvergenz:negativ}, führt dies zu einer Gegenseitigen Kompensation von negativen und positiven Termen so bricht die Rekursionsformel hier zusammen mit der Potenzreihe ab. +Die ansteigende Differenz mit anschliessender, ist aufgrund der sich alternierenden Termen mit wechselnden Vorzeichens zu erklären. + +\subsection{Stabilität +\label{0f1:subsection:Stabilitaet}} +Verändert sich der Wert von z in $\mathstrut_0F_1(;c;z)$ gegen grössere positive Werte, wie zum Beispiel $c = 800$ liefert die Kettenbruch-Funktion \ref{0f1:listing:kettenbruchIterativ} \verb+inf+ zurück. Dies könnte durch ein Abbruchkriterien abgefangen werden. Allerdings würde das, bei grossen Werten zulasten der Genauigkeit gehen. Trotzdem könnte, je nach Anwendung, auf ein paar Nachkommastellen verzichtet werden. + +Wohingegen die Potenzreihe \ref{0f1:listing:potenzreihe} das Problem hat, dass je mehr Terme berechnet werden, desto schneller wächst die Fakultät und irgendwann gibt es eine Bereichsüberschreitung von \verb+double+. Schlussendlich gibt das Unterprogramm das Resultat \verb+-nan(ind)+ zurück. +Die Rekursionformel \ref{0f1:listing:kettenbruchRekursion} liefert für sehr grosse positive Werte die genausten Ergebnisse, verglichen mit der GNU Scientific Library. Wie schon vermutet ist die Rekursionsformel, im positivem Bereich, der stabilste Algorithmus. Um die Stabilität zu gewährleisten, muss wie in \ref{0f1:ausblick:plot:konvergenz:positiv} dargestellt, die Iterationstiefe $k$ genug gross gewählt werden. + +Im negativem Bereich sind alle gewählten und umgesetzten Ansätze instabil. Grund dafür ist die Fakultät im Nenner, was zum Phänomen der Auslöschung führt.\cite{0f1:SeminarNumerik} Schön zu beobachten ist dies in der Abbildung \ref{0f1:ausblick:plot:airy:stabilitaet} mit der Airy-Funktion als Test. So sind sowohl der Kettenbruch, als auch die Rekursionsformel bis ungefähr $\frac{-15^3}{9}$ stabil. Dies macht auch Sinn, da beide auf der gleichen mathematischen Grundlage basieren. Danach verhält sich allerdings die Instabilität unterschiedlich. Das unterschiedliche Verhalten kann damit erklärt werden, dass beim Kettenbruch jeweils eine zusätzliche Division stattfindet. Diese Unterschiede sind auch in Abbildung \ref{0f1:ausblick:plot:konvergenz:positiv} festzustellen. + + -\subsection{Auswertung -\label{0f1:subsection:auswertung}} \begin{figure} \centering \includegraphics[width=0.8\textwidth]{papers/0f1/images/konvergenzAiry.pdf} @@ -38,19 +58,7 @@ von den Erwarteten ab. \cite{0f1:wolfram-0f1} \begin{figure} \centering \includegraphics[width=1\textwidth]{papers/0f1/images/stabilitaet.pdf} - \caption{Stabilität der 3 Algorithmen verglichen mit der GNU Scientific Library. + \caption{Stabilität der 3 Algorithmen verglichen mit der Referenz Funktion $Ai(x)$. \label{0f1:ausblick:plot:airy:stabilitaet}} \end{figure} -\begin{itemize} - \item Negative Zahlen sind sowohl für die Potenzreihe als auch für den Kettenbruch ein Problem. - \item Die Potenzreihe hat das Problem, je tiefer die Rekursionstiefe, desto mehr machen die Brüche ein Problem. Also der Nenner mit der Fakultät und dem Pochhammer Symbol. - \item Die Rekursionformel liefert für sehr grosse positive Werte die genausten Ergebnisse, verglichen mit der GNU Scientific Library. -\end{itemize} - - -\subsection{Ausblick -\label{0f1:subsection:ausblick}} -Eine mögliche Lösung zum Problem ist \cite{0f1:SeminarNumerik} -{\color{red} TODO beschreiben Lösung} - -- cgit v1.2.1