\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}$. У меня две проблемы.
- Как заставить программу рисовать векторы на отрицательной оси x?
- Как нарисовать на графике окружности определенного радиуса (придуманный мной метод явно не работает!)?
Спасибо за любую помощь.
Редактировать: Я добавил в класс документа как beamer, но он работает точно так же и со статьей.
решение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}
Решение было вдохновлено кодом Matlab Тобиаса фон Петерсдорфа из Мэрилендского университета. Вотсвязь.