aboutsummaryrefslogtreecommitdiffstats
path: root/buch/chapters/110-elliptisch/images
diff options
context:
space:
mode:
authorAndreas Müller <andreas.mueller@othello.ch>2021-10-25 11:09:09 +0200
committerAndreas Müller <andreas.mueller@othello.ch>2021-10-25 11:09:09 +0200
commit0533f8393a7db2a339bd46a0cb4e430ec4496d2e (patch)
tree20a70f633ffdd176df0ca06271db31b42e16162e /buch/chapters/110-elliptisch/images
parentelliptische Funktionen (diff)
parenttypos (diff)
downloadSeminarSpezielleFunktionen-0533f8393a7db2a339bd46a0cb4e430ec4496d2e.tar.gz
SeminarSpezielleFunktionen-0533f8393a7db2a339bd46a0cb4e430ec4496d2e.zip
Merge branch 'master' of github.com:AndreasFMueller/SeminarSpezielleFunktionen
Diffstat (limited to 'buch/chapters/110-elliptisch/images')
-rw-r--r--buch/chapters/110-elliptisch/images/Makefile25
-rw-r--r--buch/chapters/110-elliptisch/images/ellipsenumfang.m21
-rw-r--r--buch/chapters/110-elliptisch/images/ellipsenumfang.pdfbin0 -> 22986 bytes
-rw-r--r--buch/chapters/110-elliptisch/images/ellipsenumfang.tex83
-rw-r--r--buch/chapters/110-elliptisch/images/rechteck.cpp415
-rw-r--r--buch/chapters/110-elliptisch/images/rechteck.pdfbin0 -> 91630 bytes
-rw-r--r--buch/chapters/110-elliptisch/images/rechteck.tex80
-rw-r--r--buch/chapters/110-elliptisch/images/unvollstaendig.m81
-rw-r--r--buch/chapters/110-elliptisch/images/unvollstaendig.pdfbin0 -> 46390 bytes
-rw-r--r--buch/chapters/110-elliptisch/images/unvollstaendig.tex100
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
new file mode 100644
index 0000000..fc27f21
--- /dev/null
+++ b/buch/chapters/110-elliptisch/images/ellipsenumfang.pdf
Binary files differ
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
new file mode 100644
index 0000000..894091f
--- /dev/null
+++ b/buch/chapters/110-elliptisch/images/rechteck.pdf
Binary files differ
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
new file mode 100644
index 0000000..4da2c0c
--- /dev/null
+++ b/buch/chapters/110-elliptisch/images/unvollstaendig.pdf
Binary files differ
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}
+