diff options
author | Fabian <@> | 2022-07-27 13:08:39 +0200 |
---|---|---|
committer | Fabian <@> | 2022-07-27 13:08:39 +0200 |
commit | 220b382cf4b7019b199c3023ddab73ba2658e27a (patch) | |
tree | 0da0ffe25b8ed47ab8dafc606112d78956d7ab16 /buch/papers | |
parent | 0f1, Code ueberarbeitet (diff) | |
download | SeminarSpezielleFunktionen-220b382cf4b7019b199c3023ddab73ba2658e27a.tar.gz SeminarSpezielleFunktionen-220b382cf4b7019b199c3023ddab73ba2658e27a.zip |
0f1, bilder
Diffstat (limited to '')
-rw-r--r-- | buch/papers/0f1/images/airy.pdf | bin | 25568 -> 0 bytes | |||
-rw-r--r-- | buch/papers/0f1/images/konvergenzAiry.pdf | bin | 15137 -> 15785 bytes | |||
-rw-r--r-- | buch/papers/0f1/images/konvergenzNegativ.pdf | bin | 16312 -> 18155 bytes | |||
-rw-r--r-- | buch/papers/0f1/images/konvergenzPositiv.pdf | bin | 18924 -> 18581 bytes | |||
-rw-r--r-- | buch/papers/0f1/images/stabilitaet.pdf | bin | 20944 -> 19612 bytes | |||
-rw-r--r-- | buch/papers/0f1/listings/kettenbruchRekursion.c | 8 | ||||
-rw-r--r-- | buch/papers/0f1/listings/potenzreihe.c | 8 | ||||
-rw-r--r-- | buch/papers/0f1/main.tex | 48 | ||||
-rw-r--r-- | buch/papers/0f1/teil0.tex | 30 | ||||
-rw-r--r-- | buch/papers/0f1/teil1.tex | 204 | ||||
-rw-r--r-- | buch/papers/0f1/teil2.tex | 354 | ||||
-rw-r--r-- | buch/papers/0f1/teil3.tex | 112 |
12 files changed, 382 insertions, 382 deletions
diff --git a/buch/papers/0f1/images/airy.pdf b/buch/papers/0f1/images/airy.pdf Binary files differdeleted file mode 100644 index 672d789..0000000 --- a/buch/papers/0f1/images/airy.pdf +++ /dev/null diff --git a/buch/papers/0f1/images/konvergenzAiry.pdf b/buch/papers/0f1/images/konvergenzAiry.pdf Binary files differindex 2e635ea..206cd3a 100644 --- a/buch/papers/0f1/images/konvergenzAiry.pdf +++ b/buch/papers/0f1/images/konvergenzAiry.pdf diff --git a/buch/papers/0f1/images/konvergenzNegativ.pdf b/buch/papers/0f1/images/konvergenzNegativ.pdf Binary files differindex 3b58be4..03b2ba1 100644 --- a/buch/papers/0f1/images/konvergenzNegativ.pdf +++ b/buch/papers/0f1/images/konvergenzNegativ.pdf diff --git a/buch/papers/0f1/images/konvergenzPositiv.pdf b/buch/papers/0f1/images/konvergenzPositiv.pdf Binary files differindex 24e3fd5..2e45129 100644 --- a/buch/papers/0f1/images/konvergenzPositiv.pdf +++ b/buch/papers/0f1/images/konvergenzPositiv.pdf diff --git a/buch/papers/0f1/images/stabilitaet.pdf b/buch/papers/0f1/images/stabilitaet.pdf Binary files differindex be4af42..13dea39 100644 --- a/buch/papers/0f1/images/stabilitaet.pdf +++ b/buch/papers/0f1/images/stabilitaet.pdf 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}
+
|