diff options
author | Andreas Müller <andreas.mueller@othello.ch> | 2021-10-25 11:09:09 +0200 |
---|---|---|
committer | Andreas Müller <andreas.mueller@othello.ch> | 2021-10-25 11:09:09 +0200 |
commit | 0533f8393a7db2a339bd46a0cb4e430ec4496d2e (patch) | |
tree | 20a70f633ffdd176df0ca06271db31b42e16162e /buch/chapters/110-elliptisch/images | |
parent | elliptische Funktionen (diff) | |
parent | typos (diff) | |
download | SeminarSpezielleFunktionen-0533f8393a7db2a339bd46a0cb4e430ec4496d2e.tar.gz SeminarSpezielleFunktionen-0533f8393a7db2a339bd46a0cb4e430ec4496d2e.zip |
Merge branch 'master' of github.com:AndreasFMueller/SeminarSpezielleFunktionen
Diffstat (limited to '')
-rw-r--r-- | buch/chapters/110-elliptisch/images/Makefile | 25 | ||||
-rw-r--r-- | buch/chapters/110-elliptisch/images/ellipsenumfang.m | 21 | ||||
-rw-r--r-- | buch/chapters/110-elliptisch/images/ellipsenumfang.pdf | bin | 0 -> 22986 bytes | |||
-rw-r--r-- | buch/chapters/110-elliptisch/images/ellipsenumfang.tex | 83 | ||||
-rw-r--r-- | buch/chapters/110-elliptisch/images/rechteck.cpp | 415 | ||||
-rw-r--r-- | buch/chapters/110-elliptisch/images/rechteck.pdf | bin | 0 -> 91630 bytes | |||
-rw-r--r-- | buch/chapters/110-elliptisch/images/rechteck.tex | 80 | ||||
-rw-r--r-- | buch/chapters/110-elliptisch/images/unvollstaendig.m | 81 | ||||
-rw-r--r-- | buch/chapters/110-elliptisch/images/unvollstaendig.pdf | bin | 0 -> 46390 bytes | |||
-rw-r--r-- | buch/chapters/110-elliptisch/images/unvollstaendig.tex | 100 |
10 files changed, 804 insertions, 1 deletions
diff --git a/buch/chapters/110-elliptisch/images/Makefile b/buch/chapters/110-elliptisch/images/Makefile index afa70ba..931564b 100644 --- a/buch/chapters/110-elliptisch/images/Makefile +++ b/buch/chapters/110-elliptisch/images/Makefile @@ -3,11 +3,34 @@ # # (c) 2021 Prof Dr Andreas Müller, OST Ostschweizer Fachhochschule # -all: lemniskate.pdf ellipse.pdf +all: lemniskate.pdf ellipsenumfang.pdf unvollstaendig.pdf rechteck.pdf \ + ellipse.pdf lemniskate.pdf: lemniskate.tex pdflatex lemniskate.tex +ellipsenumfang.pdf: ellipsenumfang.tex ekplot.tex + pdflatex ellipsenumfang.tex + +ekplot.tex: ellipsenumfang.m + octave ellipsenumfang.m + +rechteck: rechteck.cpp + g++ `pkg-config --cflags gsl` `pkg-config --libs gsl` -O -Wall -g -std=c++11 rechteck.cpp -o rechteck + +rechteckpfade.tex: rechteck + ./rechteck --outfile rechteckpfade.tex + +rechteck.pdf: rechteck.tex rechteckpfade.tex + pdflatex rechteck.tex + +unvollstaendig.pdf: unvollstaendig.tex unvollpath.tex + pdflatex unvollstaendig.tex + +unvollpath.tex: unvollstaendig.m + octave unvollstaendig.m + ellipse.pdf: ellipse.tex pdflatex ellipse.tex + diff --git a/buch/chapters/110-elliptisch/images/ellipsenumfang.m b/buch/chapters/110-elliptisch/images/ellipsenumfang.m new file mode 100644 index 0000000..9ac8fe2 --- /dev/null +++ b/buch/chapters/110-elliptisch/images/ellipsenumfang.m @@ -0,0 +1,21 @@ +# +# ellipsenumfang +# +# (c) 2021 Prof Dr Andreas Müller, OST Ostschweizer Fachhochschule +# +f = fopen("ekplot.tex", "w"); +fprintf(f, "\\def\\ekpath{\n"); +fprintf(f, "(0,{\\dy*%.4f})\n", pi / 2); +for epsilon = (1:100) / 100 + [k, e] = ellipke(epsilon^2); + fprintf(f, "--({\\dx*%.4f},{\\dy*%.4f})\n", epsilon, e); +endfor +fprintf(f, "\n}\n"); +fprintf(f, "\\def\\punkte{\n"); +for epsilon = (0.05:0.1:0.95) + [k, e] = ellipke(epsilon^2); + fprintf(f, "\\fill[color=blue] ({\\dx*%.4f},{\\dy*%.4f}) circle[radius=0.08];\n", epsilon, e); + fprintf(f, "\\draw[color=blue,line width=0.2pt] ({\\dx*%.4f},{\\dy*%.4f}) -- ({\\dx*%.4f},{\\dy*1.85});\n", epsilon, e, epsilon); +endfor +fprintf(f,"}\n"); +fclose(f); diff --git a/buch/chapters/110-elliptisch/images/ellipsenumfang.pdf b/buch/chapters/110-elliptisch/images/ellipsenumfang.pdf Binary files differnew file mode 100644 index 0000000..fc27f21 --- /dev/null +++ b/buch/chapters/110-elliptisch/images/ellipsenumfang.pdf diff --git a/buch/chapters/110-elliptisch/images/ellipsenumfang.tex b/buch/chapters/110-elliptisch/images/ellipsenumfang.tex new file mode 100644 index 0000000..0d1b807 --- /dev/null +++ b/buch/chapters/110-elliptisch/images/ellipsenumfang.tex @@ -0,0 +1,83 @@ +% +% ellipsenumfang.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{ekplot.tex} +\def\skala{1.19} +\begin{tikzpicture}[>=latex,thick,scale=\skala] + +\pgfkeys{/pgf/number format/.cd, fixed, fixed zerofill, precision=1} + +\def\dx{10} +\def\dy{4} + +%\draw[line width=0.4pt] (0,\dy) -- (10,\dy); +%\draw[line width=0.4pt] (\dx,0) -- (10,\dy); + +\draw[->] (0,{\dy-0.1}) -- (0,7.0) coordinate[label={left:$E(k=\varepsilon)$}]; +\draw[->] (-0.1,\dy) -- (10.5,\dy) coordinate[label={$\varepsilon$}]; + +\foreach \i in {0,...,10}{ + \pgfmathparse{\i/10} + \xdef\wert{\pgfmathresult} + \draw (\i,{\dy-0.1}) -- (\i,{\dy+0.1}); + \node at (\i,{\dy-0.1}) [below] {$\pgfmathprintnumber{\wert}$}; +} + +\draw[color=red,line width=1.4pt] \ekpath; +\fill[color=red] (\dx,\dy) circle[radius=0.07]; + +\foreach \y in {1.0,1.2,1.4}{ + \draw (-0.1,{\dy*\y}) -- (0.1,{\dy*\y}); + \node at (-0.1,{\dy*\y}) [left] {$\pgfmathprintnumber{\y}$}; +} + +\draw (-0.1,{\dy*3.14159/2}) -- (0.1,{\dy*3.14159/2}); +\node at (0,{\dy*3.14159/2}) [left] {$\displaystyle\frac{\pi}2$}; + + +\punkte + +\foreach \exzentrizitaet in {0.05,0.15,...,0.95}{ + \pgfmathparse{sqrt(1-\exzentrizitaet*\exzentrizitaet)} + \xdef\halbachse{\pgfmathresult} + + \pgfmathparse{\exzentrizitaet*\dx} + \xdef\mitte{\pgfmathresult} + %\node at (\mitte,1) {$\pgfmathprintnumber{\mitte}$}; + + \pgfmathparse{(1-\exzentrizitaet)} + \xdef\breite{\halbachse} + %\node at (\mitte,0.5) {$\pgfmathprintnumber{\breite}$}; + + \begin{scope} + + \clip ({\mitte-(\breite/2)},{1.8*\dy}) + rectangle ({\mitte+(\breite/2)+0.1},{1.8*\dy+1.1}); + \fill[color=blue!20] ({\mitte-\breite/2},{1.8*\dy}) + ellipse({\breite} and 1); + \draw[color=blue,line width=1.4pt] + ({\mitte-\breite/2},{1.8*\dy}) + ellipse({\breite} and 1); + \draw[color=blue,line width=0.2pt] + ({\mitte-\breite/2},{1.8*\dy+1}) + -- + ({\mitte-\breite/2},{1.8*\dy}) + -- + ({\mitte+\breite/2},{1.8*\dy}); + \end{scope} +} + + +\end{tikzpicture} +\end{document} + diff --git a/buch/chapters/110-elliptisch/images/rechteck.cpp b/buch/chapters/110-elliptisch/images/rechteck.cpp new file mode 100644 index 0000000..c65ae0f --- /dev/null +++ b/buch/chapters/110-elliptisch/images/rechteck.cpp @@ -0,0 +1,415 @@ +/* + * rechteck.cpp + * + * (c) 2021 Prof Dr Andreas Müller, OST Ostschweizer Fachhochschule + */ +#include <cmath> +#include <cstdlib> +#include <cstdio> +#include <complex> +#include <iostream> +#include <fstream> +#include <list> +#include <getopt.h> +#include <gsl/gsl_sf_ellint.h> + +double ast = 1; + +/** + * \brief Base class for integrands + */ +class integrand { +protected: + double _k; +public: + double k() const { return _k; } + integrand(double k) : _k(k) { } + virtual std::complex<double> operator()(const std::complex<double>& z) const = 0; + static double kprime(double k); +}; + +double integrand::kprime(double k) { + return sqrt(1 - k*k); +} + +/** + * \brief Elliptic integral of the first kind + */ +class integrand1 : public integrand { +public: + integrand1(double k) : integrand(k) { } + virtual std::complex<double> operator()( + const std::complex<double>& z) const { + std::complex<double> square = z * z; + std::complex<double> eins(1.0); + std::complex<double> result = eins + / sqrt((eins - square) * (eins - k() * k() * square)); + return ast * ((result.imag() < 0) ? -result : result); + } +}; + +/** + * \brief A class to trace curves + */ +class curvetracer { + const integrand& _f; +public: + typedef std::list<std::complex<double> > curve_t; + curvetracer(const integrand& f) : _f(f) { } + + std::complex<double> startpoint(const std::complex<double>& z, + int n = 100) const; + + std::complex<double> segment(const std::complex<double>& z1, + const std::complex<double>& z2, int n) const; + + std::pair<std::complex<double>,std::complex<double> > segmentl( + const std::complex<double>& start, + const std::complex<double>& dir, + double stepsize, int n = 10) const; + + curve_t trace(const std::complex<double>& startz, + const std::complex<double>& dir, + const std::complex<double>& startw, + int maxsteps) const; + + static curve_t mirrorx(const curve_t& c); + static curve_t mirrory(const curve_t& c); + static curve_t mirror(const curve_t& c); +}; + +/** + * \brief Perform integration for a + * + * \param z1 the start point of the segment in the domain + * \param z2 the end point of the segment in the domain + * \param n the number of integration steps to use + * \return the increment along that segment + */ +std::complex<double> curvetracer::segment(const std::complex<double>& z1, + const std::complex<double>& z2, int n = 100) const { + std::complex<double> dz = z2 - z1; + std::complex<double> summe(0); + double h = 1. / (2 * n); + for (int i = 1; i < 2 * n; i += 2) { + double t = i * h; + std::complex<double> z = (1 - t) * z1 + t * z2; + summe += _f(z); + } + return dz * h * summe * 2.; +} + +/** + * \brief Exception thrown when the number of iterations is exceeded + */ +class toomanyiterations : public std::runtime_error { +public: + toomanyiterations(const std::string& cause) + : std::runtime_error(cause) { + } +}; + +/** + * \brief Perform integration with a given target length + * + * \param start the start point + * \param dir the direction in which to integrate + * \param stepsize the required length of the step + * \param n the number of integration steps + * \return the increment in the range by this segment + */ +std::pair<std::complex<double>, std::complex<double> > curvetracer::segmentl( + const std::complex<double>& start, + const std::complex<double>& dir, + double stepsize, + int n) const { + std::complex<double> s(0.); + std::complex<double> z = start; + int counter = 100; + while (abs(s) < stepsize) { + s = s + segment(z, z + dir, n); + z = z + dir; + if (counter-- == 0) { + throw toomanyiterations("too many iterations"); + } + } + return std::make_pair(z, s); +} + +/** + * \brief Trace a curve from a starting point in the domain + * + * \param startz the start point of the curve in the domain + * \param dir the direction of the curve in the domain + * \param startw the initial function value where the curve starts in + * the range + * \param maxsteps the maximum number of dir-steps before giving up + * \return the curve as a list of points + */ +curvetracer::curve_t curvetracer::trace(const std::complex<double>& startz, + const std::complex<double>& dir, + const std::complex<double>& startw, + int maxsteps) const { + curve_t result; + std::complex<double> z = startz; + std::complex<double> w = startw; + result.push_back(w); + while (maxsteps-- > 0) { + try { + auto seg = segmentl(z, dir, abs(dir), 40); + z = seg.first; + w = w + seg.second; + result.push_back(w); + } catch (const toomanyiterations& x) { + std::cerr << "iterations exceeded after "; + std::cerr << result.size(); + std::cerr << " points"; + maxsteps = 0; + } + } + return result; +} + +/** + * \brief Find the initial point for a coordinate curve + * + * \param k the elliptic integral parameter + * \param z the desired starting point argument + */ +std::complex<double> curvetracer::startpoint(const std::complex<double>& z, + int n) const { + std::cerr << "start at " << z.real() << "," << z.imag() << std::endl; + return segment(std::complex<double>(0.), z, n); +} + + +curvetracer::curve_t curvetracer::mirrorx(const curve_t& c) { + curve_t result; + for (auto z : c) { + result.push_back(-std::conj(z)); + } + return result; +} + +curvetracer::curve_t curvetracer::mirrory(const curve_t& c) { + curve_t result; + for (auto z : c) { + result.push_back(std::conj(z)); + } + return result; +} + +curvetracer::curve_t curvetracer::mirror(const curve_t& c) { + curve_t result; + for (auto z : c) { + result.push_back(-z); + } + return result; +} + +/** + * \brief Class to draw the curves to a file + */ +class curvedrawer { + std::ostream *_out; + std::string _color; +public: + curvedrawer(std::ostream *out) : _out(out), _color("red") { } + const std::string& color() const { return _color; } + void color(const std::string& c) { _color = c; } + void operator()(const curvetracer::curve_t& curve); + std::ostream *out() { return _out; } +}; + +/** + * \brief Operator to draw a curve + * + * \param curve the curve to draw + */ +void curvedrawer::operator()(const curvetracer::curve_t& curve) { + double first = true; + for (auto z : curve) { + if (first) { + *_out << "\\draw[color=" << _color << "] "; + first = false; + } else { + *_out << std::endl << " -- "; + } + *_out << "({" << z.real() << "*\\dx},{" << z.imag() << "*\\dy})"; + } + *_out << ";" << std::endl; +} + +static struct option longopts[] = { +{ "outfile", required_argument, NULL, 'o' }, +{ "k", required_argument, NULL, 'k' }, +{ "deltax", required_argument, NULL, 'd' }, +{ NULL, 0, NULL, 0 } +}; + +/** + * \brief Main function + */ +int main(int argc, char *argv[]) { + double k = 0.625; + double deltax = 0.2; + + int c; + int longindex; + std::string outfilename; + while (EOF != (c = getopt_long(argc, argv, "o:k:d:", longopts, + &longindex))) + switch (c) { + case 'd': + deltax = std::stod(optarg); + break; + case 'o': + outfilename = std::string(optarg); + break; + case 'k': + k = std::stod(optarg); + break; + } + + double kprime = integrand::kprime(k); + + double xmax = gsl_sf_ellint_Kcomp(k, GSL_PREC_DOUBLE); + double ymax = gsl_sf_ellint_Kcomp(kprime, GSL_PREC_DOUBLE); + std::cout << "xmax = " << xmax << std::endl; + std::cout << "ymax = " << ymax << std::endl; + + curvedrawer *cdp; + std::ofstream *outfile = NULL; + if (outfilename.c_str()) { + outfile = new std::ofstream(outfilename.c_str()); + } + if (outfile) { + cdp = new curvedrawer(outfile); + } else { + cdp = new curvedrawer(&std::cout); + } + + integrand1 f(k); + curvetracer ct(f); + + // fill + (*cdp->out()) << "\\fill[color=red!10] ({" << (-xmax) << "*\\dx},0) " + << "rectangle ({" << xmax << "*\\dx},{" << ymax << "*\\dy});" + << std::endl; + (*cdp->out()) << "\\fill[color=blue!10] ({" << (-xmax) << "*\\dx},{" + << (-ymax) << "*\\dy}) rectangle ({" << xmax << "*\\dx},0);" + << std::endl; + + // "circles" + std::complex<double> dir(0.01, 0); + for (double im = deltax; im < 3; im += deltax) { + std::complex<double> startz(0, im); + std::complex<double> startw = ct.startpoint(startz); + curvetracer::curve_t curve = ct.trace(startz, dir, + startw, 1000); + cdp->color("red"); + (*cdp)(curve); + (*cdp)(curvetracer::mirrorx(curve)); + cdp->color("blue"); + (*cdp)(curvetracer::mirrory(curve)); + (*cdp)(curvetracer::mirror(curve)); + } + + // imaginary axis + (*cdp->out()) << "\\draw[color=red] (0,0) -- (0,{" << ymax + << "*\\dy});" << std::endl; + (*cdp->out()) << "\\draw[color=blue] (0,0) -- (0,{" << (-ymax) + << "*\\dy});" << std::endl; + + // arguments between 0 and 1 + dir = std::complex<double>(0, 0.01); + for (double re = 0.2; re < 1; re += 0.2) { + std::complex<double> startz(re, 0.001); + std::complex<double> startw = ct.startpoint(startz); + startw = std::complex<double>(startw.real(), 0); + curvetracer::curve_t curve = ct.trace(startz, dir, + startw, 1000); + cdp->color("red"); + (*cdp)(curve); + (*cdp)(curvetracer::mirrorx(curve)); + cdp->color("blue"); + (*cdp)(curvetracer::mirrory(curve)); + (*cdp)(curvetracer::mirror(curve)); + } + + // argument 1 (singularity) + { + std::complex<double> startz(1.); + std::complex<double> startw(xmax); + curvetracer::curve_t curve = ct.trace(startz, dir, + startw, 1000); + cdp->color("red"); + (*cdp)(curve); + (*cdp)(curvetracer::mirrorx(curve)); + cdp->color("blue"); + (*cdp)(curvetracer::mirror(curve)); + (*cdp)(curvetracer::mirrory(curve)); + } + + // arguments between 1 and 1/k + { + for (double x0 = 1 + deltax; x0 < 1/k; x0 += deltax) { + double y0 = sqrt(1-1/(x0*x0))/kprime; + //std::cout << "y0 = " << y0 << std::endl; + double y = gsl_sf_ellint_F(asin(y0), kprime, + GSL_PREC_DOUBLE); + std::complex<double> startz(x0); + std::complex<double> startw(xmax, y); + curvetracer::curve_t curve = ct.trace(startz, dir, + startw, 1000); + cdp->color("red"); + (*cdp)(curve); + (*cdp)(curvetracer::mirrorx(curve)); + cdp->color("blue"); + (*cdp)(curvetracer::mirror(curve)); + (*cdp)(curvetracer::mirrory(curve)); + } + } + + // argument 1/k +#if 0 + { + std::complex<double> startz(1/k); + std::complex<double> startw(xmax, ymax); + curvetracer::curve_t curve = ct.trace(startz, dir, + startw, 1000); + cdp->color("red"); + (*cdp)(curve); + (*cdp)(curvetracer::mirrorx(curve)); + cdp->color("blue"); + (*cdp)(curvetracer::mirror(curve)); + (*cdp)(curvetracer::mirrory(curve)); + } +#endif + + // arguments larger than 1/k + { + dir = std::complex<double>(0, 0.01); + double x0 = 1; + while (x0 <= 1/k + 0.0001) { x0 += deltax; } + for (; x0 < 4; x0 += deltax) { + std::complex<double> startz(x0); + std::complex<double> startw(gsl_sf_ellint_F( + asin(1/(k*x0)), k, GSL_PREC_DOUBLE), ymax); + curvetracer::curve_t curve = ct.trace(startz, dir, + startw, 1000); + cdp->color("red"); + (*cdp)(curve); + (*cdp)(curvetracer::mirrorx(curve)); + cdp->color("blue"); + (*cdp)(curvetracer::mirror(curve)); + (*cdp)(curvetracer::mirrory(curve)); + } + } + + // border + (*cdp->out()) << "\\def\\xmax{" << xmax << "}" << std::endl; + (*cdp->out()) << "\\def\\ymax{" << ymax << "}" << std::endl; + + return EXIT_SUCCESS; +} diff --git a/buch/chapters/110-elliptisch/images/rechteck.pdf b/buch/chapters/110-elliptisch/images/rechteck.pdf Binary files differnew file mode 100644 index 0000000..894091f --- /dev/null +++ b/buch/chapters/110-elliptisch/images/rechteck.pdf diff --git a/buch/chapters/110-elliptisch/images/rechteck.tex b/buch/chapters/110-elliptisch/images/rechteck.tex new file mode 100644 index 0000000..622a9e9 --- /dev/null +++ b/buch/chapters/110-elliptisch/images/rechteck.tex @@ -0,0 +1,80 @@ +% +% rechteck.tex -- rechteck für Wertebereich der ell. Integrale +% +% (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} +\def\skala{1} +\begin{tikzpicture}[>=latex,thick,scale=\skala] + +\def\dx{3} +\def\dy{3} + +\input{rechteckpfade.tex} + +\begin{scope} + \clip ({-\xmax*\dx},{-\ymax*\dy}) rectangle ({\xmax*\dx},{\ymax*\dy}); + \fill[color=red!10] (0,{\ymax*\dy}) circle[radius=0.45]; + \fill[color=blue!10] (0,{-\ymax*\dy}) circle[radius=0.45]; + \draw[color=gray!80] (0,{\ymax*\dy}) -- (0,{\ymax*\dy-0.45}); + \draw[color=gray!80] (0,{-\ymax*\dy}) -- (0,{-\ymax*\dy+0.45}); +\end{scope} + +\draw ({-\xmax*\dx},{-\ymax*\dy}) rectangle ({\xmax*\dx},{\ymax*\dy}); + +\draw[->] ({-\xmax*\dx-0.3},0) -- ({\xmax*\dx+0.9},0) + coordinate[label={$\operatorname{Re}F(k,z)$}]; + +\draw[<->,line width=0.7pt] + ({-\xmax*\dx},{\ymax*\dy+0.2}) + -- + ({\xmax*\dx},{\ymax*\dy+0.2}); +\draw[line width=0.2pt] + ({-\xmax*\dx},{\ymax*\dy}) + -- + ({-\xmax*\dx},{\ymax*\dy+0.3}); +\draw[line width=0.2pt] + ({\xmax*\dx},{\ymax*\dy}) + -- + ({\xmax*\dx},{\ymax*\dy+0.3}); + +\node at ({-0.5*\xmax*\dx},{\ymax*\dy+0.2}) [above] {$2K(k)$}; +\draw[->] (0,{\ymax*\dy}) -- (0,{\ymax*\dy+0.7}) + coordinate[label={right:$\operatorname{Im}F(k,z)$}]; +\draw (0,{-\ymax*\dy}) -- (0,{-\ymax*\dy-0.2}); + +\draw[line width=0.2pt] + ({-\xmax*\dx-0.3},{-\ymax*\dy}) + -- + ({-\xmax*\dx},{-\ymax*\dy}); +\draw[line width=0.2pt] + ({-\xmax*\dx-0.3},{\ymax*\dy}) + -- + ({-\xmax*\dx},{\ymax*\dy}); +\draw[<->,line width=0.7pt] + ({-\xmax*\dx-0.2},{\ymax*\dy}) + -- + ({-\xmax*\dx-0.2},0); + +\node at ({-\xmax*\dx-0.2},{-0.5*\ymax*\dy}) [rotate=90,above] {$K(k')$}; +\node at ({-\xmax*\dx-0.2},{0.5*\ymax*\dy}) [rotate=90,above] {$K(k')$}; + +\draw[<->,line width=0.7pt] + ({-\xmax*\dx-0.2},{-\ymax*\dy}) + -- + ({-\xmax*\dx-0.2},0); + +\node at ({\xmax*\dx},{\ymax*\dy}) [right] {$K(k)+iK(k')$}; +\fill[color=white] ({\xmax*\dx},{\ymax*\dy}) circle[radius=0.05]; +\draw ({\xmax*\dx},{\ymax*\dy}) circle[radius=0.05]; + +\end{tikzpicture} +\end{document} + diff --git a/buch/chapters/110-elliptisch/images/unvollstaendig.m b/buch/chapters/110-elliptisch/images/unvollstaendig.m new file mode 100644 index 0000000..25196d0 --- /dev/null +++ b/buch/chapters/110-elliptisch/images/unvollstaendig.m @@ -0,0 +1,81 @@ +# +# unvollstaendig.m +# +# (c) 2021 Prof Dr Andreas Müller, OST Ostschweizer Fachhochschule +# +global N; +N = 200; +global n; +n = 5; + +function retval = integrand_f(t, k) + retval = 1 / sqrt((1 - t^2) * (1 - k^2 * t^2)); +endfunction + +function retval = integrand_e(t, k) + retval = sqrt((1-k^2*t^2)/(1-t^2)); +endfunction + +function retval = integrand_pi(n, t, k) + retval = 1 / ((1-n*t^2) * sqrt((1-k^2*t^2)*(1-t^2))); +endfunction + +function retval = elliptisch1(f, name, k) + global N; + global n; + s = 0; + fprintf(f, "\\def\\ell%s{ (0,0)", name); + delta = 1 / N; + for x = (0:delta:(1-delta)) + h = delta / n; + for t = (x+h/2:h:x+delta) + s = s + integrand_f(t, k) * h; + endfor + fprintf(f, "\n -- ({\\dx*%.4f},{\\dy*%.4f})", x + delta, s); + endfor + fprintf(f, "}\n"); +endfunction + +function retval = elliptisch2(f, name, k) + global N; + global n; + s = 0; + fprintf(f, "\\def\\ell%s{ (0,0)", name); + delta = 1 / N; + for x = (0:delta:(1-delta)) + h = delta / n; + for t = (x+h/2:h:x+delta) + s = s + integrand_e(t, k) * h; + endfor + fprintf(f, "\n -- ({\\dx*%.4f},{\\dy*%.4f})", x + delta, s); + endfor + fprintf(f, "\n}\n"); +endfunction + +fn = fopen("unvollpath.tex", "w"); + +elliptisch1(fn, "Fzero", 0.0); +elliptisch1(fn, "Fone", 0.1); +elliptisch1(fn, "Ftwo", 0.2); +elliptisch1(fn, "Fthree", 0.3); +elliptisch1(fn, "Ffour", 0.4); +elliptisch1(fn, "Ffive", 0.5); +elliptisch1(fn, "Fsix", 0.6); +elliptisch1(fn, "Fseven", 0.7); +elliptisch1(fn, "Feight", 0.8); +elliptisch1(fn, "Fnine", 0.9); +elliptisch1(fn, "Ften", 1.0); + +elliptisch2(fn, "Ezero", 0.0); +elliptisch2(fn, "Eone", 0.1); +elliptisch2(fn, "Etwo", 0.2); +elliptisch2(fn, "Ethree", 0.3); +elliptisch2(fn, "Efour", 0.4); +elliptisch2(fn, "Efive", 0.5); +elliptisch2(fn, "Esix", 0.6); +elliptisch2(fn, "Eseven", 0.7); +elliptisch2(fn, "Eeight", 0.8); +elliptisch2(fn, "Enine", 0.9); +elliptisch2(fn, "Eten", 1.0); + +fclose(fn); diff --git a/buch/chapters/110-elliptisch/images/unvollstaendig.pdf b/buch/chapters/110-elliptisch/images/unvollstaendig.pdf Binary files differnew file mode 100644 index 0000000..4da2c0c --- /dev/null +++ b/buch/chapters/110-elliptisch/images/unvollstaendig.pdf diff --git a/buch/chapters/110-elliptisch/images/unvollstaendig.tex b/buch/chapters/110-elliptisch/images/unvollstaendig.tex new file mode 100644 index 0000000..1a1af13 --- /dev/null +++ b/buch/chapters/110-elliptisch/images/unvollstaendig.tex @@ -0,0 +1,100 @@ +% +% unvollstaendig.tex -- Plots der unvollständigen elliptischen integrale +% +% (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} +\input{unvollpath.tex} +\begin{document} +\def\skala{1} +\begin{tikzpicture}[>=latex,thick,scale=\skala] + +\pgfkeys{/pgf/number format/.cd, fixed, fixed zerofill, precision=1} + +\def\dx{12.8} +\def\dy{6} + +\definecolor{darkgreen}{rgb}{0,0.6,0} +\definecolor{blau}{rgb}{0.3,0.3,1} + +\begin{scope} +\begin{scope} +\clip (-0.1,-0.1) rectangle ({\dx+0.0},{10.1}); + +\fill[color=darkgreen!10] \ellEzero -- (\dx,{1.571*\dy}) -- (\dx,0) -- cycle; +\fill[color=red!10] \ellEzero -- (\dx,{1.571*\dy}) -- (\dx,10.1) -- (0,10.2) -- cycle; + +\node[color=red] at ({0.6*\dx},{1.3*\dy}) [scale=2] {$F(x,k)$}; +\node[color=darkgreen] at ({0.6*\dx},{0.3*\dy}) [scale=2] {$E(x,k)$}; + + +\draw[color=red!0!blau,line width=1.0pt] \ellFzero; +\draw[color=red!10!blau,line width=1.0pt] \ellFone; +\draw[color=red!20!blau,line width=1.0pt] \ellFtwo; +\draw[color=red!30!blau,line width=1.0pt] \ellFthree; +\draw[color=red!40!blau,line width=1.0pt] \ellFfour; +\draw[color=red!50!blau,line width=1.0pt] \ellFfive; +\draw[color=red!60!blau,line width=1.0pt] \ellFsix; +\draw[color=red!70!blau,line width=1.0pt] \ellFseven; +\draw[color=red!80!blau,line width=1.0pt] \ellFeight; +\draw[color=red!90!blau,line width=1.0pt] \ellFnine; +\draw[color=red!100!blau,line width=1.0pt] \ellFten; + +\draw[color=darkgreen!100!blau,line width=1.0pt] \ellEten; +\draw[color=darkgreen!90!blau,line width=1.0pt] \ellEnine; +\draw[color=darkgreen!80!blau,line width=1.0pt] \ellEeight; +\draw[color=darkgreen!70!blau,line width=1.0pt] \ellEseven; +\draw[color=darkgreen!60!blau,line width=1.0pt] \ellEsix; +\draw[color=darkgreen!50!blau,line width=1.0pt] \ellEfive; +\draw[color=darkgreen!40!blau,line width=1.0pt] \ellEfour; +\draw[color=darkgreen!30!blau,line width=1.0pt] \ellEthree; +\draw[color=darkgreen!20!blau,line width=1.0pt] \ellEtwo; +\draw[color=darkgreen!10!blau,line width=1.0pt] \ellEone; +\draw[color=darkgreen!0!blau,line width=1.0pt] \ellEzero; + +\end{scope} + +\draw[line width=0.2pt] (\dx,0) -- (\dx,10.1); + +\begin{scope} + \clip ({0.7*\dx},0) rectangle (\dx,10.1); + \draw[color=white,line width=0.5pt] \ellEzero -- (\dx,{1.571*\dy}); +\end{scope} + +\draw[->] ({-0.1},0) -- ({\dx+0.3},0) coordinate[label={$x$}]; +\foreach \x in {0,0.2,...,1.0}{ + \draw ({\x*\dx},-0.1) -- ({\x*\dx},0.1); + \node at ({\x*\dx},0) [below] {$\pgfmathprintnumber{\x}$}; +} +\draw[->] (0,{-0.1}) -- (0,{10.3}) coordinate[label={right:$y$}]; +\foreach \y in {0.5,1,1.5}{ + %\draw[line width=0.2pt] (0,{\y*\dy}) -- (\dx,{\y*\dy}); + \draw (-0.1,{\y*\dy}) -- (0.1,{\y*\dy}); + \node at (0,{\y*\dy}) [left] {$\pgfmathprintnumber{\y}$}; +} +\foreach \c in {0,10,...,100}{ + \pgfmathparse{\c/100} + \xdef\k{\pgfmathresult} + \node[color=red!\c!blau] at ({0.02*\dx},{0.95*\dy+0.04*\c}) + [right] {$k=\pgfmathprintnumber{\k}$}; +} +\foreach \c in {0,10,...,100}{ + \pgfmathparse{\c/100} + \xdef\k{\pgfmathresult} + \node[color=darkgreen!\c!blau] at ({0.98*\dx},{0.75*\dy-0.04*\c}) + [left] {$k=\pgfmathprintnumber{\k}$}; +} + +\draw ({\dx-0.1},{1.571*\dy}) -- ({\dx+0.1},{1.571*\dy}); +\node at (\dx,{1.571*\dy}) [right] {$\frac{\pi}2$}; +\end{scope} + +\end{tikzpicture} +\end{document} + |