Wie kann ich einen solchen Graphen meiner stückweise ausgeführten Funktion erstellen?

Wie kann ich einen solchen Graphen meiner stückweise ausgeführten Funktion erstellen?

Ich schreibe meine Abschlussarbeit in Verhaltensökonomie und muss individuelle Diskontierungsfunktionen zeichnen. Die folgende Grafik habe ich mit Stata erstellt, hätte sie aber gerne mit Tikz.

Screenshot eines linearen Diagramms

Ich habe in Tikz herumgespielt und bin bisher folgendermaßen vorgekommen:

\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
    \begin{axis}[domain=-1:5,samples=400]
        \addplot+[mark=none] {1-(1-0.7*0.8)*(x+1)};
        \addplot+[mark=none] {0.7*0.8^(x+1)};
    \end{axis}
\end{tikzpicture}
\end{document}

was zu dieser Ausgabe führt:

Screenshot eines linearen Diagramms mit zwei Linien

Leider ist meine Deadline sehr bald. Kann mir jemand bei den folgenden Korrekturen helfen?

  1. der Bereich der Y-Achse sollte zwischen 0 und 1 liegen.

  2. Der Bereich der X-Achse sollte zwischen 0 und 5 liegen UND der angezeigte X-Wert sollte der wahre Wert der Funktion +1 sein.

  3. Die Funktionen sollten sich nicht kreuzen, sondern nur berühren, d. h.

     \addplot+[mark=none] {1-(1-0.7*0.8)*(x+1)};
    

von x=-1 bis 0 (angezeigte Werte: 0 bis 1)

     \addplot+[mark=none] {0.7*0.8^(x+1)};

von x=0 bis 4 (angezeigte Werte: 1 bis 5)

  1. Beide Funktionen sollten die gleiche Farbe (schwarz) haben.

Antwort1

Sie können einfach die Domänenspezifikation zu jeder Funktion hinzufügen, um den angezeigten Teil der Funktion einzuschränken. Um verschiedene Werte auf der X-Achse anzuzeigen, verschieben Sie sie einfach um einen nach rechts, indem Sie +1aus Ihrer Funktion entfernen. Die Farbspezifikation kann hinzugefügt werden, um \addplotalles auf Schwarz einzustellen. Wenn Sie schließlich sicherstellen möchten, dass keine Daten außerhalb der Y-Domäne 0:1 angezeigt werden, verwenden Sie restrict y to domain=0:1.

Bearbeiten:Achsenbeschriftungen auf die pgfplots-Art hinzugefügt.
Bearbeitung 2:Zweites Diagramm und Legende hinzugefügt. Beachten Sie, dass \addlegendentryeinfach Einträge in der Reihenfolge von hinzugefügt werden \addplotsund die beiden Teile als separate Diagramme betrachtet werden. Der einfachste Weg ist also, zuerst alle ersten Teile jedes Diagramms zu zeichnen, die Legende einzurichten und dann den zweiten Teil jedes Diagramms zu zeichnen.

\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\begin{document}
\begin{tikzpicture}
    \begin{axis}[
        domain=0:5,
        samples=400,
%        ymin=-0.1,   % Uncomment if 0 should really be shown,
%        ymax=1.1,    % leave commented to let pgfplots figure out the exact y domain
        restrict y to domain=0:1,
        xlabel={Month},
        ylabel={Value of Discount Function},
        ]
        \addplot+[mark=none,black,domain=0:1] {1-(1-0.7*0.8)*(x)};
        \addplot+[mark=none,blue,domain=0:1] {0.8-(1-0.7*0.8)*(x)};
        \addlegendentry{A}
        \addlegendentry{B}
        \addplot+[mark=none,black,domain=1:5] {0.7*0.8^(x)};
        \addplot+[mark=none,blue,domain=1:5] {0.7*0.8^(x)-0.2};
    \end{axis}
\end{tikzpicture}
\end{document}

Aktualisierte Grundstücke

Antwort2

Hier ist der Code:

\documentclass{article}

\usepackage{tikz}
\usepackage{pgfplots}

\usepackage{rotating}

\begin{document}
\begin{tikzpicture}
    \begin{axis}[samples=400,
        ymin = -0.1,
        ymax = 1.1,
        xmin = -0.3,
        xmax = 5.3]
        \addplot+[mark=none, domain=0:1, black] {1-(1-0.7*0.8)*x};
        \addplot+[mark=none, domain=1:5, black] {0.7*0.8^x};
    \end{axis}

    \draw (3.5, -0.7) node [below] {Month};

    \draw (-0.9, 2.7) node [left] {\rotatebox{90}{Value of Discount Function}};

\end{tikzpicture}
\end{document}

und die Ausgabe:

Bildbeschreibung hier eingeben

Was ich getan habe:

  1. Hinzugefügt die Schlüssel yminund ymaxdie axisUmgebung: diese setzen die Grenzen derj-Achse. Ich habe ein wenig Polsterung hinzugefügt, damit sie mit dem Stata-Diagramm übereinstimmt, aber Sie können diese Werte auch ganz einfach auf genau 0 und 1 setzen, wenn Sie das möchten.

  2. Hinzugefügt die Tasten xminund xmaxdie Grenzen derX-Achse. Die zusätzliche horizontale Polsterung wurde größtenteils mit dem Auge und durch Feinabstimmung bestimmt.

    Um die Funktion mit +1 zu übersetzen, habe ich in den beiden Definitionen einfach x+1durch ersetzt . (Ich war mir nicht ganz sicher, was Sie damit meinten, habe es aber anhand des Stata-Diagramms beurteilt.)xaddplot

  3. Anstatt die Domäne als Option für festzulegen axis, können Sie sie als separates Argument für angeben addplot. Daher habe ich domain=0:1und domain=1:5zu den beiden Plotfunktionen hinzugefügt, sodass Sie nur die einzelne Linie erhalten. (Beachten Sie die Verschiebung um +1, um die Achsenverschiebung zu berücksichtigen.)

  4. Fügen Sie das Argument blackzu beiden addplotBefehlen hinzu.

Ich habe außerdem zwei \drawBefehle zum Platzieren und Drehen der Achsenbeschriftungen hinzugefügt. (Auch hier wurde das meiste nach Augenmaß erledigt, obwohl ich glaube, dass es eine schönere Möglichkeit gibt, das zu tun.)

Antwort3

Die Lösung vonhugo_dbergsowie vonAbonnierenhaben den Nachteil, dass sie beide die stückweise Funktion stückweise zeichnen, wasIm Algemeineneinige Nachteile wie

  • Legendenprobleme, wenn Sie mehr als eine Funktion in einem Diagramm darstellen müssen oder
  • man muss die Stile im Auge behalten.

(Ausgeliehen vonJM114516.)


Wenn Sie die beiden Funktionsteile der stückweise dargestellten Funktion kennen, aber nicht wissen, wo der Schnittpunkt liegt, können Sie die maxFunktion (in diesem Fall) einfach verwenden, um die Funktion in einem \addplotBefehl zu zeichnen ...

\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
    \pgfplotsset{
        % use at least this compat level
        % to improve positioning of the axis labels
        compat=1.3,
    }
\begin{document}
    \begin{tikzpicture}
        \begin{axis}[
            % set ymin value
            ymin=0,
            % in which domain should the expression be calculated ...
            domain=0:5,
            % ... with how many samples?
            samples=400,
            % add axis labels
            xlabel={Month},
            ylabel={Value of Discount Function},
            % don't show markers
            no markers,
        ]
        % piecewise function part 1
            \addplot [black!25,very thick] expression {
                    1-(1-0.7*0.8)*x
            };
        % piecewise function part 2
            \addplot [black!25,very thick,dashed] expression {
                    0.7*0.8^x
            };
        % piecewise function combined
            \addplot [red] expression {
                max(
                    1-(1-0.7*0.8)*x,
                    0.7*0.8^x
                )
            };

            \legend{
                ,           % <-- empty string to ignore this `\addplot'
                ,
                discount function,
            }
        \end{axis}
    \end{tikzpicture}
\end{document}

Bild, das das Ergebnis des obigen Codes zeigt

verwandte Informationen