Richtungsfeld für dy/dx=-x/y

Richtungsfeld für dy/dx=-x/y
\documentclass{beamer}
\usepackage{tikz,pgfplots}
\begin{document}
\begin{frame}
\def\length{sqrt(1+(-x/y)^2)}
\begin{tikzpicture}
\begin{axis}[
domain=-3:3, 
view={0}{90},
title={$\displaystyle\frac{dy}{dx}=-\frac{x}{y}$},
xmin=-3,
xmax=3,
ymin=-3,
ymax=3,
ytick={-3,-2,-1,0,1,2,3}
]
\addplot3[gray, quiver={u={1/(\length)}, v={(-x/y)/(\length)}, scale arrows=0.15}, -,samples=40] {0};
\addplot +[blue, samples=31, smooth, thick, no markers, domain=-sqrt(2):sqrt(2)]{sqrt(2-x^2)};
\addplot +[red, samples=31, smooth, thick, no markers, domain=-2:2]{sqrt(4-x^2)};
\addplot +[orange, samples=31, smooth, thick, no markers, domain=-sqrt(6):sqrt(6)]{sqrt(6-x^2)};
\addplot +[blue, samples=31, smooth, thick, no markers, domain=-sqrt(2):sqrt(2)]{-sqrt(2-x^2)};
\addplot +[red, samples=31, smooth, thick, no markers, domain=-2:2]{-sqrt(4-x^2)};
\addplot +[orange, samples=31, smooth, thick, no markers, domain=-sqrt(6):sqrt(6)]{-sqrt(6-x^2)};
\end{axis}
\end{tikzpicture}
\end{frame}
\end{document}

Dies ist das Richtungsfeld für $\frac{dy}{dx}=-\frac{x}{y}$. Ich habe zwei Probleme.

  1. Wie bringe ich das Programm dazu, die Vektoren auf der negativen x-Achse zu zeichnen?
  2. Wie zeichne ich Kreise mit einem bestimmten Radius in das Diagramm (die Methode, die ich mir ausgedacht habe, funktioniert offensichtlich nicht!)?

Vielen Dank für jede Hilfe.

Bearbeiten: Ich habe die Dokumentklasse als Beamer hinzugefügt, aber mit dem Artikel funktioniert es genauso.

Antwort1

Bildbeschreibung hier eingeben

\documentclass{beamer}
\usepackage{pgfplots}
\usetikzlibrary{arrows.meta}
\begin{document}
\begin{frame}
\def\length{sqrt(1+(-x/y)^2)}
\begin{tikzpicture}
\begin{axis}[
domain=-3:3, 
view={0}{90},
title={$\displaystyle\frac{dy}{dx}=-\frac{x}{y}$},
xmin=-3,
xmax=3,
ymin=-3,
ymax=3,
ytick={-3,-2,-1,0,1,2,3}
]
\addplot3[gray, quiver={u={1/(\length)}, v={(-x/y)/(\length)}, scale arrows=0.1}, -{Stealth[width=2pt,length=2pt]},samples=24,domain=-3:3] {0};
\addplot[blue, samples=50, thick, no markers, domain=0:2*pi] ({cos(deg(x))},{sin(deg(x))});
\addplot[red, samples=50, thick, no markers, domain=0:2*pi] ({2*cos(deg(x))},{2*sin(deg(x))});
\addplot[orange, samples=50, thick, no markers, domain=0:2*pi] ({3*cos(deg(x))},{3*sin(deg(x))});
\end{axis}
\end{tikzpicture}
\end{frame}
\end{document}

Ich bin mir nicht sicher, ob das für Sie ausreicht. Die Kreise werden als parametrische Diagramme gezeichnet, also in etwa in der Form\addplot ({r*cos(x)}, {r*sin(x)});

Die Lücke zwischen den Pfeilen für x < 0 entsteht dadurch, dass sich die Koordinate (x,y) meines Erachtens auf den Anfang des Pfeils bezieht, und da die Pfeile in entgegengesetzte Richtungen zeigen (siehe Bild oben), entsteht dort eine Lücke und für x > 0 eine Überlappung. Eine leichte Reduzierung der Skalierung der Pfeile behebt das Überlappungsproblem. Für das obige Bild wird die Anzahl der Samples auf 24 reduziert. Wenn Sie wirklich 40 Samples benötigen, müssen Sie die Pfeile stärker skalieren, z. B.

\addplot3[gray, quiver={u={1/(\length)}, v={(-x/y)/(\length)}, scale arrows=0.07}, -{Stealth[width=1pt,length=1pt]},samples=40,domain=-3:3] {0};

Eine Möglichkeit, vertikale Pfeile auf der x-Achse zu erhalten, besteht darin, separate Köcher mit u=0,v=±1 hinzuzufügen. Möglicherweise könnte die Pfeilskalierung anders sein.

\documentclass{beamer}
\usepackage{pgfplots}
\usetikzlibrary{arrows.meta}
\begin{document}
\begin{frame}
\def\length{sqrt(1+(-x/y)^2)}
\begin{tikzpicture}
\begin{axis}[
domain=-3:3, 
view={0}{90},
title={$\displaystyle\frac{dy}{dx}=-\frac{x}{y}$},
xmin=-3,
xmax=3,
ymin=-3,
ymax=3,
ytick={-3,-2,-1,0,1,2,3}
]
\addplot3[gray, quiver={u={1/(\length)}, v={(-x/y)/(\length)}, scale arrows=0.07}, -{Stealth[width=1pt,length=1pt]},samples=20,domain=-3:3] {0};

\addplot3[gray, quiver={u={0}, v={1}, scale arrows=0.05}, -{Stealth[width=1pt,length=1pt]},samples=10,samples y=1,domain=-3:-0.17,y domain=0] {0};
\addplot3[gray, quiver={u={0}, v={-1}, scale arrows=0.05}, -{Stealth[width=1pt,length=1pt]},samples=10,samples y=1,domain=-3:-0.17,y domain=0] {0};

\addplot[blue, samples=50, thick, no markers, domain=0:2*pi] ({cos(deg(x))},{sin(deg(x))});
\addplot[red, samples=50, thick, no markers, domain=0:2*pi] ({2*cos(deg(x))},{2*sin(deg(x))});
\addplot[orange, samples=50, thick, no markers, domain=0:2*pi] ({3*cos(deg(x))},{3*sin(deg(x))});
\end{axis}
\end{tikzpicture}
\end{frame}
\end{document}

Bildbeschreibung hier eingeben

Antwort2

Dies ist eine Lösung, die auch das Problem des inkonsistenten Abstands zwischen den Pfeilen behebt, das dadurch entsteht, dass der quiverBefehl pgfplotsan jedem Punkt eines äquidistanten Rasters das Ende und nicht die Mitte eines Pfeils platziert.

Um das Problem zu lösen, kann man zunächst auf die übliche Weise einen Pfeil zeichnen und dann einen zweiten Pfeil zeichnen, der in eine Richtung zeigt, die genau der des ersten Pfeils entgegengesetzt ist, aber ohne Pfeilspitze; das heißt, der zweite „Pfeil“ ist im Wesentlichen nur eine Linie. Zusammen bilden diese beiden Objekte einen Pfeil, der in die Richtung des ersten Pfeils zeigt. Dadurch entsteht die Illusion, dass der Pfeil in der Mitte eines Punktes platziert ist.

Zum Beispiel:

Bildbeschreibung hier eingeben

\begin{tikzpicture}[
    declare function = {f(\x) = -\x/\y;} % Define which function we're using
    ]
    \begin{axis}[
        zmax = 1,
        zmin = 0,
        xtick = {-1,-0.5,...,1},
        axis equal image = true, % Unit vectors for both axes have the same length
        view = {0}{90}
        ]
        \addplot3[% Arrows' first-half
            blue,
            -stealth,
            domain  = -1:1,
            samples = 20,
            quiver  = {
                u=1/(2*sqrt(1^2 + f(x)^2)),
                v=f(x)/(2*sqrt(1^2 + f(x)^2)),
                scale arrows=0.075,
                },
        ] (x,y,0);
        \addplot3[% Arrow's second-half
            blue,
            domain  = -1:1,
            samples = 20,
            quiver  = {
                u=-1/(2*sqrt(1^2 + f(x)^2)),
                v=-f(x)/(2*sqrt(1^2 + f(x)^2)),
                scale arrows=0.075,
                },
        ] (x,y,0);
        \addplot [domain=-180:180, samples=100, color=red, thick] ({0.75*cos(x)},{0.75*sin(x)});
    \end{axis}
\end{tikzpicture}

Die Lösung wurde von einem Matlab-Code von Tobias von Petersdorff von der University of Maryland inspiriert. Hier istder Link.

verwandte Informationen