diff options
Diffstat (limited to 'buch/papers/0f1')
-rw-r--r-- | buch/papers/0f1/images/konvergenzNegativ.pdf | bin | 18155 -> 18524 bytes | |||
-rw-r--r-- | buch/papers/0f1/images/konvergenzPositiv.pdf | bin | 18581 -> 18253 bytes | |||
-rw-r--r-- | buch/papers/0f1/listings/kettenbruchIterativ.c | 60 | ||||
-rw-r--r-- | buch/papers/0f1/listings/kettenbruchRekursion.c | 60 | ||||
-rw-r--r-- | buch/papers/0f1/teil0.tex | 8 | ||||
-rw-r--r-- | buch/papers/0f1/teil1.tex | 23 | ||||
-rw-r--r-- | buch/papers/0f1/teil2.tex | 87 | ||||
-rw-r--r-- | buch/papers/0f1/teil3.tex | 33 |
8 files changed, 155 insertions, 116 deletions
diff --git a/buch/papers/0f1/images/konvergenzNegativ.pdf b/buch/papers/0f1/images/konvergenzNegativ.pdf Binary files differindex 03b2ba1..07d2a44 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 2e45129..8e1e7e4 100644 --- a/buch/papers/0f1/images/konvergenzPositiv.pdf +++ b/buch/papers/0f1/images/konvergenzPositiv.pdf diff --git a/buch/papers/0f1/listings/kettenbruchIterativ.c b/buch/papers/0f1/listings/kettenbruchIterativ.c index d897b8f..3caaf43 100644 --- a/buch/papers/0f1/listings/kettenbruchIterativ.c +++ b/buch/papers/0f1/listings/kettenbruchIterativ.c @@ -1,53 +1,27 @@ /**
- * @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)
+ * @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 fractionRekursion0f1(const double c, const double z, unsigned int n)
+static double fractionIter0f1(const double c, const double z, unsigned int k)
{
//declaration
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;
+ double abk = 0.0;
+ double temp = 0.0;
- for (unsigned int k = 0; k <= n; ++k)
+ for (; k > 0; --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 = z/c; //b1
- //recursion fomula for A1, B1
- Ak = a * Ak_1 + b * 1.0;
- Bk = a * Bk_1;
- }
- else
- {
- 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;
- }
- //save old values
- Ak_2 = Ak_1;
- Bk_2 = Bk_1;
- Ak_1 = Ak;
- Bk_1 = Bk;
+ abk = z / (k * ((k - 1) + c)); //abk = ak, bk
+
+ a = k > 1 ? (1 + abk) : 1; //a0, a1
+ b = k > 1 ? -abk : abk; //b1
+
+ temp = b / (a + temp); //bk / (ak + last result)
}
- //approximation fraction
- return Ak/Bk;
-}
+
+ return a + temp; //a0 + temp
+}
\ No newline at end of file diff --git a/buch/papers/0f1/listings/kettenbruchRekursion.c b/buch/papers/0f1/listings/kettenbruchRekursion.c index 3caaf43..d897b8f 100644 --- a/buch/papers/0f1/listings/kettenbruchRekursion.c +++ b/buch/papers/0f1/listings/kettenbruchRekursion.c @@ -1,27 +1,53 @@ /**
- * @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)
+ * @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 fractionIter0f1(const double c, const double z, unsigned int k)
+static double fractionRekursion0f1(const double c, const double z, unsigned int n)
{
//declaration
double a = 0.0;
double b = 0.0;
- double abk = 0.0;
- double temp = 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 (; k > 0; --k)
+ for (unsigned int k = 0; k <= n; ++k)
{
- abk = z / (k * ((k - 1) + c)); //abk = ak, bk
-
- a = k > 1 ? (1 + abk) : 1; //a0, a1
- b = k > 1 ? -abk : abk; //b1
-
- temp = b / (a + temp); //bk / (ak + last result)
+ 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 = z/c; //b1
+ //recursion fomula for A1, B1
+ Ak = a * Ak_1 + b * 1.0;
+ Bk = a * Bk_1;
+ }
+ else
+ {
+ 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;
+ }
+ //save old values
+ Ak_2 = Ak_1;
+ Bk_2 = Bk_1;
+ Ak_1 = Ak;
+ Bk_1 = Bk;
}
-
- return a + temp; //a0 + temp
-}
\ No newline at end of file + //approximation fraction
+ return Ak/Bk;
+}
diff --git a/buch/papers/0f1/teil0.tex b/buch/papers/0f1/teil0.tex index adccac7..335cf92 100644 --- a/buch/papers/0f1/teil0.tex +++ b/buch/papers/0f1/teil0.tex @@ -5,11 +5,11 @@ %
\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.
+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.
+Allerdings wirft die Funktion bei negativen Übergabewerten 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.
+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 f697f45..8d00f95 100644 --- a/buch/papers/0f1/teil1.tex +++ b/buch/papers/0f1/teil1.tex @@ -6,12 +6,11 @@ \section{Mathematischer Hintergrund
\label{0f1:section:mathHintergrund}}
\rhead{Mathematischer Hintergrund}
-Basierend auf den Herleitungen des vorhergehenden Abschnittes \ref{buch:rekursion:section:hypergeometrische-funktion}, werden im nachfolgenden Abschnitt nochmals die Resultate
-beschrieben.
+Basierend auf den Herleitungen des Abschnittes \ref{buch:rekursion:section:hypergeometrische-funktion} 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 Anwendung der allgemein definierten Funktion $\mathstrut_pF_q$.
+Als Grundlage der umgesetzten Algorithmen dient die hypergeometrische Funktion $\mathstrut_0F_1$. Diese ist ein Speziallfall der allgemein definierten Funktion $\mathstrut_pF_q$.
\begin{definition}
\label{0f1:math:qFp:def}
@@ -42,7 +41,8 @@ Angewendet auf die Funktion $\mathstrut_pF_q$ ergibt sich für $\mathstrut_0F_1$ \mathstrut_0F_1
\biggl(
\begin{matrix}
- \\-
+ \text{---}
+ \\\
b_1
\end{matrix}
;
@@ -58,9 +58,9 @@ Angewendet auf die Funktion $\mathstrut_pF_q$ ergibt sich für $\mathstrut_0F_1$ -\subsection{Airy Funktion
+\subsection{Airy-Funktion
\label{0f1:subsection:airy}}
-Die 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}.
+Die Funktion $\operatorname{Ai}(x)$ und die verwandte Funktion $\operatorname{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}
@@ -69,12 +69,12 @@ Die Funktion Ai(x) und die verwandte Funktion Bi(x) werden als Airy-Funktion bez heisst die {\em Airy-Differentialgleichung}.
\end{definition}
-Die Airy Funktion lässt sich auf verschiedene Arten darstellen.
-Als hypergeometrische Funktion berechnet, ergibt sich wie in Abschnitt \ref{buch:differentialgleichungen:section:hypergeometrisch} hergeleitet, folgende Lösungen der Airy-Differentialgleichung zu den Anfangsbedingungen $Ai(0)=1$ und $Ai'(0)=0$, sowie $Bi(0)=0$ und $Bi'(0)=0$.
+Die Airy-Funktion lässt sich auf verschiedene Arten darstellen.
+Als hypergeometrische Funktion berechnet, ergeben sich wie in Abschnitt \ref{buch:differentialgleichungen:section:hypergeometrisch} hergeleitet, folgende Lösungen der Airy-Differentialgleichung zu den Anfangsbedingungen $\operatorname{Ai}(0)=1$ und $\operatorname{Ai}'(0)=0$, sowie $\operatorname{Bi}(0)=0$ und $\operatorname{Bi}'(0)=1$:
\begin{align}
\label{0f1:airy:hypergeometrisch:eq}
-Ai(x)
+\operatorname{Ai}(x)
=&
\sum_{k=0}^\infty
\frac{1}{(\frac23)_k} \frac{1}{k!}\biggl(\frac{x^3}{9}\biggr)^k
@@ -83,7 +83,7 @@ Ai(x) \begin{matrix}\text{---}\\\frac23\end{matrix};\frac{x^3}{9}
\biggr).
\\
-Bi(x)
+\operatorname{Bi}(x)
=&
\sum_{k=0}^\infty
\frac{1}{(\frac43)_k} \frac{1}{k!}\biggl(\frac{x^3}{9}\biggr)^k
@@ -95,7 +95,6 @@ x\cdot\mathstrut_0F_1\biggl( \qedhere
\end{align}
-Um die Stabilität der Algorithmen zu $\mathstrut_0F_1$ zu überprüfen, wird in diesem speziellem Fall die Airy Funktion $Ai(x)$ \eqref{0f1:airy:hypergeometrisch:eq}
-benutzt.
+Um die Stabilität der Algorithmen zu $\mathstrut_0F_1$ zu überprüfen, wird in dieser Arbeit die Airy Funktion $\operatorname{Ai}(x)$ benutzt.
diff --git a/buch/papers/0f1/teil2.tex b/buch/papers/0f1/teil2.tex index 15a1c44..fdcb0fc 100644 --- a/buch/papers/0f1/teil2.tex +++ b/buch/papers/0f1/teil2.tex @@ -6,12 +6,12 @@ \section{Umsetzung
\label{0f1:section:teil2}}
\rhead{Umsetzung}
-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.
+Zur Umsetzung wurden drei verschiedene Ansätze gewählt, die in vollständiger Form auf Github \cite{0f1:code} zu finden sind. 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-Library 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}.
+Die naheliegendste Lösung ist die Programmierung der Potenzreihe
\begin{align}
\label{0f1:umsetzung:0f1:eq}
@@ -23,40 +23,84 @@ Die naheliegendste Lösung ist die Programmierung der Potenzreihe. Allerdings is \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}}
+ + \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
+Eine weitere Variante zur Berechnung von $\mathstrut_0F_1(;c;z)$ ist die Umsetzung als Kettenbruch.
+Der Vorteil einer Umsetzung als Kettenbruch gegenüber der Potenzreihe ist die schnellere Konvergenz.
+
+\subsubsection{Grundlage}
+Ein endlicher Kettenbruch \cite{0f1:wiki-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}}}
+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 sind.
-Die Kurzschreibweise für einen allgemeinen Kettenbruch ist
+
+\subsubsection{Rekursionsbeziehungen und Kettenbrüche}
+Wenn es eine Relation analytischer Funktion $f_i(z)$ hat, dann gibt es einen Kettenbruch für das Verhältnis $\frac{f_i(z)}{f_{i-1}(z)}$ \cite{0f1:wiki-fraction}.
+Nimmt man die Gleichung
+\begin{equation*}
+ f_{i-1} - f_i = k_i z f_{i+1},
+\end{equation*}
+wo $f_i$ analytische Funktionen sind und $i > 0$ ist, sowie $k_i$ konstant.
+Ergibt sich der Zusammenhang
+\begin{equation*}
+ \cfrac{f_i}{f_{i-1}} = \cfrac{1}{1+k_iz\cfrac{f_{i+1}}{f_i}}.
+\end{equation*}
+Geht man einen Schritt weiter und nimmt für $g_i = \frac{f_i}{f_{i-1}}$ an, kommt man zur Formel
\begin{equation*}
- a_0 + \frac{a_1|}{|b_1} + \frac{a_2|}{|b_2} + \frac{a_3|}{|b_3} + \cdots
+ g_i = \cfrac{1}{1+k_izg_{i+1}}.
\end{equation*}
-\cite{0f1:wiki-kettenbruch}.
-Angewendet auf die Funktion $\mathstrut_0F_1$ bedeutet dies \cite{0f1:wiki-fraction}:
+Setzt man dies nun für $g_1$ in den Bruch ein, ergibt sich
\begin{equation*}
+ g_1 = \cfrac{f_1}{f_0} = \cfrac{1}{1+k_izg_2} = \cfrac{1}{1+\cfrac{k_1z}{1+k_2zg_3}} = \cdots
+\end{equation*}
+Repetiert man dies unendlich, erhält man einen Kettenbruch in der Form:
+\begin{equation}
+ \label{0f1:math:rekursion:eq}
+ \cfrac{f_1}{f_0} = \cfrac{1}{1+\cfrac{k_1z}{1+\cfrac{k_2z}{1+\cfrac{k_3z}{\cdots}}}}.
+\end{equation}
+
+\subsubsection{Rekursion für $\mathstrut_0F_1$}
+Angewendet auf die Potenzreihe
+\begin{equation}
+ \label{0f1:math:potenzreihe:0f1:eq}
\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}
+kann durch Substitution bewiesen werden, dass
+\begin{equation*}
+ \mathstrut_0F_1(;c-1;z) - \mathstrut_0F_1(;c;z) = \frac{z}{c(c-1)} \cdot \mathstrut_0F_1(;c+1;z)
+\end{equation*}
+eine Relation dazu ist.
+Wenn man für $f_i$ und $k_i$ die Annahme
+\begin{align*}
+ f_i =& \mathstrut_0F_1(;c+i;z)\\
+ k_i =& \frac{1}{(c+i)(c+i-1)}
+\end{align*}
+trifft und in die Formel \eqref{0f1:math:rekursion:eq} einsetzt, erhält man:
+\begin{equation*}
+ \cfrac{\mathstrut_0F_1(;c+1;z)}{\mathstrut_0F_1(;c;z)} = \cfrac{1}{1+\cfrac{\cfrac{z}{c(c+1)}}{1+\cfrac{\cfrac{z}{(c+1)(c+2)}}{1+\cfrac{\cfrac{z}{(c+2)(c+3)}}{\cdots}}}}.
\end{equation*}
-Umgeformt ergibt sich folgender Kettenbruch
+
+\subsubsection{Algorithmus}
+Da mit obigen Formeln nur ein Verhältnis zwischen $ \frac{\mathstrut_0F_1(;c+1;z)}{\mathstrut_0F_1(;c;z)}$ berechnet wurde, braucht es weitere Relationen um $\mathstrut_0F_1(;c;z)$ zu erhalten.
+So ergeben ähnliche Relationen nach Wolfram Alpha \cite{0f1:wolfram-0f1} den Kettenbruch
\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 (siehe: Listing \ref{0f1:listing:kettenbruchIterativ}) umgesetzt wurde.
-\cite{0f1:wolfram-0f1}
+der als Code (Listing \ref{0f1:listing:kettenbruchIterativ}) umgesetzt wurde.
+
\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 \cite{0f1:kettenbrueche} zu finden.
\subsubsection{Herleitung}
Ein Näherungsbruch in der Form
@@ -68,7 +112,7 @@ lässt sich zu \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:
+Dies lässt sich auch durch die Matrizenschreibweise
\begin{equation*}
\begin{pmatrix}
A_k\\
@@ -88,11 +132,12 @@ Dies lässt sich auch durch die folgende Matrizenschreibweise ausdrücken: \end{pmatrix}.
%\label{0f1:math:rekursionsformel:herleitung}
\end{equation*}
+ausdrücken.
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:
+an, ergibt sich die Matrixdarstellungen:
\begin{align*}
\begin{pmatrix}
@@ -116,7 +161,7 @@ an, ergibt sich folgende Matrixdarstellungen: \begin{pmatrix}
b_k\\
a_k
- \end{pmatrix}
+ \end{pmatrix}.
\end{align*}
Nach vollständiger Induktion ergibt sich für den Schritt $k$, die Matrix
\begin{equation}
@@ -135,15 +180,15 @@ 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
+Und schlussendlich kann der Näherungsbruch
\[
\frac{A_k}{B_k}
\]
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}
+\subsubsection{Algorithmus}
+Die Berechnung von $A_k, B_k$ gemäss \eqref{0f1:math:matrix:ende:eq} kann man auch ohne die Matrizenschreibweise \cite{0f1:kettenbrueche} aufschreiben:
\begin{itemize}
\item Startbedingungen:
\begin{align*}
@@ -162,10 +207,10 @@ 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}$
+Näherungsbruch: \qquad$\displaystyle\frac{A_k}{B_k}$.
\end{itemize}
-Ein grosser Vorteil dieser Umsetzung als Rekursionsformel ist \ref{0f1:listing:kettenbruchRekursion}, dass im Vergleich zum Code \ref{0f1:listing:kettenbruchIterativ} eine Division gespart werden kann und somit weniger Rundungsfehler entstehen können.
+Ein grosser Vorteil dieser Umsetzung als Rekursionsformel \eqref{0f1:listing:kettenbruchRekursion} ist, dass im Vergleich zum Code (Listing \ref{0f1:listing:kettenbruchIterativ}) eine Division gespart werden kann und somit weniger Rundungsfehler entstehen können.
%Code
\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 72b1b21..147668a 100644 --- a/buch/papers/0f1/teil3.tex +++ b/buch/papers/0f1/teil3.tex @@ -7,58 +7,53 @@ \label{0f1:section:teil3}}
\rhead{Resultate}
Im Verlauf dieser Arbeit hat sich gezeigt,
-das ein einfacher mathematischer Algorithmus zu implementieren gar nicht so einfach ist.
+das einen einfachen mathematischen 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 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}.
+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 \cite{0f1:wolfram-0f1} ab.
\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.
+Es zeigt sich in Abbildung \ref{0f1:ausblick:plot:airy:konvergenz}, dass nach drei Iterationen ($k = 3$) die Funktionen genaue Resultate im Bereich von $-2$ bis $2$ liefert. Ebenso kann festgestellt werden, dass der Kettenbruch schneller konvergiert und im positiven Bereich mit der Referenzfunktion $\operatorname{Ai}(x)$ übereinstimmt. Da die Rekursionsformel eine Abwandlung des Kettenbruches ist, verhalten sich die Funktionen in diesem Fall gleich.
-Erst wenn mehrerer Iterationen 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 \ref{0f1:ausblick:plot:konvergenz:positiv}. 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\eqref{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.
+Erst wenn mehrerer Iterationen gerechnet werden, ist wie in Abbildung \ref{0f1:ausblick:plot:konvergenz:positiv} dargestellt, der Kettenbruch den anderen zwei Algorithmen bezüglich Konvergenz überlegen. Bei der Rekursionsformel muss beachtet werden, dass sie zwar erst nach 35 Approximationen gänzlich konvergiert, allerdings nach 27 Iterationen sich nicht mehr gross verändert.
+
+Ist $z$ negativ, wie in Abbildung \ref{0f1:ausblick:plot:konvergenz:negativ}, führt dies aufgrund des Vorzeichens zu alternierenden Termen. So steigt bei allen Algorithmen zuerst die Differenz zum erwarteten Endwert. Erst nach genügend Iterationen sind die Terme so klein, dass sie das Endresultat nicht mehr signifikant beeinflussen. Während die Potenzreihe zusammen mit dem Kettenbruch nach 34 Approximationen konvergiert, braucht die Rekursionsformel noch zwei Iterationen mehr.
-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 \eqref{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 \eqref{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 Abbild \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 Potenz von z, 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.
+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 (Listing \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 (Listing \ref{0f1:listing:potenzreihe}) das Problem hat, dass je mehr Terme berechnet werden, desto schneller wächst die Fakultät im Nenner. Dies führt zu einer Bereichsüberschreitung des \verb+double+ Bereiches \cite{0f1:double}, der spätesten ab $k=167$ eintritt. Schlussendlich gibt das Unterprogramm das Resultat \verb+-nan(ind)+ zurück.
+Die Rekursionformel \eqref{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 Konvergenz zu gewährleisten, muss wie in Abbildung \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 Potenz von $z$, was zum Phänomen der Auslöschung \cite{0f1:SeminarNumerik} führt. Schön zu beobachten ist dies in der Abbildung \ref{0f1:ausblick:plot:airy:stabilitaet} mit der Airy-Funktion als Test. So sind nach Abbildung \ref{0f1:ausblick:plot:airy:stabilitaet} die Potenzreihe, der Kettenbruch, als auch die Rekursionsformel, bis ungefähr $\frac{-15^3}{9}$ stabil. Dies macht auch Sinn, da alle Algorithmen auf der gleichen mathematischen Grundlage basieren. Danach verhält sich allerdings die Instabilität unterschiedlich. Diese programmiertechnischen Unterschiede sind auch in Abbildung \ref{0f1:ausblick:plot:konvergenz:positiv} und \ref{0f1:ausblick:plot:konvergenz:negativ} festzustellen.
\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$.
+ \caption{Konvergenz nach drei Iterationen, dargestellt anhand der Airy Funktion zu den Anfangsbedingungen $\operatorname{Ai}(0)=1$ und $\operatorname{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.
+ \caption{Konvergenz mit positivem $z$; Logarithmisch dargestellter absoluter Fehler.
\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 mit negativem $z$; Logarithmisch dargestellter absoluter Fehler.
\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 Referenz Funktion $Ai(x)$.
+ \caption{Stabilität der drei Algorithmen verglichen mit der Referenz Funktion $\operatorname{Ai}(x)$.
\label{0f1:ausblick:plot:airy:stabilitaet}}
\end{figure}
|