Построение потоков векторных полей

Построение потоков векторных полей

Итак, у меня есть векторное поле ${x^2+2*x*y,y^2+2*x*y}, и я хотел бы построить «потоки». quiverиз pgfplotsсоздает стрелки (которые я нормализую), но я думаю, что потоки сделали бы вещи более понятными. Вот , StreamPlotкоторый создает mathematica.

График векторного поля в Mathematica

введите описание изображения здесь

Я хотел бы иметь возможность сделать что-то вроде этого с pgfplotsвозможностью поддерживать единообразие стиля. Возможно, если бы я мог извлечь точки, которые производят кривые, то это можно было бы построить с помощью pgfplots.

решение1

Я использовал это:https://mathematica.stackexchange.com/questions/19859/извлечение-данных-в-файлПервоначально. Первым элементом в сюжете dynamicalStreamбыла пустая строка плюс объектGraphicsComplex. Я извлек точки из графика с помощью points = dynamicalStream[[1]][[2]][[1]]. У кого-то это может быть по-другому. LineОбъекты из этого GraphicsComplexобъекта были извлечены с помощью (и я извиняюсь за то, как я это сделал, возможно, есть лучшие методы)

lines = dynamicalStream[[1]][[2]][[2]][[2]][[3]][[2 ;; Length[ dynamicalStream[[1]][[2]][[2]][[2]][[3]]]] ].

Я бы сказал, что это вряд ли будет полезно, поэтому либо найдите более общий метод, либо сделайте то, что сделал я, а именно вручную найдите нужную часть списка для извлечения.

Затем я создал список, где каждый элемент сам по себе является списком точек для каждой линии. Это было сделано с помощью pointstable = Table[points[[#[[1]][[i]]]], {i, 1, Length[#[[1]]]}] & /@ lines. Внутренний список был создан путем прохода по каждому элементу в Lineобъекте (это позиция точки в pointsсписке) и извлечения правильной точки. Таким образом, вы создаете список точек, соответствующих Line. Затем это сопоставляется с каждым Lineобъектом в , linesпоэтому окончательный список имеет описанную форму.

Затем я сохранил каждый список в отдельном текстовом файле, Export["line" <> IntegerString[#2] <> ".txt", #,"Table"] &~MapIndexed~pointstable как описано в ссылке.

Я построил график с помощью:

\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\usetikzlibrary{decorations.markings}
\tikzset{->-/.style={decoration={
  markings,
  mark=at position #1 with {\arrow{>}}},postaction={decorate}}}
  \tikzset{-<-/.style={decoration={
  markings,
  mark=at position #1 with {\arrow{<}}},postaction={decorate}}}

\begin{document}
    \begin{tikzpicture}[scale=1.5]
        \begin{axis}[axis lines=none]
            \foreach \i in {1,2,3,4,...,107}{
                \addplot[black,->-=0.5] table[]{line\i.txt};
            }
        \end{axis}
    \end{tikzpicture}
\end{document}

Результат

Если внимательно рассмотреть эту ссылку, то проще всего сделать так:

points  = Cases[dynamicalStream, GraphicsComplex[data__] :> data, -3, 1][[1]]
lines = Cases[dynamicalStream, Line[data__] :> data, -3];
pointstable = Table[points[[#[[i]]]], {i, 1, Length[#]}] & /@ lines

Связанный контент