From 0344a846c083c11e9ed93ddc5898dd55c6dd1022 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20M=C3=BCller?= Date: Wed, 20 Apr 2022 10:30:56 +0200 Subject: lemniscate sine stuff --- buch/chapters/110-elliptisch/images/Makefile | 9 +- .../chapters/110-elliptisch/images/jacobiplots.pdf | Bin 56975 -> 56975 bytes buch/chapters/110-elliptisch/images/lemniskate.pdf | Bin 9914 -> 14339 bytes buch/chapters/110-elliptisch/images/lemniskate.tex | 15 ++- buch/chapters/110-elliptisch/images/slcl.cpp | 128 +++++++++++++++++++++ buch/chapters/110-elliptisch/images/slcl.pdf | Bin 0 -> 28269 bytes buch/chapters/110-elliptisch/images/slcl.tex | 88 ++++++++++++++ 7 files changed, 237 insertions(+), 3 deletions(-) create mode 100644 buch/chapters/110-elliptisch/images/slcl.cpp create mode 100644 buch/chapters/110-elliptisch/images/slcl.pdf create mode 100644 buch/chapters/110-elliptisch/images/slcl.tex (limited to 'buch/chapters/110-elliptisch/images') diff --git a/buch/chapters/110-elliptisch/images/Makefile b/buch/chapters/110-elliptisch/images/Makefile index 68322b6..a7c9e74 100644 --- a/buch/chapters/110-elliptisch/images/Makefile +++ b/buch/chapters/110-elliptisch/images/Makefile @@ -5,7 +5,7 @@ # all: lemniskate.pdf ellipsenumfang.pdf unvollstaendig.pdf rechteck.pdf \ ellipse.pdf pendel.pdf jacobiplots.pdf jacobidef.pdf jacobi12.pdf \ - sncnlimit.pdf + sncnlimit.pdf slcl.pdf lemniskate.pdf: lemniskate.tex pdflatex lemniskate.tex @@ -71,3 +71,10 @@ jacobi12.pdf: jacobi12.tex sncnlimit.pdf: sncnlimit.tex pdflatex sncnlimit.tex +slcl: slcl.cpp + g++ -O -Wall -std=c++11 slcl.cpp -o slcl `pkg-config --cflags gsl` `pkg-config --libs gsl` + +slcldata.tex: slcl + ./slcl --outfile=slcldata.tex --a=0 --b=13.4 --steps=200 +slcl.pdf: slcl.tex slcldata.tex + pdflatex slcl.tex diff --git a/buch/chapters/110-elliptisch/images/jacobiplots.pdf b/buch/chapters/110-elliptisch/images/jacobiplots.pdf index 88cf119..f0e6e78 100644 Binary files a/buch/chapters/110-elliptisch/images/jacobiplots.pdf and b/buch/chapters/110-elliptisch/images/jacobiplots.pdf differ diff --git a/buch/chapters/110-elliptisch/images/lemniskate.pdf b/buch/chapters/110-elliptisch/images/lemniskate.pdf index 063a3e1..9e02c3c 100644 Binary files a/buch/chapters/110-elliptisch/images/lemniskate.pdf and b/buch/chapters/110-elliptisch/images/lemniskate.pdf differ diff --git a/buch/chapters/110-elliptisch/images/lemniskate.tex b/buch/chapters/110-elliptisch/images/lemniskate.tex index f74a81f..fe90631 100644 --- a/buch/chapters/110-elliptisch/images/lemniskate.tex +++ b/buch/chapters/110-elliptisch/images/lemniskate.tex @@ -27,13 +27,16 @@ \draw[color=red,line width=2.0pt] plot[domain=45:\a,samples=100] ({\x}:{sqrt(2*cos(2*\x))}); -\draw[->] (-1.5,0) -- (1.5,0) coordinate[label={$x$}]; -\draw[->] (0,-0.7) -- (0,0.7) coordinate[label={right:$y$}]; +\draw[->] (-1.5,0) -- (1.7,0) coordinate[label={$X$}]; +\draw[->] (0,-0.7) -- (0,0.7) coordinate[label={right:$Y$}]; \fill[color=white] (1,0) circle[radius=0.02]; \draw (1,0) circle[radius=0.02]; +\node at ({1},0) [below] {$\displaystyle a\mathstrut$}; + \fill[color=white] (-1,0) circle[radius=0.02]; \draw (-1,0) circle[radius=0.02]; +\node at ({-1},0) [below] {$\displaystyle\llap{$-$}a\mathstrut$}; \node[color=blue] at (\a:{0.6*sqrt(2*cos(2*\a))}) [below] {$r$}; \node[color=red] at ({\b}:{sqrt(2*cos(2*\b))}) [above] {$s$}; @@ -41,6 +44,14 @@ \fill[color=white] (\a:{sqrt(2*cos(2*\a))}) circle[radius=0.02]; \draw[color=red] (\a:{sqrt(2*cos(2*\a))}) circle[radius=0.02]; +\draw ({sqrt(2)},{-0.1/\skala}) -- ({sqrt(2)},{0.1/\skala}); +\node at ({sqrt(2)},0) [below right] + {$\displaystyle a\mathstrut\sqrt{2}$}; +\draw ({-sqrt(2)},{-0.1/\skala}) -- ({-sqrt(2)},{0.1/\skala}); +\node at ({-sqrt(2)},0) [below left] + {$\displaystyle -a\mathstrut\sqrt{2}$}; + + \end{tikzpicture} \end{document} diff --git a/buch/chapters/110-elliptisch/images/slcl.cpp b/buch/chapters/110-elliptisch/images/slcl.cpp new file mode 100644 index 0000000..8584e94 --- /dev/null +++ b/buch/chapters/110-elliptisch/images/slcl.cpp @@ -0,0 +1,128 @@ +/* + * slcl.cpp + * + * (c) 2022 Prof Dr Andreas Müller, OST Ostschweizer Fachhochschule + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace slcl { + +static struct option longopts[] { +{ "outfile", required_argument, NULL, 'o' }, +{ "a", required_argument, NULL, 'a' }, +{ "b", required_argument, NULL, 'b' }, +{ "steps", required_argument, NULL, 'n' }, +{ NULL, 0, NULL, 0 } +}; + +class plot { + typedef std::pair point_t; + typedef std::vector curve_t; + curve_t _sl; + curve_t _cl; + double _a; + double _b; + int _steps; +public: + double a() const { return _a; } + double b() const { return _b; } + int steps() const { return _steps; } +public: + plot(double a, double b, int steps) : _a(a), _b(b), _steps(steps) { + double l = sqrt(2); + double k = 1 / l; + double m = k * k; + double h = (b - a) / steps; + for (int i = 0; i <= steps; i++) { + double x = a + h * i; + double sn, cn, dn; + gsl_sf_elljac_e(x, m, &sn, &cn, &dn); + _sl.push_back(std::make_pair(l * x, k * sn / dn)); + _cl.push_back(std::make_pair(l * x, cn)); + } + } +private: + std::string point(const point_t p) const { + char buffer[128]; + snprintf(buffer, sizeof(buffer), "({%.4f*\\dx},{%.4f*\\dy})", + p.first, p.second); + return std::string(buffer); + } + std::string path(const curve_t& curve) const { + std::ostringstream out; + auto i = curve.begin(); + out << point(*(i++)); + do { + out << std::endl << " -- " << point(*(i++)); + } while (i != curve.end()); + out.flush(); + return out.str(); + } +public: + std::string slpath() const { + return path(_sl); + } + std::string clpath() const { + return path(_cl); + } +}; + +/** + * \brief Main function for the slcl program + */ +int main(int argc, char *argv[]) { + int longindex; + int c; + double a = 0; + double b = 10; + int steps = 100; + std::ostream *out = &std::cout; + while (EOF != (c = getopt_long(argc, argv, "a:b:o:n:", + longopts, &longindex))) + switch (c) { + case 'a': + a = std::stod(optarg); + break; + case 'b': + b = std::stod(optarg) / sqrt(2); + break; + case 'n': + steps = std::stol(optarg); + break; + case 'o': + out = new std::ofstream(optarg); + break; + } + + plot p(a, b, steps); + (*out) << "\\def\\slpath{ " << p.slpath(); + (*out) << std::endl << " }" << std::endl; + (*out) << "\\def\\clpath{ " << p.clpath(); + (*out) << std::endl << " }" << std::endl; + + out->flush(); + //out->close(); + return EXIT_SUCCESS; +} + +} // namespace slcl + +int main(int argc, char *argv[]) { + try { + return slcl::main(argc, argv); + } catch (const std::exception& e) { + std::cerr << "terminated by exception: " << e.what(); + std::cerr << std::endl; + } catch (...) { + std::cerr << "terminated by unknown exception" << std::endl; + } + return EXIT_FAILURE; +} diff --git a/buch/chapters/110-elliptisch/images/slcl.pdf b/buch/chapters/110-elliptisch/images/slcl.pdf new file mode 100644 index 0000000..493b5fa Binary files /dev/null and b/buch/chapters/110-elliptisch/images/slcl.pdf differ diff --git a/buch/chapters/110-elliptisch/images/slcl.tex b/buch/chapters/110-elliptisch/images/slcl.tex new file mode 100644 index 0000000..08241ac --- /dev/null +++ b/buch/chapters/110-elliptisch/images/slcl.tex @@ -0,0 +1,88 @@ +% +% tikztemplate.tex -- template for standalon tikz images +% +% (c) 2021 Prof Dr Andreas Müller, OST Ostschweizer Fachhochschule +% +\documentclass[tikz]{standalone} +\usepackage{amsmath} +\usepackage{times} +\usepackage{txfonts} +\usepackage{pgfplots} +\usepackage{csvsimple} +\usetikzlibrary{arrows,intersections,math} +\begin{document} +\input{slcldata.tex} +\def\skala{1} +\begin{tikzpicture}[>=latex,thick,scale=\skala] + +% add image content here +\def\lemniscateconstant{2.6220575542} +\pgfmathparse{(3.1415926535/2)/\lemniscateconstant} +\xdef\scalechange{\pgfmathresult} + +\pgfmathparse{\scalechange*(180/3.1415926535)} +\xdef\ts{\pgfmathresult} + +\def\dx{1} +\def\dy{3} + +\draw[line width=0.3pt] + ({\lemniscateconstant*\dx},0) + -- + ({\lemniscateconstant*\dx},{1*\dy}); +\draw[line width=0.3pt] + ({2*\lemniscateconstant*\dx},0) + -- + ({2*\lemniscateconstant*\dx},{-1*\dy}); +\draw[line width=0.3pt] + ({3*\lemniscateconstant*\dx},0) + -- + ({3*\lemniscateconstant*\dx},{-1*\dy}); +\draw[line width=0.3pt] + ({4*\lemniscateconstant*\dx},0) + -- + ({4*\lemniscateconstant*\dx},{1*\dy}); +\draw[line width=0.3pt] + ({5*\lemniscateconstant*\dx},0) + -- + ({5*\lemniscateconstant*\dx},{1*\dy}); + +\draw[color=red!20,line width=1.4pt] + plot[domain=0:13,samples=200] ({\x},{\dy*sin(\ts*\x)}); +\draw[color=blue!20,line width=1.4pt] + plot[domain=0:13,samples=200] ({\x},{\dy*cos(\ts*\x)}); + +\draw[color=red,line width=1.4pt] \slpath; +\draw[color=blue,line width=1.4pt] \clpath; + +\draw[->] (0,{-1*\dy-0.1}) -- (0,{1*\dy+0.4}) coordinate[label={right:$r$}]; +\draw[->] (-0.1,0) -- (13.7,0) coordinate[label={$s$}]; + +\foreach \i in {1,2,3,4,5}{ + \draw ({\lemniscateconstant*\i},-0.1) -- ({\lemniscateconstant*\i},0.1); +} +\node at ({\lemniscateconstant*\dx},0) [below left] {$ \varpi\mathstrut$}; +\node at ({2*\lemniscateconstant*\dx},0) [below left] {$2\varpi\mathstrut$}; +\node at ({3*\lemniscateconstant*\dx},0) [below right] {$3\varpi\mathstrut$}; +\node at ({4*\lemniscateconstant*\dx},0) [below right] {$4\varpi\mathstrut$}; +\node at ({5*\lemniscateconstant*\dx},0) [below left] {$5\varpi\mathstrut$}; + +\node[color=red] at ({1.6*\lemniscateconstant*\dx},{0.6*\dy}) + [below left] {$\operatorname{sl}(s)$}; +\node[color=red!50] at ({1.5*\lemniscateconstant*\dx},{sin(1.5*90)*\dy*0.90}) + [above right] {$\sin \bigl(\frac{\pi}{2\varpi}s\bigr)$}; + +\node[color=blue] at ({1.4*\lemniscateconstant*\dx},{-0.6*\dy}) + [above right] {$\operatorname{cl}(s)$}; +\node[color=blue!50] at ({1.5*\lemniscateconstant*\dx},{cos(1.5*90)*\dy*0.90}) + [below left] {$\cos\bigl(\frac{\pi}{2\varpi}s\bigr)$}; + +\draw (-0.1,{1*\dy}) -- (0.1,{1*\dy}); +\draw (-0.1,{-1*\dy}) -- (0.1,{-1*\dy}); +\node at (0,{1*\dy}) [left] {$1\mathstrut$}; +\node at (0,0) [left] {$0\mathstrut$}; +\node at (0,{-1*\dy}) [left] {$-1\mathstrut$}; + +\end{tikzpicture} +\end{document} + -- cgit v1.2.1