dy/dx=-x/y의 방향 필드

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}

이것은 $\frac{dy}{dx}=-\frac{x}{y}$의 방향 필드입니다. 두 가지 문제가 있습니다.

  1. 음의 x축에 벡터를 그리는 프로그램을 어떻게 얻나요?
  2. 그래프에 특정 반경의 원을 어떻게 그리나요? (제가 생각해낸 방법은 확실히 작동하지 않습니다!)

도움을 주셔서 감사합니다.

편집: 문서 클래스에 비머로 추가했지만 기사에서도 동일하게 작동합니다.

답변1

여기에 이미지 설명을 입력하세요

\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}

이것이 당신에게 충분한지 잘 모르겠습니다. 원은 파라메트릭 플롯, 즉 다음 형식으로 그려집니다.\addplot ({r*cos(x)}, {r*sin(x)});

x < 0에 대한 화살표 사이의 간격은 내가 볼 수 있는 한 좌표 (x,y)가 화살표의 시작을 참조하고 화살표가 반대 방향을 가리키기 때문에 발생합니다(위 이미지 참조). 거기에 간격이 생기고 x > 0에 대해 겹칩니다. 화살표의 크기 조정을 약간 줄이면 겹침 문제가 해결됩니다. 위 이미지의 경우 샘플 수가 24개로 줄었습니다. 실제로 40개의 샘플이 필요한 경우 화살표의 크기를 더 조정해야 합니다. 예:

\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};

x축에서 수직 화살표를 얻는 한 가지 방법은 u=0,v=±1인 별도의 화살통을 추가하는 것입니다. 아마도 화살표 크기 조정이 다를 수 있습니다.

\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}

여기에 이미지 설명을 입력하세요

답변2

quiver이는 명령이 pgfplots등거리 그리드의 각 지점에 화살표의 중심이 아닌 꼬리를 배치한다는 사실로 인해 화살표 사이의 간격이 일관되지 않는 문제도 해결하는 솔루션입니다 .

문제를 해결하기 위해 먼저 일반적인 방식으로 화살표를 그린 다음 첫 번째 화살표와 정확히 반대 방향을 가리키지만 화살촉이 없는 두 번째 화살표를 그릴 수 있습니다. 즉, 두 번째 "화살표"는 본질적으로 단순한 선입니다. 이 두 개체는 함께 첫 번째 화살표 방향을 가리키는 화살표를 구성합니다. 이렇게 하면 화살표가 점의 중앙에 배치되는 듯한 착시가 발생합니다.

예를 들어:

여기에 이미지 설명을 입력하세요

\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}

이 솔루션은 메릴랜드 대학의 Tobias von Petersdorff가 작성한 Matlab 코드에서 영감을 받았습니다. 여기는링크.

관련 정보