Hinzufügen zusätzlicher Koordinaten zu einem Plot

Hinzufügen zusätzlicher Koordinaten zu einem Plot

Ich habe es wieder und wieder versucht, aber es gelingt mir noch immer nicht, es so aussehen zu lassen wie das hier, insbesondere die Tangenten:

Bildbeschreibung hier eingeben

MWE:(Anerkennung anJimeens)

\documentclass[tikz,border=1mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\usetikzlibrary{arrows.meta}

\begin{document}
\begin{tikzpicture}[
    scale=1.5,
    every node/.style={scale=0.5},
    >={Triangle[scale=0.6]}
    ]

    % Drawing the main axis:
    \draw[<->]  (0,1/0.25) node[above]{$y$} -- 
                (0,0) node[below left]{0} -- 
                (4.5,0) node[right]{$x$};
    % Drawing the main function:
    \draw[thick] plot[domain=0.28:4.4, samples=200](\x,{1/\x}) node[right]{$k^{0}$};
    % Drawing the dotted lines:
    \draw[densely dotted, thick]    (1,0) node[below]{$x^{0}$} |-
                                    (0,1) node[left]{$y^{0}$};
    % Drawing the dashed lines:
    \foreach \x in {0.55,1,1.3,2}{
        \draw[densely dashed] (0,0) -- (\x,1/\x);
    }
    % Drawing the points:
    \foreach \p in {0.45, 0.55, 1, 1.3, 2, 2.6}{
        \draw[fill=black] (\p,1/\p) circle (1pt);
    }
    % Labeling the points:
    \node[above right] (M'') at (0.45,1/0.45){$M''$};
    \node[above right] (A) at (0.55,1/0.55){$A$};
    \node[above right] at (1,1){$P$};
    \node[above right] at (1.3,1/1.3){$M$};
    \node[above right] (B) at (2,1/2){$B$};
    \node[above right] (M') at (2.6,1/2.6){$M'$};
    % Drawing the arrows:
    \draw[->] (A) -- (M'');
    \draw[->] (B) -- (M');
    \draw[->] (0.4,3.2) -- (0.55,3.2);
    \draw[->] (3.5,0.45) -- (3.65,0.45);
    % Drawing the dashed function:
    \draw[  thick, 
            xshift = 0.3cm, 
            yshift = 0.3cm, 
            dash pattern = on 10.85pt off 3pt
    ] plot[domain=0.28:4.4, samples=200](\x,{1/\x}) node[right]{$k^{1}$};
    
\end{tikzpicture}
\end{document}

Antwort1

Der PunktCwird hier mathematisch gefunden, siehe factorAFunktion. Es wäre auch möglich, den Punkt zu findenCmit der intersectionsBibliothek, aber dann müssten wir die findenXWert dieses Punktes imxyzKoordinatensystem (was nicht so schwer wäre, wenn Sie nicht ein gedrehtes Koordinatensystem verwenden würden).

Es gibt auch eine zweite Lösung mit einem Minus vor der Quadratwurzel, aber ich habe nicht wirklich überprüft, ob diese tatsächlich gültig ist. Ich gehe davon ausA> 0.B> 0, d. h. der Faktor muss größer als 1 sein. Bedeutungk¹ steht immer oberhalb und rechts vonk⁰.

Die Tangenten werden durch die Ableitung dieser beiden Funktionen bestimmt (eine weitere mathematische Lösung). Dies in PGF/TikZ zu tun, wird nicht einfach sein, schon gar nicht, wenn es umC.

DerXWert fürA,BUndCsind ihre eigenen PGFMath-Funktionen. Da xCdie Funktion enthält, factorAwürde dieser Wert bei jeder xCVerwendung ausgewertet, obwohl er konstant ist (was nicht sehr effizient ist).

Code

\documentclass[tikz]{standalone}
\usetikzlibrary{arrows.meta, calc}
\begin{document}
\begin{tikzpicture}[
  x=2cm, y=2cm, thick, >=Triangle,
  every label/.append style={inner sep=+.15em},
  declare function={
    a = .5; b = .5; xA = .55; xB = 2; xC = factorA(xA, a, b) * xA;
    f(\x)  = 1/\x;       ft(\x) = -1/\x/\x;
    g(\x)  = 1/(\x-a)+b; gt(\x) = -1/(\x-a)/(\x-a);
    factorA(\x,\a,\b) = (sqrt(\a*\a-2*\a*\b*\x*\x+\b*\b*\x*\x*\x*\x+4*\x*\x)
                         +\a+\b*\x*\x)/(2*\x);},
  label positions/.style args={#1:#2}{label #1/.style={label={#2:##1}}},
  label positions/.list={A:right, B:above, C:right, R:above right},
  dot/.style={
    circle, inner sep=+0pt, outer sep=+0pt, minimum size=+3pt, fill,
    label #1/.try={$#1$}},
  mark on axis/.style args={#1:#2}{insert path={
    (#1) edge[densely dotted] node[at end, below] {$x_{#2}$} (#1|-0,0)
         edge[densely dotted] node[at end, left]  {$y_{#2}$} (#1-|0,0)}}
]
\draw[<->] (0,4.5) node[above]{$y$} |- (5.5,0) node[right]{$x$};
\draw[very thick, samples=200] plot[domain=.28:4.4] (\x,{f(\x)}) node[right]{$k^0$}
                           plot[domain=.28+a:4.4+a] (\x,{g(\x)}) node[right]{$k^1$};

\foreach[count=\cnt] \pnt/\fct in {A/f, B/f, C/g}
  \node[dot=\pnt] (\pnt) at (x\pnt,{\fct(x\pnt)}) {} [mark on axis=\pnt:\cnt];

\foreach \pnt/\lbl in {A/R, B/{}}
  \draw[dashed] (0,0) -- ($(0,0)!2!(\pnt)$) coordinate[label \lbl/.try=$\lbl$] ();

\foreach[/pgf/inner sep=+.15em, evaluate={\ang=atan(\fct t(x\pnt));}]
  \pnt/\lbl/\fct in {A/a/f, B/{}/f, C/c/g}
  \draw[dashed, shift=(\pnt)](\ang+180:1) node[above left] {$\lbl$}
                          -- (\ang    :1) node[below]      {$\lbl$};
\end{tikzpicture}
\end{document}

Ausgabe

Bildbeschreibung hier eingeben

Antwort2

Hier ist eine Variante vonmeine Antwort auf deine andere Frage, auch inMetapost. Bildbeschreibung hier eingeben

Dieses zeigt eine andere Art, mit pairVariablen umzugehen – die zNotation erlaubt es Ihnen, sie zu verwenden, ohne sie zu deklarieren – und eine Funktion zum Zeichnen einer Tangente an einem Punkt auf einer Kurve. Wie zuvor müssen Sie dies mit kompilieren lualatex.

\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
beginfig(1);
    path xx, yy, ff, k[];
    xx = 20 left -- 300 right;
    yy = xx rotated 90;
    ff = (1, 1) {dir -45} for x = 2 upto 5: .. (x, 1/x) endfor;
    ff := reverse ff reflectedabout(origin, (1,1)) & ff;
    k0 = ff scaled 280/5; 
    k1 = subpath (2, 6) of ff scaled 280/3;

    numeric a, b, c;
    a = 3.4; b = 5.1;
    z.A = point a of k0;
    z.B = point b of k0;
    z.R = 2.4 z.A;
    z.S = 2 z.B;

    (c, whatever) = k1 intersectiontimes (origin -- z.R);
    z.C = point c of k1;
    z.D = point c-3/4 of k1;
    z.E = point c+3/4 of k1;

    vardef tangent expr t of p = 
        (left--right) scaled 42 rotated angle direction t of p shifted point t of p
    enddef;

    draw tangent a of k0 dashed withdots scaled 1/8 withcolor 1/2 red;
    draw tangent b of k0 dashed withdots scaled 1/8 withcolor 1/2 red;
    draw tangent c of k1 dashed withdots scaled 1/8 withcolor 1/2 red;

    draw z.D -- z.C -- z.E dashed evenly withpen pencircle scaled 1/4;

    draw k0 withcolor 2/3 red;
    draw k1 withcolor 2/3 red;

    draw z.R -- origin dashed evenly withpen pencircle scaled 1/4;
    draw z.S -- origin dashed evenly withpen pencircle scaled 1/4;
    label.urt("$R$", z.R);
    
    forsuffixes @ = A, B, C:
        draw (x@, 0) -- z@ -- (0, y@) dashed withdots scaled 1/4;
        label.bot("$\scriptstyle x^" & str @ & "$", (x@, 0));
        label.lft("$\scriptstyle y^" & str @ & "$", (0, y@));
    endfor
    forsuffixes @ = A, B, C, D, E:
        dotlabel.urt("$" & str @ & "$", z@);
    endfor

    drawarrow xx;
    drawarrow yy;

    dotlabel.llft("$0$", origin);
    label.rt("$k^0$", point 8 of k0);
    label.rt("$k^1$", point 8 of k1);
    label.rt("$x$", point 1 of xx);
    label.top("$y$", point 1 of yy);
endfig;
\end{mplibcode}
\end{document}

Antwort3

Verwenden vontzplot:

Bildbeschreibung hier eingeben

\documentclass{standalone} 

\usepackage{tzplot}

\begin{document}

\begin{tikzpicture}[scale=1.5,font=\scriptsize]
%\tzhelplines[thick](5,1/0.25)
\tzaxes(5,1/0.25){$x$}{$y$}
\tzshoworigin
% def functions
\def\kzero{1/\x}
\def\kone{2/\x}
\def\lineA{1.8*\x}
\def\lineB{(1/5)*\x}
% indifference curves
\tzfn\kzero[.28:4.4]{$k^0$}[r]
\tzfn\kone[.55:4.4]{$k^1$}[r]
% dashed rays
\tzfn[dashed]\lineA[0:1.5]{$R$}[ar]
\tzfn[dashed]\lineB[0:4]
% intersection points
\tzXpoint*{kzero}{lineA}(A){$A$}[r]
\tzXpoint*{kone}{lineA}(C){$C$}[r]
\tzXpoint*{kzero}{lineB}(B){$B$}[a]
% tangent lines
\tztangent[densely dashed,red]{kzero}(A)[.3:1.1]{$a$}[b]
\tztangent[densely dashed,red]{kone}(C)[.7:1.5]{$c$}[b]
\tztangent[densely dashed,red]{kzero}(B)[1.5:3]
\tztangent[draw=none]{kzero}(A)[1.1:.3]{$a$}[l] % label
\tztangent[draw=none]{kone}(C)[1.5:.7]{$c$}[l]  % label
% projections
\tzproj(A){$x^A$}{$y^A$}
\tzproj(B){$x^B$}{$y^B$}
\tzproj(C){$x^C$}{$y^C$}
% more lines: CD and CE
\tzvXpointat*{kone}{0.7}(D){$D$}[r]
\tzvXpointat*{kone}{1.6}(E){$E$}[ar]
\tzline[densely dashed,blue](C)(D)
\tzline[densely dashed,blue](C)(E)
\end{tikzpicture}

\end{document}

verwandte Informationen