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/teil2.tex | 155 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 129 insertions(+), 26 deletions(-) (limited to 'buch/papers/0f1/teil2.tex') 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 -- 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/teil2.tex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'buch/papers/0f1/teil2.tex') 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/teil2.tex | 354 +++++++++++++++++++++++----------------------- 1 file changed, 177 insertions(+), 177 deletions(-) (limited to 'buch/papers/0f1/teil2.tex') 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 -- 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/teil2.tex | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) (limited to 'buch/papers/0f1/teil2.tex') 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 -- cgit v1.2.1 From a961142ba09e0e9a962aaba4d90e1613e0ff97b0 Mon Sep 17 00:00:00 2001 From: Fabian <@> Date: Fri, 12 Aug 2022 15:06:08 +0200 Subject: 1. Ueberarbeitung --- buch/papers/0f1/teil2.tex | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) (limited to 'buch/papers/0f1/teil2.tex') diff --git a/buch/papers/0f1/teil2.tex b/buch/papers/0f1/teil2.tex index 9269961..15a1c44 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. -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. +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-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. 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} @@ -34,23 +34,22 @@ 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. +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 \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\cite{0f1:wiki-fraction}: +\cite{0f1:wiki-kettenbruch}. +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*} -Nach allen Umformungen ergibt sich folgender, irregulärer Kettenbruch \eqref{0f1:math:kettenbruch:0f1:eq} +Umgeformt ergibt sich folgender 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 \ref{0f1:listing:kettenbruchIterativ} umgesetzt wurde. +der als Code (siehe: Listing \ref{0f1:listing:kettenbruchIterativ}) umgesetzt wurde. \cite{0f1:wolfram-0f1} \lstinputlisting[style=C,float,caption={Iterativ umgesetzter Kettenbruch.},label={0f1:listing:kettenbruchIterativ}, firstline=8]{papers/0f1/listings/kettenbruchIterativ.c} @@ -138,7 +137,7 @@ Nach vollständiger Induktion ergibt sich für den Schritt $k$, die Matrix \end{equation} Und Schlussendlich kann der Näherungsbruch \[ -\frac{Ak}{Bk} +\frac{A_k}{B_k} \] berechnet werden. @@ -166,7 +165,7 @@ B_{k+1} &= B_{k-1} \cdot b_k + B_k \cdot a_k 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. +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. %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 -- cgit v1.2.1