![微分方程流的图形系统](https://linux22.com/image/456915/%E5%BE%AE%E5%88%86%E6%96%B9%E7%A8%8B%E6%B5%81%E7%9A%84%E5%9B%BE%E5%BD%A2%E7%B3%BB%E7%BB%9F.png)
我目前正在尝试绘制应用于 2,3 维欧几里得空间某些点的流图,但这非常困难。
我想要的是绘制这样的图
和这个
使用这样的表达式
采用更简洁、更美观的设计
可以这样做吗?
附言:“sen”的意思是正弦。
更新:
对于第一个例子,Daniel N. 提出的建议基本有效。
\documentclass[dvipsnames, margin = 5mm]{standalone}
\usepackage{pgfplots}
\usepackage{tikz-3dplot}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}
\pgfplotsset{compat=newest}
\def\Point{36.9}
\begin{document}
\tdplotsetmaincoords{80}{130}
\begin{tikzpicture}[tdplot_main_coords, scale = 1]
\begin{axis}[
axis lines=middle,
height=12cm,
xtick=\empty,
ytick=\empty,
]
\addplot[variable=\t, domain=.063:4, samples=80] plot (\t, 1/\t);
\addplot[variable=\t, domain=.063:4, samples=80] plot (-\t, 1/\t);
\addplot[variable=\t, domain=.063:4, samples=80] plot (\t, -1/\t);
\addplot[variable=\t, domain=.063:4, samples=80] plot (-\t, -1/\t);
\addplot[variable=\t, domain=.067:3.7, samples=80] plot (\t+0.3, 1/\t+1);
\addplot[variable=\t, domain=.067:3.7, samples=80] plot (-\t-0.3, 1/\t+1);
\addplot[variable=\t, domain=.067:3.7, samples=80] plot (\t+0.3, -1/\t-1);
\addplot[variable=\t, domain=.067:3.7, samples=80] plot (-\t-0.3, -1/\t-1);
\end{axis}
\end{tikzpicture}
\end{document}
没关系。稍加调整就完美了。
然而,第二个就比较棘手了。我找到了一个与我所寻找的类似的例子,但我仍然难以塑造它。
\documentclass[dvipsnames, margin = 5mm]{standalone}
\usepackage{pgfplots}
\usepackage{tikz-3dplot}
\usetikzlibrary{decorations.markings}
\pgfplotsset{compat=newest}
\def\Point{36.9}
\begin{document}
\tdplotsetmaincoords{80}{130}
\begin{tikzpicture}[tdplot_main_coords, scale = 1]
\begin{axis}[
view={-5
0}{-20},
axis lines=middle,
zmax=60,
height=12cm,
xtick=\empty,
ytick=\empty,
ztick=\empty
]
\addplot3+[,ytick=\empty,yticklabel=\empty,
mark=none,
thick,
Black,
domain=2:16.7*pi,
samples=400,
samples y=0,
]
({(1/x)*sin(0.28*pi*deg(x))},{(1/x)*cos(0.28*pi*deg(x)},{x+20});
\addplot3+[,ytick=\empty,yticklabel=\empty,
mark=none,
thick,
Black,
domain=2:16.7*pi,
samples=400,
samples y=0,
]
({(1/x)*sin(0.28*pi*deg(x))},{(1/x)*cos(0.28*pi*deg(x)},0);
\addplot3+[,ytick=\empty,yticklabel=\empty,
mark=none,
thick,
Black,
domain=2:16.7*pi,
samples=400,
samples y=0,
]
({-(1/x)*cos(0.28*pi*deg(x))},{-(1/x)*sin(0.28*pi*deg(x)},{-x-20});
\end{axis}
\end{tikzpicture}
\end{document}
这几乎就是我想要的。问题是曲线没有足够快地接近 z 轴。
答案1
我认为,应该通过装饰来赋予轨迹的意义。但我不知道如何包含装饰,以便\addplot
只触及曲线,而不触及轴。所以我重新制定了你的解决方案,而没有使用pgfplots
装饰被称为sense
并且取决于三个参数:曲线上的位置、倾斜角度(将其链接到曲线的密切平面)和点的长度(尖端的长度)。
如果需要恢复轨迹上的意义,就必须\arrow
改为\arrowreversed
。
评论。
- 我定义了坐标,使得平面 Oxy 对应于经度为 0 时碎石定义的平面。
- 代码中有一些常量用于断开曲线的缩放与坐标系的关系。
- 我尽量尊重你对上下轨迹的选择。它们对我来说似乎有点奇怪。穿过水平面时应该有某种连续性。
代码
\documentclass[11pt, margin=5mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{math, calc}
\usetikzlibrary{decorations.markings, arrows.meta}
\begin{document}
\tikzset{%
view/.style 2 args={%
z={({-sin(#1)}, {-cos(#1)*sin(#2)})},
x={({cos(#1)}, {-sin(#1)*sin(#2)})},
y={(0, {cos(#2)})},
evaluate={%
\tox={sin(#1)*cos(#2)};
\toy={sin(#2)};
\toz={cos(#1)*cos(#2)};
}
},
sense/.style n args={3}{ % position, slant, length, color
decoration={
markings,
mark=at position #1 with {%
\arrow{Stealth[length=#3, slant=#2]}
}
}, postaction=decorate
}
}
\tikzmath{
real \fc, \T;
\fc = .28*pi;
\T = 16*pi;
function F(\t) {return {sin(\fc*deg(\t))/\t};};
function G(\t) {return {.3*(\t/\T +.2)};};
function H(\t) {return {cos(\fc*deg(\t))/\t};};
}
\begin{tikzpicture}[view={30}{10}, scale=5]
\begin{scope}[gray, very thin,
evaluate={%
real \a, \b, \c, \r;
\a = .8; \b = .6; \c = 1;
\r = .7;
}]
\draw[->] (-\r*.6*\a, 0, 0) -- (\r*\a, 0, 0) node[scale=.7, pos=1.03] {$x$};
\draw[->] (0, -\r*\b, 0) -- (0, \r*\b, 0);
\draw[->] (0, 0, -\r*\c) -- (0, 0, \r*\c);
\end{scope}
\draw[variable=\t, domain=2:\T, samples=300,
sense={.12}{1.5}{5}] plot ({F(\t)}, {G(\t)}, {H(\t)});
\draw[blue, variable=\t, domain=2:\T, samples=300,
sense={.12}{1.5}{5}] plot ({F(\t)}, 0, {H(\t)});
\draw[variable=\t, domain=2:\T, samples=300,
sense={.12}{-1.5}{5}] plot ({-H(\t)}, {-G(\t)}, {-F(\t)});
\end{tikzpicture}
\end{document}