5
1

Hallo,

ich würde gerne drei verschieden Plots auf einer Seite einrichten. Am besten alle drei nebeneinander. In jedem Plot soll die Funktion f gezeichnet sein und zudem eine Partialsumme SN [siehe Bild]. Man kann es für die Partialsumme sicherlich einrichten, dass man (bzw. später ich) noch den Paramter N variieren lassen kann. Vielleicht hat da ja jemand Ideen. Ich habe in meinem Dokument schon Plots mit TikZ, die so ähnlich aussehen wie der Quellcode unten (zur Orientierung des Stils). Hier sind f und SN und ein kleiner Plott mit Geogebra für N=1, N=2 und N=3. Ich hoffe, man kann sich vorstellen, was ich vorhabe :-) LG Niklas

alt text alt text alt text

Open in writeLaTeX
\begin{tikzpicture}
    %Raster zeichnen
    %\draw [color=gray!50]  [step=5mm] (0,-2) grid (7,2);
    % Achsen zeichnen
    \draw[->,thick] (-4,0) -- (4,0) node[right] {$x$};
    \draw[->,thick] (0,-2.3) -- (0,2.3) node[above] {$y$};
    % Achsen beschriften
    \draw (1,-.2) -- (1,0) node[below=4pt] {$\scriptstyle1$};
    \draw (3.141,-.2) -- (3.141,0) node[below=4pt] {$\scriptstyle \pi$};
    \foreach \y in {-2,-1,0,1,2}
    \draw (-.1,\y) -- (.1,\y) node[left=4pt] {$\scriptstyle\y$};

\end{tikzpicture}

gefragt 22 Apr '14, 17:53

uniQue_'s gravatar image

uniQue_
1094611
Akzeptiert-Rate: 0%

bearbeitet 24 Apr '14, 22:03

cgnieder's gravatar image

cgnieder
22.1k253463

@cis: Man kann mit directluat{} eine Funktion schreiben und diese für den Plot aufrufen. Ich bin überhaupt kein Eperte und hoffe deshalb, dass jemand eine schöne Lösung oder Idee hat.

(22 Apr '14, 19:39) uniQue_

Nur pgfplots

Mit einigen verschachtelten \foreach kann man leicht summieren.

Open in writeLaTeX
\documentclass{article}
\pagestyle{empty}% for cropping
\usepackage{mathtools,pgfplots}
\begin{document}
\begin{align*}
    f(x) &=
    \begin{cases*}
        -1 & f\"ur $-\frac12<x<0$ \\
        1 & f\"ur $0\le x<\frac12$ \\
    \end{cases*} \\
    S_N(f)(x) &= \sum_{m=1}^N \frac4\pi \frac{\sin((2m-1)\pi x)}{2m-1}
\end{align*}
\begin{tikzpicture}
    \begin{axis}[
        no markers,
        samples=100,
        smooth,
        domain=-1.2:1.4,
        axis lines=middle,
        width=\linewidth
    ]
        \pgfplotsinvokeforeach{1,...,4}{
            \xdef\sn{}
            \foreach \m in {1,...,#1} {
                \xdef\sn{\sn+4/pi*sin(deg((2*\m-1)*pi*x))/(2*\m-1)}
            }
            \expandafter\addplot\expandafter{\sn};
            \addlegendentry{$S_{#1}(f)(x)$};
        }

        \begin{scope}[
                every node/.style = {draw,fill=blue,circle,inner sep=1pt}
            ]
            \draw (axis cs:0,1) node[label={[blue]above right:A}] {} -- (axis cs:0.5,1) node[label={[blue]above right:B}] {};
            \draw (axis cs:0,-1) node[label={[blue]above right:C}] {} -- (axis cs:-0.5,-1) node[label={[blue]above right:E}] {};            
        \end{scope}
    \end{axis}
\end{tikzpicture}
\end{document}

alt text

pgfplots mit gnuplot

Dieses muss mit --shell-escape gesetzt werden. Die Ausgabe wird nicht nochmal gezeigt, da sie gleich aussieht.

Open in writeLaTeX
\documentclass{article}
\pagestyle{empty}% for cropping
\usepackage{mathtools,pgfplots}
\begin{document}
\begin{align*}
    f(x) &=
    \begin{cases*}
        -1 & f\"ur $-\frac12<x<0$ \\
        1 & f\"ur $0\le x<\frac12$ \\
    \end{cases*} \\
    S_N(f)(x) &= \sum_{m=1}^N \frac4\pi \frac{\sin((2m-1)\pi x)}{2m-1}
\end{align*}
\begin{tikzpicture}
    \begin{axis}[
        no markers,
        smooth,
        axis lines=middle,
        width=\linewidth
    ]
    \pgfplotsinvokeforeach{1,...,4}{
        \addplot gnuplot[raw gnuplot] {plot[-1.2:1.4] sum[m=1:#1] (4/pi*sin((2*m-1)*pi*x)/(2*m-1))};
    }
    \end{axis}
\end{tikzpicture}
\end{document}

Anwendungsfall

Mit dem Paket subcaption kann man leicht mehrere Bilder nebeneinander anordnen und wenn man die \foreach-Schleife außen rum baut, spart man sich noch viel Schreibarbeit.

Open in writeLaTeX
\documentclass{article}
\pagestyle{empty}% for cropping
\usepackage{mathtools,pgfplots,subcaption}
\begin{document}
\begin{align*}
    f(x) &=
    \begin{cases*}
        -1 & f\"ur $-\frac12<x<0$ \\
        1 & f\"ur $0\le x<\frac12$ \\
    \end{cases*} \\
    S_N(f)(x) &= \sum_{m=1}^N \frac4\pi \frac{\sin((2m-1)\pi x)}{2m-1}
\end{align*}
\begin{figure}
    \centering
    \foreach \N in {1,...,3} {
        \begin{subfigure}{0.49\textwidth}
            \centering
            \begin{tikzpicture}
                \begin{axis}[
                        no markers,
                        samples=100,
                        smooth,
                        domain=-1.2:1.4,
                        axis lines=middle,
                        width=\linewidth,
                    ]
                    \xdef\sn{}
                    \foreach \m in {1,...,\N} {
                        \xdef\sn{\sn+4/pi*sin(deg((2*\m-1)*pi*x))/(2*\m-1)}
                    }
                    \expandafter\addplot\expandafter{\sn};
                    \begin{scope}[
                            every node/.style = {draw,fill=blue,circle,inner sep=1pt}
                        ]
                        \draw (axis cs:0,1) node {} -- (axis cs:0.5,1) node {};
                        \draw (axis cs:0,-1) node {} -- (axis cs:-0.5,-1) node {};
                    \end{scope}
                \end{axis}
            \end{tikzpicture}
            \caption{$S_{\N}(f)(x)$}
        \end{subfigure}
    }
    \caption{Entwicklung in Partialsummen.}
\end{figure}
\end{document}

alt text


Nur pgfplots

Zum Spaß mal für N = 1,2,3,...,100. Laut dem Unix-Tool time dauert der Aufruf

Open in writeLaTeX
time pdflatex plot.tex

bei folgenden Rechner-Spezifikationen

Open in writeLaTeX
Model Identifier: iMac13,1
Processor Name: Intel Core i5
Processor Speed: 2.7 GHz
Number of Processors: 1
Total Number of Cores: 4
Memory: 8 GB

stolze 14 Minuten und 51 Sekunden, sieht aber cool aus :-)

alt text

Permanenter link

beantwortet 22 Apr '14, 20:56

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

bearbeitet 23 Apr '14, 08:52

@Henri, das sieht ja großartig aus! Gibt es noch eine elegante Lösung drei einzelne Plots in jeweils drei verschiedenen Graphiken nebeneinander darzustellen?

(22 Apr '14, 22:09) uniQue_

@Henri Da hast du dich ja wieder übertroffen! Großartig. Ich habe gerade ein wenig rumgespielt und mich für 4 Graphen entschieden, wie du siehst. Ich habe auch mal sample von 100 auf 250 gestellt, da die Plots für große N an den Sprungstellen unschön werden. Könntest du mir nochmal ein letztes mal helfen

  • die Beschriftung der y-Achse auf die rechte Seite zu setzen, damit Graph und Beschriftung sich nicht überschneiden
  • die y-Achse ein wenig verlängern, sodass man den Peak bei 0 besser erkennen kann.
\documentclass{article}
\pagestyle{empty}% for cropping
\usepackage{mathtools,pgfplots,subcaption}
\begin{document}
%\begin{align*}
%    f(x) &=
%    \begin{cases*}
%        -1 & f\"ur $-\frac12http://texwelt.de/wissen/upfiles/gibbs4a.PNG
(23 Apr '14, 11:32) uniQue_

Irgendwie wird der Beitrag so nicht angezeigt, wie er soll ...

(23 Apr '14, 11:35) uniQue_

Hallo @uniQue_ Bitte stelle keine Folgefragen, indem Du eine Antwort postest. Jede Antwort soll nämlich die oben gestellte Frage beantworten und z.B. habe ich sie bei mir so sortiert, dass die neueste Antwort ganz oben erscheint (so wie gerade noch Deine). Besser wäre gewesen, Du hättest das als Kommentar zu Henris Antwort gepostet. Darum habe ich sie in einen Kommentar konvertiert.

(23 Apr '14, 11:43) cgnieder

@Clemens Danke fürs Umwandeln! @uniQue_ Kommentarbereiche sind zu klein für längere Codes, daher sieht man das nicht richtig, poste es einfach als neue Frage, denn im Prinzip geht es ja um ein neues kleines Problem, auch wenn man an derselben Grafik feilt. Jedes spezifische Problem ist eine Frage hier, nicht ein langer Thread pro "Projekt" wie bei klassischen Internetforen. Grund ist auch Wiederauffindbarkeit von Problemen mit Lösungen für spätere Besucher, mit Sortierung uvm.

(23 Apr '14, 11:56) stefan ♦♦

@uniQue_ Die Limites für die y-Achse lassen sich mit ymin=-1.5,ymax=1.5 verändern. Die Positionierung der y-Achsenbeschriftung kann über y tick label style=right angepasst werden. Einfach die beiden Sachen in den Optionen der axis-Umgebung hinzufügen.

(23 Apr '14, 15:33) Henri
Ergebnis 5 von 6 show 1 more comments

Eine Lösung mit gnuplot und pgfplots, es geht natürlich auch gnuplot mit nur TikZ, doch ich mag den Komfort von pgfplots. Achseneinstellungen habe ich von Henri übernommen, der Plot geschieht als raw gnuplot. Vorausgesetzt ist, dass gnuplot installiert ist, und mit shell-escape- bzw. mit enable-write18-Option übersetzt wird.

Open in writeLaTeX
\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
  \begin{axis}[
    no markers,
    samples=100,
    smooth,
    domain=-1.2:1.4,
    axis lines=middle,
    width=\linewidth
  ]
    \foreach \N in {1,2,3} {%
      \addplot+ [mark = none] gnuplot[raw gnuplot] {%
        set samples 200;
        s(m, x) = 4/((2*m-1)*pi)*sin(2*(2*m-1)*pi*x);
        plot[-1.2:1.4] sum [m=1:\N] s(m,x)
      };
      \addlegendentryexpanded{$S_\N(f,x)$}
    }
  \end{axis}
\end{tikzpicture}
\end{document}

Plot Summe von Funktionen mit gnuplot

Permanenter link

beantwortet 22 Apr '14, 21:40

stefan's gravatar image

stefan ♦♦
18.3k163148
Akzeptiert-Rate: 49%

Oh, inzwischen hat Henri eine gnuplot-Lösung hinzugefügt. Sehr schön! Dann kann ich meine ganz ähnliche Antwort löschen. Zumindest zeigt das die Beteiligung hier. :-)

(22 Apr '14, 21:43) stefan ♦♦

+1: Trotzdem ist ein Fehler drin. Es sollte s(m, x) = 4/((2*m-1)*pi)*sin((2*m-1)*pi*x); sein, da ist ein Faktor 2 im Argument vom Sinus zu viel.

(22 Apr '14, 22:29) Henri

Hier mal eine Nur-Tikz Lösung. Sie kommt mit elementaren Mitteln aus und die Rechendauer hält sich, bei nicht zu großem N, in Grenzen:

alt text alt text

Open in writeLaTeX
\documentclass[margin=2.5mm]{standalone}
\usepackage{tikz}
 \usetikzlibrary{fpu}
%Funktion definieren
\def\N{3}                  % obere Summationsgrenze
\def\x{\noexpand\x}   % \x nicht ändern in \edef
\edef\Gibbs{0}            % Gibbs_0 = S_0 := 0
\edef\Mm{-1}              % M_0 :=-1; M_(m+1) = M_m + 2 bzw. M_m = 2m-1  
\foreach \m in {1,...,\N} {%     %Summe von 1 bis N
    \global\edef\Mm{\Mm+2}    % M_(m+1) = M_m + 2;
    \global\edef\Gibbs{
    \Gibbs  + (4*sin(((\Mm)*pi*\x)  r)/(pi*(\Mm)) }    
}%
%========
\begin{document}
%========
\begin{tikzpicture}[>=latex, font=\tiny]
%\node[] at (0,0) {\Mm};        % Zur Kontrolle 
%\node[] at (0,-1){\Gibbs};     % der Berechnung
%    \draw[help lines] (-2,-1.25) grid (2,1.0);
%Achsen Zeichnen
\draw[->] (-2.25,0) -- (2.25,0) node[below] {\footnotesize$x$};
\draw[->] (0,-1.75) -- (0,1.75) node[left] {\footnotesize$y$};
 % Achsen beschriften
\foreach \x in {-2,-1.5,...,-0.5,0.5,1,...,2}
\draw (\x,-1pt) -- (\x,1pt) node[below=2pt] {$\x$};
\foreach \y in {-1.5,-1,-0.5, 0.5,1,1.5}
\draw (-1pt,\y) -- (1pt,\y) node[left=2pt] {$\y$};
   \node[below right]{$\scriptstyle0$};
%Funktion zeichnen
  \draw[color=blue,  /pgf/fpu, /pgf/fpu/output format=fixed]    plot[domain=-2.1:2.1, samples=201, smooth] (\x, {\Gibbs});

\node at (1.0,1.5) {$N=\N$};
\end{tikzpicture}
%========
\end{document}
%========

€dit: Wegen der Zusatzfrage, nach der "Platzierung", eine kleine Ergänzung:

Open in writeLaTeX
\documentclass[a4paper]{article}
\usepackage{tikz}
  \usetikzlibrary{fpu}

\newcommand{\PlotGibbs}[1]{%%%%%%%%%%%
%Funktion definieren
\def\N{#1}                  % obere Summationsgrenze
\def\x{\noexpand\x}   % \x nicht ändern in \edef
\edef\Gibbs{0}            % Gibbs_0 = S_0 := 0
\edef\Mm{-1}              % M_0 :=-1; M_(m+1) = M_m + 2 bzw. M_m = 2m-1  
\foreach \m in {1,...,\N} {%     %Summe von 1 bis N
    \global\edef\Mm{\Mm+2}    % M_(m+1) = M_m + 2;
    \global\edef\Gibbs{
    \Gibbs  + (4*sin(((\Mm)*pi*\x)  r)/(pi*(\Mm)) }    
}%

\begin{tikzpicture}[>=latex, font=\tiny]
%\node[] at (0,0) {\Mm};        % Zur Kontrolle 
%\node[] at (0,-1){\Gibbs};     % der Berechnung
%    \draw[help lines] (-2,-1.25) grid (2,1.0);
%Achsen Zeichnen
\draw[->] (-2.25,0) -- (2.25,0) node[below] {\footnotesize$x$};
\draw[->] (0,-1.75) -- (0,1.75) node[left] {\footnotesize$y$};
 % Achsen beschriften
\foreach \x in {-2,-1.5,...,-0.5,0.5,1,...,2}
\draw (\x,-1pt) -- (\x,1pt) node[below=2pt] {$\x$};
\foreach \y in {-1.5,-1,-0.5, 0.5,1,1.5}
\draw (-1pt,\y) -- (1pt,\y) node[left=2pt] {$\y$};
   \node[below right]{$\scriptstyle0$};
%Funktion zeichnen
  \draw[color=blue,  /pgf/fpu, /pgf/fpu/output format=fixed]    plot[domain=-2.1:2.1, samples=201, smooth] (\x, {\Gibbs});

\node at (1.0,1.5) {$N=\N$};
\end{tikzpicture}
}%%%%%%%%%%%%%%%%%%%%%%

%========
\begin{document}
%========

Betrachten wir die  F{\"a}lle N = 1, 4 und 7: \\
\begin{tabular}{clclc} 
\PlotGibbs{1} & \PlotGibbs{4} \\
\PlotGibbs{7} &
\end{tabular}
%oder ähnlich.....

%========
\end{document}
%========

€dit2: Ich habe noch eine Ergänzung mit der Bibliothek fpu vorgenommen, das erlaubt auch höhere Summationsgrenzen N (ohne fpu nur bis N=22). Damit ist die Lösung nicht mehr, wie angestrebt, 100% elementar; aber, wie gesagt, wenn man keine zu großen N-Werte braucht, kann man das auch weglassen.

Permanenter link

beantwortet 23 Apr '14, 17:34

cis's gravatar image

cis
9.5k95459491
Akzeptiert-Rate: 29%

bearbeitet 25 Apr '14, 18:01

Eine ebenfalls sehr schöne Lösung!

(23 Apr '14, 17:45) uniQue_

Wegen dem Platzierungsproblem kann man sich das Leben leicht machen - siehe edit...

(23 Apr '14, 18:36) cis
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×731
×28

gestellte Frage: 22 Apr '14, 17:53

Frage wurde gesehen: 14,565 Mal

zuletzt geändert: 25 Apr '14, 18:01