微分方程流的图形系统

微分方程流的图形系统

我目前正在尝试绘制应用于 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

评论。

  1. 我定义了坐标,使得平面 Oxy 对应于经度为 0 时碎石定义的平面。
  2. 代码中有一些常量用于断开曲线的缩放与坐标系的关系。
  3. 我尽量尊重你对上下轨迹的选择。它们对我来说似乎有点奇怪。穿过水平面时应该有某种连续性。

代码

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

相关内容