pgfplots: Minimum einer Funktion markieren

Tabellen und Grafiken erstellen und anordnen


thor
Forum-Anfänger
Forum-Anfänger
Beiträge: 48
Registriert: Do 25. Okt 2012, 14:43

pgfplots: Minimum einer Funktion markieren

Beitrag von thor »

Hallo,

ich hätte da mal wieder ein kleines Problemchen. Ich habe hier drei Funktionen mit pgfplots gezeichnet Lagerkosten/Bestellkosten/Gesamtkosten. Nun möchte ich gerne, dass der Punkt (x,y) (7, 565.72) mittels einer Gerade zur x und zur y-Achse gekennzeichnet wird, da hier das Minimum der Gesamtkosten liegt. Ich habe Euch ein Bild hochgeladen, das dieses verdeutlicht (xopt, am besten mit Koordinaten)

Aber ich weiß beim besten Willen nicht, wie man das hinbekommt, kann mir jemand helfen?

Hier das MBB
\documentclass[%
fontsize=11pt,
]{scrartcl}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{pgfplots}

\begin{document}
\begin{tikzpicture}[scale=1.2]
    \begin{axis}[
        style=thick, 
        xlabel=Bestellhäufigkeit,
        ylabel=Gesamtkosten,
        minor tick num=1,
        grid=both,
        %xmin=500, xmax=10000,
        %ymin=500, ymax=3000,
        ]
        \addplot+[smooth,green!60!black,mark options={green!60!black}]
        coordinates{
          (1,40)
          (2,80)
          (3,120)
          (4,160)
          (5,200)
          (6,240)
          (7,280)
          (8,320)
          (9,360)
          (10,400)
          (11,440)
          (12,480)
        };
        \addlegendentry{Bestellkosten}

        \addplot+[smooth, cyan, mark=*,mark options={cyan}]
        coordinates{
          (1,2000)
          (2,1000)
          (3,666.67)
          (4,500)
          (5,400)
          (6,333.34)
          (7,285.72)
          (8,250)
          (9,222.22)
          (10,200)
          (11,181.82)
          (12,166.67)
        };
        \addlegendentry{Lagerkosten}

        \addplot+[smooth,red!70!white,mark options={red!70!white}]
        coordinates {
          (1,2040)
          (2,1080)
          (3,786.67)
          (4,660)
          (5,600)
          (6,573.34)
          (7,565.72) % Minimum kennzeichnen
          (8,570)
          (9,582.22)
          (10,600)
          (11,621.82)
          (12,646.67)
        };
        \addlegendentry{Gesamtkosten}
    \end{axis}
\end{tikzpicture}
\end{document}
Vielen Dank schon einmal!

P.S. ich sehe gerade, eine Datei kann nicht angehängt werden, ich weiß nicht wieso: Upload Error: Kann das Attachment ./files/tikzmbb_174.jpeg (32 kb groß) nicht hochladen. :( :( :( Ich hoffe, Ihr versteht mich auch so!!

Gruß
Thorsten

Münzi
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 78
Registriert: Fr 24. Apr 2009, 09:53

Beitrag von Münzi »

Meinst du sowas?
\documentclass[% 
fontsize=11pt, 
]{scrartcl} 
\usepackage[ngerman]{babel} 
\usepackage[utf8]{inputenc} 
\usepackage{pgfplots} 

\begin{document} 
\begin{tikzpicture}[scale=1.2] 
    \begin{axis}[ 
        style=thick, 
        xlabel=Bestellhaeufigkeit, 
        ylabel=Gesamtkosten, 
        minor tick num=1, 
        grid=both, 
        ymin=0,
        %xmin=500, xmax=10000, 
        %ymin=500, ymax=3000, 
        extra x ticks={7},
        extra x tick labels={$x_\textrm{opt}$}, 
%        extra y ticks={565.72},
%        extra y tick labels={$y_\textrm{opt}$},
        ] 
        \addplot+[smooth,green!60!black,mark options={green!60!black}] 
        coordinates{ 
          (1,40) 
          (2,80) 
          (3,120) 
          (4,160) 
          (5,200) 
          (6,240) 
          (7,280) 
          (8,320) 
          (9,360) 
          (10,400) 
          (11,440) 
          (12,480) 
        }; 
        \addlegendentry{Bestellkosten} 

        \addplot+[smooth, cyan, mark=*,mark options={cyan}] 
        coordinates{ 
          (1,2000) 
          (2,1000) 
          (3,666.67) 
          (4,500) 
          (5,400) 
          (6,333.34) 
          (7,285.72) 
          (8,250) 
          (9,222.22) 
          (10,200) 
          (11,181.82) 
          (12,166.67) 
        }; 
        \addlegendentry{Lagerkosten} 

        \addplot+[smooth,red!70!white,mark options={red!70!white}] 
        coordinates { 
          (1,2040) 
          (2,1080) 
          (3,786.67) 
          (4,660) 
          (5,600) 
          (6,573.34) 
          (7,565.72) % Minimum kennzeichnen 
          (8,570) 
          (9,582.22) 
          (10,600) 
          (11,621.82) 
          (12,646.67) 
        }; 
        \addlegendentry{Gesamtkosten} 
        \draw[dashed] (axis cs: 0, 565.72) -- (axis cs:7, 565.72);
        \draw[dashed] (axis cs: 7, 0) -- (axis cs:7, 565.72);
    \end{axis} 
\end{tikzpicture} 
\end{document}
Windows XP, TexLive 2013, TexStudio 2.6.4
Windows 7, TexLive 2013, TexStudio 2.6.4

thor
Forum-Anfänger
Forum-Anfänger
Beiträge: 48
Registriert: Do 25. Okt 2012, 14:43

Beitrag von thor »

Ja das meinte ich, vielen Dank, etwas Finetuning noch, da ich das yopt bzw xopt gerne als node in der Mitte hätte, am besten mit Koordinaten, etwa so:

xopt/yopt (7,565.72)

Das wär dan optimal, ich such nochmal ein wenig im Manual!

Danke nochmal, Ihr seit klasse!

vg
Thorsten

Münzi
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 78
Registriert: Fr 24. Apr 2009, 09:53

Beitrag von Münzi »

Ich weiß nicht genau wie du das meinst. Aber ich vermute mal, du solltest im Manual nach (axis cs: ... ) schauen. Damit kannst du die node frei im Diagramm an den entsprechenden Koordinaten platzieren. Zusätzlich bietet sich noch xshift bzw. yshift an um die node zu verschieben.
Windows XP, TexLive 2013, TexStudio 2.6.4
Windows 7, TexLive 2013, TexStudio 2.6.4

thor
Forum-Anfänger
Forum-Anfänger
Beiträge: 48
Registriert: Do 25. Okt 2012, 14:43

Beitrag von thor »

War ganz einfach

Es fehlte lediglich ein
\node[pin=90:\tiny\sffamily optim. Bestellmenge: 7/565.72,draw=black] at (axis cs:7,565.2) {};
und schon hat man es in der Mitte und nicht an den Achsen, sehr schön!

Das Sahnehäubchen wäre jetzt noch, wenn man diese Werte nicht händisch eintragen müsste, sonder pgfplots automatisch die Werte ermitteln könnte, also P(x,y): (7,565.72) und diese dann an den entsprechenen Stellen einsetzen würde :D
\draw[dashed] (axis cs: 0, 565.72) -- (axis cs:7, 565.72);
\draw[dashed] (axis cs: 7, 0) -- (axis cs:7, 565.72);
\node[pin=90:\tiny\sffamily optim. Bestellmenge: 7/565.72,draw=black] at (axis cs:7,565.2) {};
Ist natürlich purer Luxus aber es wäre einfach toll!

Herzliche Grüße
Thorsten Grothe

Antworten