From c5fcf7179a83ef65c86c6a4a390029149e518649 Mon Sep 17 00:00:00 2001 From: Franciszek Malinka Date: Tue, 5 Oct 2021 21:49:54 +0200 Subject: Duzy commit ze smieciami --- Semestr 3/anm/pracownia1/doc/sprawozdanie.pdf | Bin 184895 -> 0 bytes Semestr 3/anm/pracownia1/doc/sprawozdanie.tex | 464 - Semestr 3/anm/pracownia1/prog/program.html | 16056 ------------------------ Semestr 3/anm/pracownia1/prog/program.ipynb | 2042 --- Semestr 3/anm/pracownia1/prog/program.jl | 247 - Semestr 3/anm/pracownia1/zadanie.zip | Bin 293840 -> 0 bytes 6 files changed, 18809 deletions(-) delete mode 100644 Semestr 3/anm/pracownia1/doc/sprawozdanie.pdf delete mode 100644 Semestr 3/anm/pracownia1/doc/sprawozdanie.tex delete mode 100644 Semestr 3/anm/pracownia1/prog/program.html delete mode 100644 Semestr 3/anm/pracownia1/prog/program.ipynb delete mode 100644 Semestr 3/anm/pracownia1/prog/program.jl delete mode 100644 Semestr 3/anm/pracownia1/zadanie.zip (limited to 'Semestr 3/anm/pracownia1') diff --git a/Semestr 3/anm/pracownia1/doc/sprawozdanie.pdf b/Semestr 3/anm/pracownia1/doc/sprawozdanie.pdf deleted file mode 100644 index 17e700b..0000000 Binary files a/Semestr 3/anm/pracownia1/doc/sprawozdanie.pdf and /dev/null differ diff --git a/Semestr 3/anm/pracownia1/doc/sprawozdanie.tex b/Semestr 3/anm/pracownia1/doc/sprawozdanie.tex deleted file mode 100644 index c485314..0000000 --- a/Semestr 3/anm/pracownia1/doc/sprawozdanie.tex +++ /dev/null @@ -1,464 +0,0 @@ -\documentclass[12pt]{extarticle} -\setlength{\emergencystretch}{2em} -\usepackage{datetime} -\usepackage[utf8]{inputenc} -\usepackage[T1]{fontenc} -\usepackage{ae,aecompl} -\usepackage[activate={true,nocompatibility},final,tracking=true,kerning=true,spacing=true,stretch=10,shrink=10]{microtype} -\frenchspacing -\usepackage[utf8]{inputenc} -\usepackage[polish]{babel} -%%% fix for \lll -\let\babellll\lll -\let\lll\relax -\usepackage{geometry} -\newgeometry{vmargin={25mm}, hmargin={25mm,25mm}} -\usepackage[]{algorithm2e} - - -\usepackage{enumitem} -\usepackage{graphicx} -\usepackage[normalem]{ulem} -\usepackage{tikz} - -\usetikzlibrary{external} -\tikzexternalize[prefix=tikz/] - -\usetikzlibrary{arrows.meta} -\usetikzlibrary{matrix, arrows} -\usepackage{program} -\usepackage{amsfonts} -\usepackage{amssymb} -%%% fix for \lll -\let\mathlll\lll -\let\lll\babellll - -\usepackage{amsmath} -\usepackage{amsthm} -\usepackage{tikz-cd} -\usepackage{float} -\usepackage{hyperref} -\usepackage{multicol} -\usepackage{mathtools} - -\usepackage{array} -\usepackage{wrapfig} -\usepackage{multirow} -\usepackage{tabularx} -\newcommand{\RR}{\mathbb{R}} -\newcommand{\CC}{\mathbb{C}} -\DeclarePairedDelimiter\abs{\lvert}{\rvert}% - -\newcommand{\fC}{{\mathfrak C}} -\newcommand{\cM}{{\mathcal M}} -\newcommand{\cC}{{\mathcal C}} -\newcommand{\cD}{{\mathcal D}} -\newcommand{\bN}{{\mathbf{N}}} -\newcommand{\bR}{{\mathbf{R}}} -\newcommand{\bZ}{{\mathbf{Z}}} -\newcommand{\bF}{{\mathbf{F}}} -\newcommand{\bQ}{{\mathbf{Q}}} -\newcommand{\bC}{{\mathbf{C}}} -\newcommand{\cA}{{\mathcal A}} -\newcommand{\cO}{{\mathcal O}} -\newcommand{\cF}{{\mathcal F}} -\newcommand{\cB}{{\mathcal B}} -\newcommand{\Ob}{{\mathrm{Ob}}} -\newcommand{\topl}{\mathcal T} -\newcommand{\Set}{{\mathrm{Set}}} -\newcommand{\Grp}{{\mathrm{Grp}}} -\newcommand{\AbGrp}{{\mathrm{AbGrp}}} -\newcommand{\Mod}{{\mathrm{Mod}}} -\newcommand{\Ring}{{\mathrm{Ring}}} -\newcommand{\Vect}{{\mathrm{Vect}}} -\newcommand{\Alg}{{\mathrm{Alg}}} -\newcommand{\restr}{\mathord{\upharpoonright}} -\newcommand{\liff}{\mathrel{\leftrightarrow}} -\newcommand{\limplies}{\mathrel{\rightarrow}} -\newcommand{\set}[2]{\left\{{#1} \mid {#2} \right\} } -\newcommand{\fset}[1]{\left\{{#1}\right\}} -\newcommand{\meet}{\mathbin{\wedge}} -\newcommand{\join}{\mathbin{\vee}} -\newcommand{\biglor}{\bigvee} -\newcommand{\bigland}{\bigwedge} - - -\DeclareMathOperator{\round}{{round}} -\DeclareMathOperator{\cl}{{cl}} -\DeclareMathOperator{\Id}{{Id}} -\DeclareMathOperator{\id}{{id}} -\DeclareMathOperator{\Aut}{{Aut}} -\DeclareMathOperator{\End}{{End}} -\DeclareMathOperator{\Ult}{{Ult}} -\DeclareMathOperator{\Homeo}{{Homeo}} -\DeclareMathOperator{\dom}{{dom}} -\DeclareMathOperator{\rng}{{rng}} -\DeclareMathOperator{\Core}{{Core}} -\DeclareMathOperator{\Hom}{{Hom}} -\DeclareMathOperator{\Stab}{{Stab}} -\DeclareMathOperator{\dcl}{{dcl}} -\DeclareMathOperator{\acl}{{acl}} -\DeclareMathOperator{\tp}{{tp}} -\DeclareMathOperator{\characteristic}{{char}} - - - -\newtheorem{twr}{Twierdzenie}[section] -\newtheorem{hip}[twr]{Hipoteza} -\newtheorem{pyt}[twr]{Pytanie} -\newtheorem{problem}[twr]{Problem} -\newtheorem{lem}[twr]{Lemat} -\newtheorem{fkt}[twr]{Fakt} -\newtheorem{wnsk}[twr]{Wniosek} -\newtheorem{stw}[twr]{Stwierdzenie} -\newtheorem{cw}[twr]{Ćwiczenie} - -\theoremstyle{remark} -\newtheorem{uwg}[twr]{Uwaga} -\theoremstyle{definition} -\newtheorem{dfn}[twr]{Definicja} -\newtheorem*{rozw}{Rozwiązanie} -\newtheorem*{sbclm}{Podclaim} -\newtheorem*{clm*}{Claim} -\newtheorem{pd}[twr]{Przykład} -\newcounter{claimcounter}[twr] -\newenvironment{clm}{\stepcounter{claimcounter}{\noindent {\textbf{Claim}} \theclaimcounter:}}{} -\newenvironment{clmproof}[1][\proofname]{\proof[#1]\renewcommand{\qedsymbol}{$\square$(claim)}}{\endproof} -\newenvironment{sbclmproof}[1][\proofname]{\proof[#1]\renewcommand{\qedsymbol}{$\square$(subclaim)}}{\endproof} - -\newcommand{\xqed}[1]{% - \leavevmode\unskip\penalty9999 \hbox{}\nobreak\hfill - \quad\hbox{\ensuremath{#1}}} -\theoremstyle{definition} -\newtheorem{zad}[twr]{Zadanie} - -\title{Pracownia z analizy numerycznej \\ - \large Sprawozdanie do zadania \textbf{P1.10} \\ - Prowadzący: dr Rafał Nowak} -\author{Franciszek Malinka, Kacper Solecki} -\date{Wrocław, Listopad 2020} - -\begin{document} - -\maketitle - -\section{Wstęp} -Funkcje trygonometryczne mają szerokie zastosowania w matematyce, informatyce, inżynierii, architekturze, produkcji muzyki i wielu innych dziedzinach. Nietrudno zatem dojść do wniosku, że ich efektywne i dokładne obliczanie jest problemem bardzo ważnym w kontekście tych zagadnień. - -W niniejszym sprawozdaniu przyjrzymy się dwóm opracowanym przez nas metodom obliczania wybranych funkcji trygonometrycznych używając jednie najprostszych operacji arytmetycznych ($+$, $-$, $*$, $/$, ale też przesunięcia bitowe), ze szczególnym naciskiem na dokładne obliczanie funkcji $\sin$ oraz $\cos$, również w dziedzinie liczb zespolonych. - -Proponowane przez nas metody mają docelowo dawać poprawne obliczenia dla podwójnej precyzji obliczeń, jednakże testy numeryczne przeprowadzamy używając zmiennych typu \texttt{BigFloat} w języku \texttt{Julia} (w którym implementowaliśmy nasze rozwiązania). Typ ten oferuje dowolną dokładność obliczeń. Wyniki naszych funkcji porównujemy z funkcjami bibliotecznymi języka i zakładamy, że dają one dokładne wyniki. - -\section{Algorytm CORDIC} -\subsection{Opis algorytmu} - -Pierwszą proponowaną przez nas metodą obliczania funkcji $\sin$ oraz $\cos$ jest Algorytm CORDIC (\textbf{CO}ordinate \textbf{R}otation \textbf{DI}gital \textbf{C}omputer). Algorytm ten został stworzony z myślą o komputerach o niskiej mocy obliczeniowej, ale również o możliwości ''włożenia'' algorytmu w hardware (tj. pozwala tworzyć mało skomplikowane układy bramek logicznych, które obliczają funkcje trygonometryczne). Jak się przekonamy, proces iteracyjny algorytmu korzysta jedynie z dodawania, odejmowania, przesunięć bitowych i wartości obliczonych podczas preprocessingu oraz nie wykorzystuje liczb zmiennoprzecinkowych. - -Zacznijmy od wprowadzenia zarysu działania algorytmu. Zapomnijmy na razie o analizie numerycznej i przenieśmy się do świata algebry liniowej. Wyobraźmy sobie, że mamy wydajny system który obliczy wektor $(x_r, y_r)$ jako wynik obrotu danego wektora $(x_0, y_0)$ o dany kąt $\theta$ wokół środka układu współrzędnych: -\begin{align} - x_r = x_0\cos\theta - y_0\sin\theta \\ - y_r = x_0\sin\theta + y_0\cos\theta -\end{align} - -Jeśli za $(x_0, y_0)$ weźmiemy punkt $(1, 0)$, to po obrocie dostaniemy: -\begin{align*} - x_r = \cos\theta \\ - y_r = \sin\theta -\end{align*} -Zatem używając obrotu umiemy policzyć wartości funkcji $\cos$ oraz $\sin$. - -Zapiszmy równania $(1), (2)$ w formie macierzowej: -\begin{align} - \begin{bmatrix} - x_r \\ y_r - \end{bmatrix} - = \begin{bmatrix} - \cos\theta & -\sin\theta \\ - \sin\theta & \cos\theta - \end{bmatrix} - \begin{bmatrix} - x_0 \\ y_0 - \end{bmatrix} - = \cos\theta - \begin{bmatrix} - 1 & -\tan\theta \\ - \tan\theta & 1 - \end{bmatrix} - \begin{bmatrix} - x_0 \\ y_0 - \end{bmatrix} -\end{align} - -Powyższa równość pokazuje, że do obliczenia naszego wektora wynikowego (przy założeniu, że znamy wartości $\tan\theta$ oraz $\cos\theta$) wystarczą jedynie 4 mnożenia i kilka dodawań lub odejmowań. Chcielibyśmy pozbyć się tych mnożeń. Skorzystamy tutaj z dwóch obserwacji: -\begin{itemize} - \item Każdy kąt $\theta\in [0^{\circ}, 90^{\circ}]$ możemy zapisać jako sumę \textbf{wcześniej ustalonych}, mniejszych (co do modułu) kątów $\theta_i, i \in \{0, ..., n\}$: - \begin{align} - \theta = \sum_{i=0}^n \sigma_i\theta_i, \; \sigma_i \in \{-1, 1\} - \end{align} - Dla przykładu, kąt $57.353^{\circ}$ jest sumą kątów - $45^{\circ}, 26.565^{\circ}, -14.03^{\circ}$ (dobór tych kątów jest nieprzypadkowy, o czym się zaraz przekonamy). Jeśli $\theta$ nie należy do zadanego przez nas przedziału, to możemy ten kąt zmienić korzystając ze wzorów redukcyjnych (o tym więcej w \textsection3). - \item Jeśli nasze kąty $\theta_i$ będą dobrane tak, że $\tan\theta_i = 2^{-i}$, to mnożenie przez $\tan\theta_i$ jest niczym innym jak przesunięciem bitowym (w liczbach całkowitych). Dodatkowo okazuje się, że dowolny kąt nie większy niż $90^{\circ}$ da się przybliżyć sumą tak dobranych kątów $\theta_i$, więc da się tymi kątami osiągnąć cel założony w pierwszym punkcie. Dodatkowo im więcej takich kątów wybierzemy, tym dokładniejsze będzie to przybliżenie. -\end{itemize} - -Pozostały nam jeszcze mnożenia przez czynnik $\cos\theta$ (który nazwiemy przyrostem). Jeżeli to zignorujemy, to otrzymana rotacja będzie faktycznie obróceniem wektora o kąt $\theta$, ale z dodatkowym przeskalowaniem wektora. - -% \begin{center} -% \begin{tikzpicture} -% \draw [<->,thick] (0,6) node (yaxis) [above] {$y$} -% |- (8,0) node (xaxis) [right] {$x$}; -% \draw [->, thick] (0, 0) -- (6, 2) node (v1) [right] {$(x_0, y_0)$} -% \draw [->, cm={cos(45) ,-sin(45) ,sin(45) ,cos(45) ,(0 cm, 0 cm)}] (0, 0) -- (6,2) -% % \draw[black, thick, ->] (0,0) -- (10,0); -% % \draw[black, thick, ->] (0,0) -- (0,8); -% \end{tikzpicture} -% \end{center} - -Przyjrzyjmy się jak dokładnie będzie wyglądać nasz przyrost, jeśli zastosujemy zaproponowane przez nas punkty do obliczania obrotu. Powiedzmy, że chcemy obrócić wejściowy wektor o kąt $57.353^{\circ} = 45^{\circ} + 26.565^{\circ} - 14.03^{\circ}$. Wartości funkcji $\tan$ tych kątów są odwrotnościami potęg dwójki, zatem te kąty spełniają nasze założenie. Pierwsza rotacja o $45^{\circ}$ daje: -\begin{align} - \begin{bmatrix} - x_1 \\ y_1 - \end{bmatrix} - = \cos 45^{\circ} - \begin{bmatrix} - 1 & -1 \\ - 1 & 1 - \end{bmatrix} - \begin{bmatrix} - x_0 \\ y_0 - \end{bmatrix} -\end{align} -Druga rotacja daje: -\begin{align} - \begin{bmatrix} - x_2 \\ y_2 - \end{bmatrix} - = \cos 26.565^{\circ} - \begin{bmatrix} - 1 & -2^{-1} \\ - 2^{-1} & 1 - \end{bmatrix} - \begin{bmatrix} - x_1 \\ y_1 - \end{bmatrix} -\end{align} -Trzecia rotacja: -\begin{align} - \begin{bmatrix} - x_3 \\ y_3 - \end{bmatrix} - = \cos(-14.03^{\circ}) - \begin{bmatrix} - 1 & 2^{-2} \\ - -2^{-2} & 1 - \end{bmatrix} - \begin{bmatrix} - x_2 \\ y_2 - \end{bmatrix} -\end{align} -Łącząc te równania razem dostajemy: -\begin{align} - \begin{bmatrix} - x_3 \\ y_3 - \end{bmatrix} - = \cos 45^{\circ}\cos 26.565^{\circ}\cos(-14.03^{\circ}) - \begin{bmatrix} - 1 & -1 \\ - 1 & 1 - \end{bmatrix} - \begin{bmatrix} - 1 & -2^{-1} \\ - 2^{-1} & 1 - \end{bmatrix} - \begin{bmatrix} - 1 & 2^{-2} \\ - -2^{-2} & 1 - \end{bmatrix} - \begin{bmatrix} - x_0 \\ y_0 - \end{bmatrix} -\end{align} - -Zauważmy, że dzięki parzystości funkcji $\cos$ znak poszczególnych kątów nie ma znaczenia dla wartości przyrostu. Z tego snujemy wniosek, że przy ustalonej liczbie iteracji przyrost nie zależy od wyboru kąta $\theta$. Możemy go zatem policzyć i wziąć go pod uwagę dopiero na koniec obliczeń. -\begin{align} - P = \cos 45^{\circ}\cdot\cos 26.565^{\circ}\cdot\cos 14.03^{\circ}\cdot\ldots \approx 0.6072 -\end{align} -W takim razie, pomijając przyrost $P$ otrzymujemy następujący proces iteracyjny algorytmu CORDIC: -\begin{align} - x_{i + 1} & = x_{i} - \sigma_i 2^{-i}y_i \\ - y_{i + 1} & = y_i + \sigma_i 2^{-i}y_i -\end{align} - -Pozostaje jedynie problem znajdowania znaków $\sigma_i$ przy kątach $\theta_i$. Okazuje się jednak, że możemy to robić w bardzo prosty sposób. Niech $z_0 = \theta, \sigma_0 = 1$. W każdym kroku iteracyjnym znak $\sigma_{i + 1}$ dobieramy w następujący sposób -- niech $z_{i}$ będzie równe $\theta - \sum_{k=0}^{i - 1}\sigma_k\theta_k$ (czyli $z_i$ mówi jaki jeszcze nam został kąt do obrócenia, potencjalnie obróciliśmy już za dużo, wtedy $z_i < 0$). Wtedy $\sigma_{i + 1} = sgn(z_i)$. Mamy też $z_{i + 1} = z_{i} - \sigma_i\theta_i = z_{i} - \sigma_i\arctan{2^{i}}$. Błąd przybliżenia po $n$ iteracjach możemy wtedy łatwo policzyć ze wzoru -\begin{align} - \theta_{error} = \z_n = \theta - \sum_{i=0}^n\sigma_i \theta_i -\end{align} - -Zbierając wszystko razem, proces iteracyjny algorytmu CORDIC wygląda następująco: -\begin{align*} - x_{i + 1} & = x_{i} - \sigma_i 2^{-i}y_i \\ - y_{i + 1} & = y_i + \sigma_i 2^{-i}y_i \\ - z_{i + 1} & = z_i - \sigma_i \arctan 2^{-1} -\end{align*} - -Kąty $\theta_i = \arctan{2^{-1}}$ możemy policzyć w preprocessingu i używać jako stałych. Wtedy rezultatem naszych obliczeń będzie $\cos\theta \approx P\cdot x_n$ oraz $\sin\theta \approx P\cdot y_n$. Dodatkowo, gdybyśmy przyjęli $x_0 = 1/P$, to pozbylibyśmy się nawet tego ostatniego mnożenia. - -Warto jeszcze zauważyć, że -\begin{align*} - \frac{1}{\cos(\arctan 2^{-i})} = \sqrt{1 + \frac{1}{2^{2i}}} -\end{align*} -Możemy ten fakt wykorzystać do dokładniejszego obliczania wartości $P$. - -Musimy jeszcze zauważyć, że algorytm działa jedynie dla kątów $\theta$ spełniających -\begin{align*} - \abs{\theta} \leq \sum_{i=0}^n\theta_i \approx 99.88^{\circ} -\end{align*} -Zatem dla kątów większych niż $90^{\circ}$ musimy skorzystać ze wzorów redukcyjnych, co dokłada pewnego błędu do naszego wyniku oraz powoduje konieczność wykonania kilku dodatkowych dzieleń i mnożeń. - -\subsection{Niespełniona obietnica} -We wstępie powiedzieliśmy, że algorytm będzie korzystał z dodawań, odejmowań i przesunięć bitowych, a do tego używał liczb całkowitych. Dzięki naszemu ustaleniu, że $\arctan\theta_i = 2^{-i}$, wszystkie mnożenia podczas iteracji naszego algorytmu to mnożenia przez potęgi dwójki. Jak możemy to wykorzystać? - -Ustalmy $M := 2^{K}$ dla pewnego $K$ (potem je wybierzemy). Teraz każdą spreprocessowaną -przez nas wartość $T$ (czyli $T$ jest kątem $\theta_i$ lub przyrostem $P$) przyjmiemy -$T := \round(M \cdot T)$. Chcąc policzyć wartości funkcji trygonometrycznych dla kąta $\theta$, -uruchomimy nas proces iteracyjny dla $x_0 = \round(M/P)$, $y_0 = 0$, $z_0 = \round(M\cdot\theta)$. -Zauważmy, że dzięki temu przeskalowaliśmy wszystkie obliczane przez nas wartości o stałą $M$ -i zaokrągliliśmy je po to, by móc pracować na liczbach całkowitych. To pozawala na wykorzystanie -przesunięć bitowych podczas mnożenia przez potęgi dwójki, dzięki czemu znacznie zwiększyliśmy -wydajność naszego algorytmu. Wtedy, po $n$ iteracjach naszego procesu mamy $\cos\theta \approx x_n/M$ -oraz $\sin\theta\approx y_n/M$ (już w arytmetyce zmiennoprzecinkowej). - -Zostało nam ustalić wartość $K$. Na pewno chcielibyśmy, aby $K$ było nie większe niż -długość mantysy. Ponadto algorytm ma być dostosowany do mało wydajnych maszyn, dlatego -w naszych analizach pracujemy przy użyciu \texttt{Int32}, zatem nie chcemy żeby $2^K\cdot T$ przekroczyło -zakres \texttt{Int32}. Jednakże kąty $\theta_i$ oraz wartość $P$ są niewielkie, zatem $K = 30$ będzie -odpowiednią wartością. - -\section{Wzór Taylora} -\subsection{Opis metody} -Zanim przejdziemy do opisu tej metody, przypomnijmy sobie pewną tożsamość trygonometryczną: -\begin{align} - \sin z = \sin (x + yi) = \sin x\cosh (y) + i\cos x\sinh(y) -\end{align} -Korzystając z tej tożsamości pozbywamy się konieczności pracowania z liczbami zespolonymi i możemy operować jedynie w zbiorze liczb rzeczywistych. - -W tej metodzie wykorzystamy znany analityczny wzór zwany wzorem Taylora. Korzystając z niego możemy wyprowadzić rozwinięcia funkcji trygonometrycznych: - -\begin{align*} - \sin x & = x - \frac{x^3}{3!} + \frac{x^5}{5!} - \frac{x^7}{7!} + \ldots \\ - \sinh x & = x + \frac{x^3}{3!} + \frac{x^5}{5!} + \frac{x^7}{7!} + \ldots \\ - \cos x & = 1 - \frac{x^2}{2!} + \frac{x^4}{4!} - \frac{x^6}{6!} + \ldots \\ - \cosh x & = 1 + \frac{x^2}{2!} + \frac{x^4}{4!} + \frac{x^6}{6!} + \ldots \\ -\end{align*} - -Obliczanie rozwinięć poszczególnych funkcji jest proste i wyabstrahowaliśmy je do jednej, generycznej funkcji \texttt{TalyorSeries}: -\begin{center} - \begin{algorithm}[H] - \SetAlgoLined - \KwData{x, parity, changeSign, M} - \KwResult{Obliczenie szeregu Taylora odpowiedniej funkcji trygonometrycznej w punkcie x dla jego pierwszych M niezerowych wyrazów} - result := 0\; - elem := 1\; - \If{parity = 1}{ - elem := x\; - } - i := parity + 1\; - \While{i $\le$ 2M + parity}{ - result := result + elem\; - elem := elem * changeSign * x * x / (i * (i + 1))\; - i := i + 2\; - } - \end{algorithm} -\end{center} - -Algorytm oblicza sumę $\sum_{n=0}^M\sigma_n\frac{x^n}{n!}$, gdzie $\sigma_i \in \{-1, 0, 1\}$. Wartość $\sigma_n$ zależy od wartości parametrów podanych w funkcji: gdzy \texttt{parity} jest równe $0$, wtedy mamy $\sigma_{2k + 1} = 0$, a gdy \texttt{parity} jest równe $0$ mamy $\sigma_{2k} = 0$. Odpowiada to odpowiednio szeregom $\cos x, \cosh x$ oraz $\sin x, \sinh x$. Od parametru \texttt{changeSign} zależy czy chcemy, aby kolejne niezerowe wyrazy obliczanego szeregu zmieniały znak (zmieniamy znak, gdy chcemy obliczać zwykłe funkcje trygonometryczne oraz nie zmieniamy gdy obliczamy funkcje hiperboliczne). - -To daje prostą możliwość obliczania pożądanych przez nas funkcji: - -\begin{align*} - \sin x & = \texttt{TaylorSeries}(x, 1, -1, M) \\ - \sinh x & = \texttt{TaylorSeries}(x, 1, 1, M) \\ - \cos x & = \texttt{TaylorSeries}(x, 0, -1, M) \\ - \cosh x & = \texttt{TaylorSeries}(x, 0, 1, M) -\end{align*} - -Zauważmy, że wzór Taylora nadaje się do przybliżania funkcji trygonometrycznych jedynie dla argumentów bliskich $0$. Na szczęście możemy sobie z tym poradzić korzystając ze znanych tożsamości trygonometrycznych oraz okresowości funkcji $\sin$ i $\cos$. Naszym celem przed obliczniem funkcji \texttt{TaylorSeries} będzie sprowadzenie argumentu do przedziału $[0, \pi/4]$, w którym wzór Taylora bardzo dobrze przybliża wartości funkcji trygonometrycznych. Oto tabela która przedstawia jak radzimy sobie z argumentami spoza tego przedziału: -\begin{center} - \begin{tabular}{ |p{4cm}||p{4cm}|p{4cm}| } - \hline - \multicolumn{3}{|c|}{Wzory redukcyjne} \\ - \hline - Warunek na $x$ & $\sin x$ & $\cos x$ \\ - \hline - $x < 0$ & $-\sin (-x)$ & $\cos (-x)$ \\ - $x \ge 2\pi$ & $\sin(x \mod 2\pi)$ & $\cos (x\mod 2\pi)$ \\ - $x > \pi$ & $-\sin(x - \pi)$ & $-\cos(x - \pi)$ \\ - $x > \pi/2$ & $\cos(x - \pi/2)$ & $-\sin(x - \pi/2)$ \\ - $x > \pi/4$ & $\cos(\pi/2 - x)$ & $\sin(\pi/2 - x)$ \\ - \hline - \end{tabular} - \\ -\vspace{0.5cm} -Tabela 2: błędy przy obliczaniu funkcji $\sin(x)$. -\end{center} - -Dla funkcji hiperbolicznych sposób jest prostszy: korzystamy z dwóch własności: -\begin{align*} - \sinh x & = 2\sinh(x/2)\cosh(x/2) \\ - \cosh x & = \cosh^2(x/2) + \sinh^2(x/2) -\end{align*} -Można by przypuszczać, że dla dużych $x$ błąd obliczania tych funkcji będzie duży. Jednakże okazuje się, że funkcje te bardzo szybko rosną i już dla $x = 1000$ wartości obu tych funkcji nie mieszczą się w zakresie \texttt{Float64}, zatem tak naprawdę wykonamy maksymalnie $15$ takich redukcji, co generuje dopuszczalnie mały błąd. - -\section{Analiza błędu} - -\subsection{Wyniki testów} -Dokładność naszych metod porównywaliśmy z funkcjami bibliotecznymi w języku \texttt{Julia}, które domyślnie obsługują obliczanie wartości funkcji trygonometrycznych dla liczb zespolonych. Zakładmy o tych funkcjach bibliotecznych, że dają poprawny wynik. - -Przeprowadziliśmy testy dokładności metody opartej na wzorze Taylora dla liczb rzeczywistych oraz dla liczb zespolonych oraz testy dla metody Taylora, w której nie używaliśmy wzorów redukcyjnych, lecz rozwijaliśmy wzór dopóki wystarczająco dobrze nie przybliżał wartości funkcji dla danego argumentu. Testy dla algorytmu CORDIC przeprowadziliśmy wyłącznie dla liczb rzeczywistych. - -Dla każdej metody przeprowadziliśmy trzy rodzaje testów, w każdym z nich losowaliśmy $10^8$ liczb z różnych przedziałów. Ze względu na podobieństwo funkcji $\sin$ i $\cos$ oraz z faktu, że często wzory redukcyjne powodują faktycznie obliczanie innej funkcji trygonometrycznej, testy przeprowadziliśmy wyłącznie dla funkcji $\sin$. Przedziały i wyniki testów przedstawione są w poniższej tabeli: - -\begin{center} -\resizebox{\textwidth}{!}{% -{\setlength{\extrarowheight}{5pt}% -\begin{tabular}{ |c||c|c|c|c|c| } -\hline -algorytm & przedział argumentu & średni błąd wz. & max błąd wz. & średni błąd bezwz. & max błąd bezwz. \\ -\hline -\multirow{3}{6em}{Taylor dla $\RR$} & $x:$ dowolny Float64 & $1,887 \cdot 10^{-15}$ & $3,167 \cdot 10^{-8}$ & $1,179 \cdot 10^{-16}$ & $8,882 \cdot 10^{-16}$\\ -\cline{2-6} -& $-2\pi \leq x \leq 2\pi$ & $1,472 \cdot 10^{-15}$ -& $1.184 \cdot 10^{-8}$ & $9,766 \cdot 10^{-17}$ & $5,551 \cdot 10^{-16}$\\ -\cline{2-6} -& $0 \leq x \leq 1$ & $8,694 \cdot 10^{-17}$ & $6,661 \cdot 10^{-16}$ & $4,293 \cdot 10^{-17}$ & $4,441 \cdot 10^{-16}$ \\ -\hline -\multirow{3}{6em}{Taylor dla $\CC$} & $-100 \leq \abs{x} \leq 100$ & $4,932 \cdot 10^{-15}$ & $1,311 \cdot 10^{-13}$ & $1,689 \cdot 10^{26}$ & $5,898 \cdot 10^{29}$ \\ -\cline{2-6} -& $-2\pi \leq \abs{x} \leq 2\pi$ & $4,338 \cdot 10^{-16}$ & $1,487 \cdot 10^{-11}$ & $1,364 \cdot 10^{-14}$ & $8,710 \cdot 10^{-13}$ \\ -\cline{2-6} -& $0 \leq \abs{x} \leq 1$ & $1,597 \cdot 10^{-16}$ & $1,099 \cdot 10^{-15}$ & $1,124 \cdot 10^{-16}$ & $1,111\cdot 10^{-15}$ \\ -\hline -\multirow{3}{6em}{Taylor dla $\CC$ bez wzorów redukcyjnych} & $-100 \leq \abs{x} \leq 100$ & $4,77 \cdot 10^{23}$ & $4,488 \cdot 10^{26}$ & $7,759 \cdot 10^{40}$ & $2,208 \cdot 10^{44}$ \\ -\cline{2-6} -& $-2\pi \leq \abs{x} \leq 2\pi$ & $6,333 \cdot 10^{-1}$ & $1,000$ & $2,344 \cdot 10$ & $2,677 \cdot 10^2$ \\ -\cline{2-6} -& $0 \leq \abs{x} \leq 1$ & $1,589 \cdot 10^{-16}$ & $1,291 \cdot 10^{-15}$ & $1,118 \cdot 10^{-16}$ & $1,116 \cdot 10^{-15}$ \\ -\hline -\multirow{3}{6em}{Cordic dla $\RR$} & $x:$ dowolny Float64 & $3,100 \cdot 10^{-8}$ & $4,575 \cdot 10^{-1}$ & $2,459 \cdot 10^{-9}$ & $5,529 \cdot 10^{-3}$ \\ -\cline{2-6} -& $-2\pi \leq x \leq 2\pi$ & $2,770 \cdot 10^{-8}$ & $1,183 \cdot 10^{-1}$ & $2,532 \cdot 10^{-9}$ & $6,042 \cdot 10^{-4}$ \\ -\cline{2-6} -& $0 \leq x \leq 1$ & $4,176 \cdot 10^{-8}$ & $9,182 \cdot 10^{-2}$ & $2,614 \cdot 10^{-9}$ & $5,261 \cdot 10^{-4}$ \\ -\hline -\end{tabular}}} -\\ -\vspace{0.5cm} -Tabela 2: błędy przy obliczaniu funkcji $\sin(x)$. -\end{center} - -\subsection{Wnioski} -Jak widać dla wszystkich testów, zaproponowane przez nas metody sprawdzają się bardzo dobrze dla małych argumentów. Algorytm CORDIC wypada dużo gorzej od metody korzystającej ze wzoru Taylora, lecz nie jest to dla nas nic zaskakującego -- metoda ta tworzy kompromis między wydajnością, a dokładnością obliczeń. Dla obu metod widać, że problemem jest zmiana argumentu na mały, gdyż to generuje największy błąd. W obu przypadkach najgorszy błąd względny generowały argumenty, które są duże i zbliżone do wielokrotności $\pi$, co wynika z konieczności odejmowania, z którego korzysta działanie $\mod$ oraz wzory redukcyjne, co prowadzi do utraty cyfr znaczących. - -Dużym problemem w obliczaniu wartości funkcji trygonometrycznych w dziedzinie liczb zespolonych jest konieczność używa funkcji hiperbolicznych, które rosną w tempie wykładniczym. Jeśli spojrzymy na wzór $(13)$ to zauważmy, że bardzo prawdopodobne jest, że będziemy mnożyć zbliżoną do $0$ wartość funkcji $\sin$ oraz $\cos$ z potencjalnie bardzo dużymi wartościami funkcji $\cosh$ i $\sinh$. - -Mimo to jesteśmy zadowoleni z rezultatów dla losowych testów -- jak widać, średni błąd względny jest rzędu dokładności liczb o precyzji podwójnej w przypadku metody Taylora oraz rzędu pojedynczej precyzji dla algorytmu CORDIC (co wynika z użycia \texttt{Int32} podczas procesu iteracyjnego). -\end{document} \ No newline at end of file diff --git a/Semestr 3/anm/pracownia1/prog/program.html b/Semestr 3/anm/pracownia1/prog/program.html deleted file mode 100644 index 66e1c19..0000000 --- a/Semestr 3/anm/pracownia1/prog/program.html +++ /dev/null @@ -1,16056 +0,0 @@ - - - - - -program - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- - - - -
- - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - -
- - - - -
- - - - -
- - - - -
- - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - -
- - - - - - - - - diff --git a/Semestr 3/anm/pracownia1/prog/program.ipynb b/Semestr 3/anm/pracownia1/prog/program.ipynb deleted file mode 100644 index e5d7c6a..0000000 --- a/Semestr 3/anm/pracownia1/prog/program.ipynb +++ /dev/null @@ -1,2042 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 89, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "set_cordic_iterations (generic function with 1 method)" - ] - }, - "execution_count": 89, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "include(\"program.jl\")" - ] - }, - { - "cell_type": "code", - "execution_count": 90, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Plots.PlotlyBackend()" - ] - }, - "execution_count": 90, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "using Plots\n", - "using Random\n", - "using Distributions\n", - "\n", - "plotly()" - ] - }, - { - "cell_type": "code", - "execution_count": 91, - "metadata": {}, - "outputs": [], - "source": [ - "# Zadanie 10, Franiszek malinka, Kacper Solecki\n", - "\n", - "# instrukcja:\n", - "# Nasz program udostępnia funkcje \n", - "\n", - "# -> taylor_sin(a, b) - sinus liczby a+bi liczony za pomocą szeregu Taylora\n", - "# -> taylor_cos(a, b) - cosinus liczby a+bi liczony za pomocą szeregu Taylora\n", - "# -> taylor_sinh(x) - sinus hiperboliczny liczby x liczony za pomocą szeregu Taylora\n", - "# -> taylor_cosh(x) - cosinus hiperboliczny liczby x liczony za pomocą szeregu Taylora\n", - "# -> cordic_sin(x) - sinus (rzeczywistej) liczby x liczony za pomocą algorytmu Cordic\n", - "# -> cordic_cos(x) - cosinus (rzeczywistej) liczby x liczony za pomocą algorytmu Cordic" - ] - }, - { - "cell_type": "code", - "execution_count": 92, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.9092974268256817" - ] - }, - "execution_count": 92, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# porównianie na sin(2), cos(2)\n", - "sin(2.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 93, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(0.9092974268256817, -0.0)" - ] - }, - "execution_count": 93, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "taylor_sin(2.0, 0.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 94, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.9092974280938506" - ] - }, - "execution_count": 94, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cordic_sin(2.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 95, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-0.4161468365471424" - ] - }, - "execution_count": 95, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cos(2)" - ] - }, - { - "cell_type": "code", - "execution_count": 96, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(-0.41614683654714246, -0.0)" - ] - }, - "execution_count": 96, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "taylor_cos(2.0, 0.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 97, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-0.4161468353122473" - ] - }, - "execution_count": 97, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cordic_cos(2.0)" - ] - }, - { - "cell_type": "code", - "execution_count": 98, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "-5991.431207677988 - 9240.89014825243im" - ] - }, - "execution_count": 98, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# porównianie na sin(10 + 10i)\n", - "sin(10 + 10im)" - ] - }, - { - "cell_type": "code", - "execution_count": 99, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(-5991.431207678, -9240.890148252452)" - ] - }, - "execution_count": 99, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "taylor_sin(10, 10)" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "rel_error (generic function with 1 method)" - ] - }, - "execution_count": 73, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# w ten sposób liczony jest błąd względny zarówno dla liczb rzeczywistych jak i zespolonych\n", - "function rel_error(x, y)\n", - " if x == 0\n", - " return 0\n", - " end\n", - " return abs((x-y)/x)\n", - "end" - ] - }, - { - "cell_type": "code", - "execution_count": 100, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "taylor_error_of_iterations (generic function with 1 method)" - ] - }, - "execution_count": 100, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "function taylor_error_of_iterations(x)\n", - " set_taylor_iterations(x)\n", - " return rel_error(sin(100+100im), taylor_sin(100, 100)[1] + taylor_sin(100, 100)[2]*im)\n", - "end" - ] - }, - { - "cell_type": "code", - "execution_count": 101, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "cordic_error_of_iterations (generic function with 1 method)" - ] - }, - "execution_count": 101, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "function cordic_error_of_iterations(x)\n", - " set_cordic_iterations(x)\n", - " return rel_error(sin(100), cordic_sin(100.0))\n", - "end" - ] - }, - { - "cell_type": "code", - "execution_count": 111, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "taylor_error_of_iterations2 (generic function with 1 method)" - ] - }, - "execution_count": 111, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "function taylor_error_of_iterations2(x)\n", - " set_taylor_iterations(x)\n", - " return rel_error(sin(100), taylor_sin(100.0, 0.0)[1])\n", - "end" - ] - }, - { - "cell_type": "code", - "execution_count": 112, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1:20" - ] - }, - "execution_count": 112, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "X = 1:20" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Przykładowe błędy w zależności od liczby iteracji:" - ] - }, - { - "cell_type": "code", - "execution_count": 113, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "data": [ - { - "colorbar": { - "title": "" - }, - "legendgroup": "y1", - "line": { - "color": "rgba(0, 154, 250, 1.000)", - "dash": "solid", - "shape": "linear", - "width": 1 - }, - "mode": "lines", - "name": "y1", - "showlegend": true, - "type": "scatter", - "x": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20 - ], - "xaxis": "x", - "y": [ - 0.9999999999947897, - 0.6604336394521374, - 0.02055234411557763, - 0.00022080130144359062, - 1.4713452359772989e-06, - 6.728428696183563e-09, - 2.238852117625799e-11, - 7.408349671662484e-14, - 2.066101872553143e-14, - 2.066101872553143e-14, - 2.066101872553143e-14, - 2.066101872553143e-14, - 2.066101872553143e-14, - 2.066101872553143e-14, - 2.066101872553143e-14, - 2.066101872553143e-14, - 2.066101872553143e-14, - 2.066101872553143e-14, - 2.066101872553143e-14, - 2.066101872553143e-14 - ], - "yaxis": "y", - "zmax": null, - "zmin": null - } - ], - "layout": { - "annotations": [ - { - "font": { - "color": "rgba(0, 0, 0, 1.000)", - "family": "sans-serif", - "size": 20 - }, - "rotation": 0, - "showarrow": false, - "text": "Taylor relative error calculating sin(100+100i)", - "x": 0.5423611111111111, - "xanchor": "center", - "xref": "paper", - "y": 1, - "yanchor": "top", - "yref": "paper" - } - ], - "height": 400, - "legend": { - "bgcolor": "rgba(255, 255, 255, 1.000)", - "bordercolor": "rgba(0, 0, 0, 1.000)", - "borderwidth": 1, - "font": { - "color": "rgba(0, 0, 0, 1.000)", - "family": "sans-serif", - "size": 11 - }, - "tracegroupgap": 0, - "traceorder": "normal", - "x": 1, - "xanchor": "auto", - "y": 1, - "yanchor": "auto" - }, - "margin": { - "b": 20, - "l": 0, - "r": 0, - "t": 20 - }, - "paper_bgcolor": "rgba(255, 255, 255, 1.000)", - "plot_bgcolor": "rgba(255, 255, 255, 1.000)", - "showlegend": true, - "width": 600, - "xaxis": { - "anchor": "y", - "domain": [ - 0.09128390201224845, - 0.9934383202099738 - ], - "gridcolor": "rgba(0, 0, 0, 0.100)", - "gridwidth": 0.5, - "linecolor": "rgba(0, 0, 0, 1.000)", - "mirror": false, - "range": [ - 0.43000000000000005, - 20.57 - ], - "showgrid": true, - "showline": true, - "showticklabels": true, - "tickangle": 0, - "tickcolor": "rgb(0, 0, 0)", - "tickfont": { - "color": "rgba(0, 0, 0, 1.000)", - "family": "sans-serif", - "size": 11 - }, - "tickmode": "array", - "ticks": "inside", - "ticktext": [ - "5", - "10", - "15", - "20" - ], - "tickvals": [ - 5, - 10, - 15, - 20 - ], - "title": "iterations", - "titlefont": { - "color": "rgba(0, 0, 0, 1.000)", - "family": "sans-serif", - "size": 15 - }, - "type": "-", - "visible": true, - "zeroline": false, - "zerolinecolor": "rgba(0, 0, 0, 1.000)" - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0.07581474190726165, - 0.9415463692038496 - ], - "gridcolor": "rgba(0, 0, 0, 0.100)", - "gridwidth": 0.5, - "linecolor": "rgba(0, 0, 0, 1.000)", - "mirror": false, - "range": [ - -0.029999999999822412, - 1.0299999999946328 - ], - "showgrid": true, - "showline": true, - "showticklabels": true, - "tickangle": 0, - "tickcolor": "rgb(0, 0, 0)", - "tickfont": { - "color": "rgba(0, 0, 0, 1.000)", - "family": "sans-serif", - "size": 11 - }, - "tickmode": "array", - "ticks": "inside", - "ticktext": [ - "0.00", - "0.25", - "0.50", - "0.75", - "1.00" - ], - "tickvals": [ - 0, - 0.25, - 0.5, - 0.75, - 1 - ], - "title": "relative error", - "titlefont": { - "color": "rgba(0, 0, 0, 1.000)", - "family": "sans-serif", - "size": 15 - }, - "type": "-", - "visible": true, - "zeroline": false, - "zerolinecolor": "rgba(0, 0, 0, 1.000)" - } - } - }, - "text/html": [ - "\n", - "\n", - " \n", - " Plots.jl\n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - "\n", - " \n", - "\n" - ] - }, - "execution_count": 113, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\n", - "plot(taylor_error_of_iterations, X, title=\"Taylor relative error calculating sin(100+100i)\", xguide = \"iterations\", yguide = \"relative error\")" - ] - }, - { - "cell_type": "code", - "execution_count": 114, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "data": [ - { - "colorbar": { - "title": "" - }, - "legendgroup": "y1", - "line": { - "color": "rgba(0, 154, 250, 1.000)", - "dash": "solid", - "shape": "linear", - "width": 1 - }, - "mode": "lines", - "name": "y1", - "showlegend": true, - "type": "scatter", - "x": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20 - ], - "xaxis": "x", - "y": [ - 0.04858006105965706, - 0.0006898745020126097, - 4.643725178799385e-06, - 1.8207599251359285e-08, - 4.6699841760941685e-11, - 8.485100007739351e-14, - 2.1925323017414343e-16, - 4.3850646034828687e-16, - 4.3850646034828687e-16, - 4.3850646034828687e-16, - 4.3850646034828687e-16, - 4.3850646034828687e-16, - 4.3850646034828687e-16, - 4.3850646034828687e-16, - 4.3850646034828687e-16, - 4.3850646034828687e-16, - 4.3850646034828687e-16, - 4.3850646034828687e-16, - 4.3850646034828687e-16, - 4.3850646034828687e-16 - ], - "yaxis": "y", - "zmax": null, - "zmin": null - } - ], - "layout": { - "annotations": [ - { - "font": { - "color": "rgba(0, 0, 0, 1.000)", - "family": "sans-serif", - "size": 20 - }, - "rotation": 0, - "showarrow": false, - "text": "Taylor relative error calculating sin(100)", - "x": 0.5423611111111111, - "xanchor": "center", - "xref": "paper", - "y": 1, - "yanchor": "top", - "yref": "paper" - } - ], - "height": 400, - "legend": { - "bgcolor": "rgba(255, 255, 255, 1.000)", - "bordercolor": "rgba(0, 0, 0, 1.000)", - "borderwidth": 1, - "font": { - "color": "rgba(0, 0, 0, 1.000)", - "family": "sans-serif", - "size": 11 - }, - "tracegroupgap": 0, - "traceorder": "normal", - "x": 1, - "xanchor": "auto", - "y": 1, - "yanchor": "auto" - }, - "margin": { - "b": 20, - "l": 0, - "r": 0, - "t": 20 - }, - "paper_bgcolor": "rgba(255, 255, 255, 1.000)", - "plot_bgcolor": "rgba(255, 255, 255, 1.000)", - "showlegend": true, - "width": 600, - "xaxis": { - "anchor": "y", - "domain": [ - 0.09128390201224845, - 0.9934383202099738 - ], - "gridcolor": "rgba(0, 0, 0, 0.100)", - "gridwidth": 0.5, - "linecolor": "rgba(0, 0, 0, 1.000)", - "mirror": false, - "range": [ - 0.43000000000000005, - 20.57 - ], - "showgrid": true, - "showline": true, - "showticklabels": true, - "tickangle": 0, - "tickcolor": "rgb(0, 0, 0)", - "tickfont": { - "color": "rgba(0, 0, 0, 1.000)", - "family": "sans-serif", - "size": 11 - }, - "tickmode": "array", - "ticks": "inside", - "ticktext": [ - "5", - "10", - "15", - "20" - ], - "tickvals": [ - 5, - 10, - 15, - 20 - ], - "title": "iterations", - "titlefont": { - "color": "rgba(0, 0, 0, 1.000)", - "family": "sans-serif", - "size": 15 - }, - "type": "-", - "visible": true, - "zeroline": false, - "zerolinecolor": "rgba(0, 0, 0, 1.000)" - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0.07581474190726165, - 0.9415463692038496 - ], - "gridcolor": "rgba(0, 0, 0, 0.100)", - "gridwidth": 0.5, - "linecolor": "rgba(0, 0, 0, 1.000)", - "mirror": false, - "range": [ - -0.0014574018317894857, - 0.05003746289144676 - ], - "showgrid": true, - "showline": true, - "showticklabels": true, - "tickangle": 0, - "tickcolor": "rgb(0, 0, 0)", - "tickfont": { - "color": "rgba(0, 0, 0, 1.000)", - "family": "sans-serif", - "size": 11 - }, - "tickmode": "array", - "ticks": "inside", - "ticktext": [ - "0.00", - "0.01", - "0.02", - "0.03", - "0.04", - "0.05" - ], - "tickvals": [ - 0, - 0.01, - 0.02, - 0.03, - 0.04, - 0.05 - ], - "title": "relative error", - "titlefont": { - "color": "rgba(0, 0, 0, 1.000)", - "family": "sans-serif", - "size": 15 - }, - "type": "-", - "visible": true, - "zeroline": false, - "zerolinecolor": "rgba(0, 0, 0, 1.000)" - } - } - }, - "text/html": [ - "\n", - "\n", - " \n", - " Plots.jl\n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - "\n", - " \n", - "\n" - ] - }, - "execution_count": 114, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "plot(taylor_error_of_iterations2, X, title=\"Taylor relative error calculating sin(100)\", xguide = \"iterations\", yguide = \"relative error\")" - ] - }, - { - "cell_type": "code", - "execution_count": 109, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "data": [ - { - "colorbar": { - "title": "" - }, - "legendgroup": "y1", - "line": { - "color": "rgba(0, 154, 250, 1.000)", - "dash": "solid", - "shape": "linear", - "width": 1 - }, - "mode": "lines", - "name": "y1", - "showlegend": true, - "type": "scatter", - "x": [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20 - ], - "xaxis": "x", - "y": [ - 0.19923803206067645, - 0.40038098396966176, - 0.04933327667366985, - 0.15678575968442748, - 0.04552832522388985, - 0.008453488065297705, - 0.018071367045314653, - 0.004685838026992587, - 0.0019769599175434157, - 0.001346845796143942, - 0.0003169671004323271, - 0.0005144620678263349, - 9.862885340066103e-05, - 0.00010925740652706494, - 5.322553095504949e-06, - 4.664671284967571e-05, - 2.066207987708538e-05, - 7.669763390790217e-06, - 1.1736051476426335e-06, - 2.074473973931158e-06 - ], - "yaxis": "y", - "zmax": null, - "zmin": null - } - ], - "layout": { - "annotations": [ - { - "font": { - "color": "rgba(0, 0, 0, 1.000)", - "family": "sans-serif", - "size": 20 - }, - "rotation": 0, - "showarrow": false, - "text": "Cordic relative error calculating sin(100)", - "x": 0.5349537037037038, - "xanchor": "center", - "xref": "paper", - "y": 1, - "yanchor": "top", - "yref": "paper" - } - ], - "height": 400, - "legend": { - "bgcolor": "rgba(255, 255, 255, 1.000)", - "bordercolor": "rgba(0, 0, 0, 1.000)", - "borderwidth": 1, - "font": { - "color": "rgba(0, 0, 0, 1.000)", - "family": "sans-serif", - "size": 11 - }, - "tracegroupgap": 0, - "traceorder": "normal", - "x": 1, - "xanchor": "auto", - "y": 1, - "yanchor": "auto" - }, - "margin": { - "b": 20, - "l": 0, - "r": 0, - "t": 20 - }, - "paper_bgcolor": "rgba(255, 255, 255, 1.000)", - "plot_bgcolor": "rgba(255, 255, 255, 1.000)", - "showlegend": true, - "width": 600, - "xaxis": { - "anchor": "y", - "domain": [ - 0.07646908719743364, - 0.9934383202099737 - ], - "gridcolor": "rgba(0, 0, 0, 0.100)", - "gridwidth": 0.5, - "linecolor": "rgba(0, 0, 0, 1.000)", - "mirror": false, - "range": [ - 0.43000000000000005, - 20.57 - ], - "showgrid": true, - "showline": true, - "showticklabels": true, - "tickangle": 0, - "tickcolor": "rgb(0, 0, 0)", - "tickfont": { - "color": "rgba(0, 0, 0, 1.000)", - "family": "sans-serif", - "size": 11 - }, - "tickmode": "array", - "ticks": "inside", - "ticktext": [ - "5", - "10", - "15", - "20" - ], - "tickvals": [ - 5, - 10, - 15, - 20 - ], - "title": "iterations", - "titlefont": { - "color": "rgba(0, 0, 0, 1.000)", - "family": "sans-serif", - "size": 15 - }, - "type": "-", - "visible": true, - "zeroline": false, - "zerolinecolor": "rgba(0, 0, 0, 1.000)" - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0.07581474190726165, - 0.9415463692038496 - ], - "gridcolor": "rgba(0, 0, 0, 0.100)", - "gridwidth": 0.5, - "linecolor": "rgba(0, 0, 0, 1.000)", - "mirror": false, - "range": [ - -0.012010220705787781, - 0.41239237828059716 - ], - "showgrid": true, - "showline": true, - "showticklabels": true, - "tickangle": 0, - "tickcolor": "rgb(0, 0, 0)", - "tickfont": { - "color": "rgba(0, 0, 0, 1.000)", - "family": "sans-serif", - "size": 11 - }, - "tickmode": "array", - "ticks": "inside", - "ticktext": [ - "0.0", - "0.1", - "0.2", - "0.3", - "0.4" - ], - "tickvals": [ - 0, - 0.1, - 0.2, - 0.30000000000000004, - 0.4 - ], - "title": "relative error", - "titlefont": { - "color": "rgba(0, 0, 0, 1.000)", - "family": "sans-serif", - "size": 15 - }, - "type": "-", - "visible": true, - "zeroline": false, - "zerolinecolor": "rgba(0, 0, 0, 1.000)" - } - } - }, - "text/html": [ - "\n", - "\n", - " \n", - " Plots.jl\n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - "\n", - " \n", - "\n" - ] - }, - "execution_count": 109, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "plot(cordic_error_of_iterations, X, title=\"Cordic relative error calculating sin(100)\", xguide = \"iterations\", yguide = \"relative error\")" - ] - }, - { - "cell_type": "code", - "execution_count": 106, - "metadata": {}, - "outputs": [], - "source": [ - "# Poniżej znajdują się funkcje testujące, na podstawie których powstała tabelka z błędami w sprawozdaniu" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "MersenneTwister(UInt32[0x00003039], Random.DSFMT.DSFMT_state(Int32[-870096391, 1072918504, -1812426662, 1073255081, -733866021, 1073404543, 807620846, 1073368448, 1919433844, 1072852359 … -362113007, 1073100625, -166402106, 1073460158, -1907020342, 721295190, -750225566, -1300227565, 382, 0]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], UInt128[0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000 … 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000], 1002, 0)" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "TESTS = 100000000\n", - "\n", - "Random.seed!(12345)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "taylor_test_error_real (generic function with 3 methods)" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "function taylor_test_error_real(l::Float64=floatmin(), r::Float64=floatmax())\n", - " res = BigFloat(0)\n", - " abs_res = BigFloat(0)\n", - " maksi_rel = BigFloat(0)\n", - " maksi_abs = BigFloat(0)\n", - " for i = 1:TESTS\n", - " if i % 100000 == 0\n", - " println(i)\n", - " end\n", - " x = rand(Uniform(l, r))\n", - " lib_sin = sin(x)\n", - " if lib_sin == 0\n", - " continue\n", - " end\n", - " my_sin = taylor_sin(x, 0)\n", - " error = rel_error(lib_sin, my_sin[1])\n", - " abs_error = abs(my_sin[1] - lib_sin)\n", - " res += error\n", - " abs_res += abs_error\n", - " maksi_rel = max(maksi_rel, error)\n", - " maksi_abs = max(maksi_abs, abs_error)\n", - " end\n", - " return (res/TESTS, maksi_rel, abs_res/TESTS, maksi_abs)\n", - "end\n", - "\n", - "# (floatmin(), floatmax()):\n", - "# (1.887844299668514797145972383393008309519973773948872165524132116232181033410611e-15, \n", - "# 3.16719187748669057932019506480803006098767582443542778491973876953125e-08,\n", - "# 1.1794041986528804301572959036155385792454808324691839516162872314453125e-16,\n", - "# 8.8817841970012523233890533447265625e-16)\n", - "\n", - "# (-pi/2, pi/2):\n", - "# (1.471587646915289673578957365178574707202863924359834292944840261618821841693717e-15, \n", - "# 1.1848604479598457485905096801294400510329296594136394560337066650390625e-08, \n", - "# 9.765754183892570637182101557852154094518937199609354138374328613281249999999994e-17, \n", - "# 5.5511151231257827021181583404541015625e-16)\n", - "\n", - "# (0, 1):\n", - "# (8.693695902799099432701533207691913249153884601349429181102457242502623557811573e-17,\n", - "# 6.661260307992334044328275268948192015174572739102942797728701407322660088539124e-16,\n", - "# 4.293257315426284893844499634951716871000826358795166015624999999999999999999994e-17,\n", - "# 4.44089209850062616169452667236328125e-16)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "taylor_test_error_complex (generic function with 3 methods)" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "function taylor_test_error_complex(l::Float64=-100.0, r::Float64=100.0)\n", - " res = BigFloat(0)\n", - " abs_res = BigFloat(0)\n", - " maksi_rel = BigFloat(0)\n", - " maksi_abs = BigFloat(0)\n", - " for i = 1:TESTS\n", - " if i % 100000 == 0\n", - " println(i)\n", - " end\n", - " x = rand(Uniform(l, r))\n", - " y = rand(Uniform(max(l, -Float64(√(BigFloat(r)*r - BigFloat(x)*x))), \n", - " Float64(√(BigFloat(r)*r - BigFloat(x)*x))))\n", - " lib_sin = sin(x + y*im)\n", - " my_sin = taylor_sin(x, y)\n", - " error = rel_error(lib_sin, my_sin[1] + my_sin[2]*im)\n", - " abs_error = abs(lib_sin - (my_sin[1] + my_sin[2]*im))\n", - " res += error\n", - " abs_res += abs_error\n", - " maksi_rel = max(maksi_rel, error)\n", - " maksi_abs = max(maksi_abs, abs_error)\n", - " end\n", - " return (res/TESTS, maksi_rel, abs_res/TESTS, maksi_abs)\n", - "end\n", - "\n", - "# (-100, 100):\n", - "# (4.932205036590292360305897845543684560590114030155004375572792447173773555907229e-15, \n", - "# 1.3111008357751143737471652583705182364137709072338111582212150096893310546875e-13, \n", - "# 1.688623533003329462861070079404255492323042928202526655997186385923664654746476e+26, \n", - "# 5.89784569029861503624382775296e+29)\n", - "\n", - "# (-2pi, 2pi):\n", - "# (4.338436856498561167962902801400526155223569336855327458414068651872587652334067e-16, \n", - "# 1.48720543982594402760972427363260419015678071019692652043886482715606689453125e-11, \n", - "# 1.364745868545483273874507699553481910023596725366415789061836204439613629002538e-14, \n", - "# 8.7095846425677781478128738959826782468909289747216462274082005023956298828125e-13)\n", - "\n", - "# (0, 1):\n", - "# (1.596935223079780368874812440778376297707878344605454825588075017177200118204992e-16, \n", - "# 1.098997011961567777204023105931451003520679665648174250236479565501213073730469e-15, \n", - "# 1.124298405324025732059699593805301650508046127888472394113736655893442950571177e-16, \n", - "# 1.110569915127177230816030746289393434073728902933275719533412484452128410339355e-15)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "cordic_test_error (generic function with 3 methods)" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "function cordic_test_error(l::Float64=floatmin(), r::Float64=floatmax())\n", - " res = BigFloat(0)\n", - " abs_res = BigFloat(0)\n", - " maksi_rel = BigFloat(0)\n", - " maksi_abs = BigFloat(0)\n", - " for i = 1:TESTS\n", - " if i % 100000 == 0\n", - " println(i)\n", - " end\n", - " x = rand(Uniform(l, r))\n", - " lib_sin = sin(x)\n", - " my_sin = cordic_sin(x)\n", - " error = rel_error(lib_sin, my_sin)\n", - " abs_error = abs(lib_sin - my_sin)\n", - " res += error\n", - " abs_res += abs_error\n", - " if error > maksi_rel\n", - " worst_rel = x\n", - " end\n", - " maksi_rel = max(maksi_rel, error)\n", - " maksi_abs = max(maksi_abs, abs_error)\n", - " end\n", - " return (res/TESTS, maksi_rel, abs_res/TESTS, maksi_abs)\n", - "end\n", - "\n", - "# (floatmin(), floatmax()):\n", - "# (3.099880824631376815575307358441341907045753361742215192539218280437518515668677e-08, \n", - "# 0.457561153670805575988111968399607576429843902587890625, \n", - "# 2.459716652636021482355597144179802356154379561203882076370064169168472290039072e-09, \n", - "# 0.0006041780891818948617810747236944735050201416015625)\n", - "\n", - "# (-2pi, 2pi):\n", - "# (2.769658715752475495709394998775060901506630522496771093654899307916206208091117e-08, \n", - "# 0.11834204003306579566778822254491387866437435150146484375, \n", - "# 2.532059440779907667675144447194875727078638982803227008844260126352310180664052e-09,\n", - "# 0.00552917548107156875403234153054654598236083984375)\n", - "\n", - "# (0, 1):\n", - "# (4.176404604808155838824592152607760760141260709650975486490997166423577713345588e-08, \n", - "# 0.091828765031669201679420666550868190824985504150390625, \n", - "# 2.613683444981852927700279986835644064485650872597943816799670457839965820312493e-09, \n", - "# 0.00052619288922584050993691562325693666934967041015625)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "taylor_without_reduction_test_error (generic function with 3 methods)" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "function taylor_without_reduction_test_error(l::Float64=-100.0, r::Float64=100.0)\n", - " res = BigFloat(0)\n", - " abs_res = BigFloat(0)\n", - " maksi_rel = BigFloat(0)\n", - " maksi_abs = BigFloat(0)\n", - " for i = 1:TESTS\n", - " if i % 1000000 == 0\n", - " println(i)\n", - " end\n", - " x = rand(Uniform(l, r))\n", - " y = rand(Uniform(max(l, -Float64(√(BigFloat(r)*r - BigFloat(x)*x))), \n", - " Float64(√(BigFloat(r)*r - BigFloat(x)*x))))\n", - " lib_sin = sin(x + y*im)\n", - " my_sin = taylor_sin_no_reduction(x, y)\n", - " error = rel_error(lib_sin, my_sin[1] + my_sin[2]*im)\n", - " abs_error = abs(lib_sin - (my_sin[1] + my_sin[2]*im))\n", - " res += error\n", - " abs_res += abs_error\n", - " maksi_rel = max(maksi_rel, error)\n", - " maksi_abs = max(maksi_abs, abs_error)\n", - " end\n", - " return (res/TESTS, maksi_rel, abs_res/TESTS, maksi_abs)\n", - "end\n", - "\n", - "# (-100, 100)\n", - "# (4.774091809397734982069398193189465079787514988283523440828527859306283137571149e+23, \n", - "# 4.48814142545670189837451264e+26, \n", - "# 7.758560481134976967771949796127369173267383351574525337904198599731007318070319e+40, \n", - "# 2.20832987186165589366506156220211970162294784e+44)\n", - "\n", - "# (-2pi, 2pi)\n", - "# (0.6332711088634405192103194531076134843075526902544601426097735760298574150340518, \n", - "# 1.0, \n", - "# 23.44057586605533515691829807979128873527513778367553433852055381911453864572971, \n", - "# 267.74654227273646256435313262045383453369140625)\n", - "\n", - "# (0, 1)\n", - "# (1.589482169544726703219739509256918022523030217883325972454504856003547167066932e-16, \n", - "# 1.291897416767691567199962520855285151964115327068161054313577551511116325855255e-15, \n", - "# 1.118367257755837281340217148887719929595000777959128862241583039814976641146415e-16, \n", - "# 1.115760330918745818020084658567032229219617364690542160587938269600272178649902e-15)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Julia 1.4.1", - "language": "julia", - "name": "julia-1.4" - }, - "language_info": { - "file_extension": ".jl", - "mimetype": "application/julia", - "name": "julia", - "version": "1.4.1" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/Semestr 3/anm/pracownia1/prog/program.jl b/Semestr 3/anm/pracownia1/prog/program.jl deleted file mode 100644 index 8e2d8b4..0000000 --- a/Semestr 3/anm/pracownia1/prog/program.jl +++ /dev/null @@ -1,247 +0,0 @@ -using Printf - -global C_ITERATIONS = 30 -global CORDIC_MUL_POW = 30 -global CORDIC_MUL = 2.0^CORDIC_MUL_POW -global CORDIC_ATANS = [843314857, 497837829, 263043837, 133525159, 67021687, 33543516, 16775851, - 8388437, 4194283, 2097149, 1048576, 524288, 262144, 131072, 65536, 32768, 16384, 8192, 4096, - 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2] -global CORDIC_F = 1768195363 -global CORDIC_F_INV = 652032874 - -global T_ITERATIONS = 15 -global HYPERBOLIC_MAX = 1 - -# liczenie szeregu Taylora -function series(x, parity, change_sign, iterations) - res = zero(x) - elem = one(x) - if parity == 1 - elem = x - end - i = parity + 1 - while i <= 2*iterations + parity - res += elem - elem *= change_sign*x*x/(i*(i+1)) - i += 2 - end - return res -end - -# generyczna funkcja stosująca wzory redukcyjne, licząca sinusa -function gen_sin(x, iterations, sin_fun, cos_fun) - if x < 0 - return -gen_sin(-x, iterations, sin_fun, cos_fun) - end - x = mod2pi(x) - if x > pi - return -gen_sin(x-pi, iterations, sin_fun, cos_fun) - end - if x > pi/2 - return gen_cos(x-pi/2, iterations, sin_fun, cos_fun) - end - if x > pi/4 - return gen_cos(pi/2-x, iterations, sin_fun, cos_fun) - end - return sin_fun(x, iterations) -end - -# generyczna funkcja stosująca wzory redukcyjne, licząca cosinusa -function gen_cos(x, iterations, sin_fun, cos_fun) - if x < 0 - return gen_cos(-x, iterations, sin_fun, cos_fun) - end - x = mod2pi(x) - if x > pi - return -gen_cos(x-pi, iterations, sin_fun, cos_fun) - end - if x > pi/2 - return -gen_sin(x-pi/2, iterations, sin_fun, cos_fun) - end - if x > pi/4 - return gen_sin(pi/2-x, iterations, sin_fun, cos_fun) - end - return cos_fun(x, iterations) -end - -# sin dla liczb rzeczywistych [taylor] -function real_sin(r, iterations) - return series(r, 1, -1, iterations) -end - -# cos dla liczb rzeczywistych [taylor] -function real_cos(r, iterations) - return series(r, 0, -1, iterations) -end - -# sinh [taylor] -function real_sinh(r, iterations) - if r > 1000 - return Inf - end - if r < -1000 - return -Inf - end - if r == 0 - return Float64(0) - end - if abs(r) > HYPERBOLIC_MAX - return 2*real_sinh(r/2, iterations)*real_cosh(r/2, iterations) - end - return series(r, 1, 1, iterations) -end - -# cosh [taylor] -function real_cosh(r, iterations) - if abs(r) > 1000 - return Inf - end - if r == 1 - return Float64(1) - end - if abs(r) > HYPERBOLIC_MAX - s = real_sinh(r/2, iterations) - c = real_cosh(r/2, iterations) - return s*s+c*c - end - return series(r, 0, 1, iterations) -end - -# sin dla liczb zespolonych [taylor] -function complex_sin(a, b, iterations) - return (gen_sin(a, iterations, real_sin, real_cos)*real_cosh(b, iterations), - gen_cos(a, iterations, real_sin, real_cos)*real_sinh(b, iterations)) -end - -# cos dla liczb zespolonych [taylor] -function complex_cos(a, b, iterations) - return (real_cos(a, iterations)*real_cosh(b, iterations), - -real_sin(a, iterations)*real_sinh(b, iterations)) -end - -# funkcja dla użytkownika [taylor] -function taylor_sin(a, b) - return complex_sin(a, b, T_ITERATIONS) -end - -# funkcja dla użytkownika [taylor] -function taylor_cos(a, b) - return complex_cos(a, b, T_ITERATIONS) -end - -# funkcja dla użytkownika [taylor] -function taylor_sinh(r) - return real_sinh(r, T_ITERATIONS) -end - -# funkcja dla użytkownika [taylor] -function taylor_cosh(r) - return real_cosh(r, T_ITERATIONS) -end - -# preprocesing [cordic] -function preprocess_atan(iterations) - global CORDIC_MUL - atan2pow = Array{Float64}(undef, iterations) - @printf("CORDIC_ATANS = [") - for i in 1:iterations - atan2pow[i] = round(atan(1.0 / Float64(BigInt(2)^(i - 1))) * CORDIC_MUL) - @printf("%d", atan2pow[i]) - if i < iterations - @printf(", ") - end - end - @printf("]\n") -end - - -# preprocesing [cordic] -function preprocess_scaling_factor(iterations) - CORDIC_F = 1.0 - for i in 0:iterations - CORDIC_F *= sqrt(1. + 1. / Float64(BigInt(2)^(2 * i))) - end - @printf("CORDIC_F = %d\nCORDIC_F_INV = %d\n", round(CORDIC_F * CORDIC_MUL), round(CORDIC_MUL / CORDIC_F)) -end - - -# funkcja licząca zarówno sin oraz cos [cordic] -function approx_trig(x, iterations) - global CORDIC_ATANS - global CORDIC_F_INV - X = CORDIC_F_INV - Y = 0 - Z = round(x * CORDIC_MUL) - s = 1 - for i in 0:(iterations - 1) - tempX = X - if Z == 0 - break - end - if Z >= 0 - X -= s * (Y >> i) - Y += s * (tempX >> i) - Z -= s * CORDIC_ATANS[i + 1] - else - X += s * (Y >> i) - Y -= s * (tempX >> i) - Z += s * CORDIC_ATANS[i + 1] - end - end - - return (Float64(X) / CORDIC_MUL, Float64(Y) / CORDIC_MUL) -end - -# wyciąganie sin z approx_trig [cordic] -function approx_sin(x, iterations) - return approx_trig(x, iterations)[2] -end - - -# wyciąganie cos z approx_trig [cordic] -function approx_cos(x, iterations) - return approx_trig(x, iterations)[1] -end - -# funkcja dla użytkownika [cordic] -function cordic_sin(x) - return gen_sin(x, C_ITERATIONS, approx_sin, approx_cos) -end - -# funkcja dla użytkownika [cordic] -function cordic_cos(x) - return gen_cos(x, C_ITERATIONS, approx_sin, approx_cos) -end - -# uruchamianie preprocesingu [cordic] -function preprocess_cordic() - println("Preprocessing CORDIC constants.") - preprocess_atan(CORDIC_MUL_POW) - preprocess_scaling_factor(CORDIC_MUL_POW) -end - -# sinh bez stosowania wzorów redukcyjnych [taylor] -function sinh_no_reduction(x, iterations) - return series(x, 1, 1, iterations) -end - -# cosh bez stosowania wzorów redukcyjnych [taylor] -function cosh_no_reduction(x, iterations) - return series(x, 0, 1, iterations) -end - -# sin bez stosowania wzorów redukcyjnych [taylor] -function taylor_sin_no_reduction(x, y) - return (real_sin(x, 10*round(x)+10) * cosh_no_reduction(y, 10*round(y)+10), - real_cos(x, 10*round(x)+10) * sinh_no_reduction(y, 10*round(x)+10)) -end - -# zmiana liczby iteracji [taylor] -function set_taylor_iterations(x) - global T_ITERATIONS = x -end - -# zmiana liczby iteracji [cordic] -function set_cordic_iterations(x) - global C_ITERATIONS = x -end \ No newline at end of file diff --git a/Semestr 3/anm/pracownia1/zadanie.zip b/Semestr 3/anm/pracownia1/zadanie.zip deleted file mode 100644 index 821c3ce..0000000 Binary files a/Semestr 3/anm/pracownia1/zadanie.zip and /dev/null differ -- cgit v1.2.3