Извлечение интегральных кривых из дискретного векторного поля (Mathematica)
Я пытаюсь написать скрипт Mathematica, который может интерполировать дискретное векторное поле в непрерывное векторное поле. Затем я хочу извлечь интегральные кривые (линии поля) из непрерывного векторного поля.
Я знаю, что Математика ListStreamPlot
функция может визуально представлять интегральные кривые; Однако мне нужны фактические точки, которые их составляют.
Я рассмотрел написание метода грубой силы со следующим эффектом: кажется, что интегральная кривая может быть определена рекурсивно. Если точка была выбрана в списке, то "следующей" точкой на интегральной кривой будет точка с ближайшим наклоном. (Каждая "точка" на самом деле является вектором, и, следовательно, у каждого есть свой наклон.) Для "следующей" точки есть только 4 кандидата - вверх, вниз, влево или вправо от текущей точки. Тогда "следующая" точка станет новой отправной точкой, и процесс будет повторяться до тех пор, пока не будет достигнут край сетки.
Однако мне интересно, есть ли более простой метод, использующий функции высокого уровня Mathematica. (Я также не знаю, является ли мой метод даже концептуально правильным.)
Буду очень признателен за любые мысли или предложения по этой задаче.
Спасибо!
1 ответ
К вашему сведению: http://mathematica.stackexchange.com/
Составьте некоторые данные:
data = Table[{-1 - x^2 + y, 1 + x - y^2}, {x, -3, 3, 0.2}, {y, -3, 3, 0.2}];
Построить ListStreamPlot
plot = ListStreamPlot[data,
StreamStyle -> "Line", Frame -> False, PlotRangePadding -> 0]
В Mathematica все является выражением, поэтому даже этот сюжет в основном представляет собой визуализированный код графических примитивов. Вы можете извлечь эти примитивы - включая нужные вам строки - различными способами. Например - просто выбирая части выражения, вы можете найти все точки, составляющие этот график:
points = plot[[1, 2, 1]];
Если вам нужно увидеть все выражение, оцените plot//InputForm
, Теперь вы также можете сделать сопоставление с образцом, чтобы увидеть внутри выражения. давайте найдем все индексы, содержащие все ваши строки:
indexes = Cases[plot, Line[index_] -> index, Infinity];
Теперь у вас есть все для анализа, рисования и стилизации ваших линий. Например, разработайте приложение, которое выделяет определенную линию на исходном графике:
Animate[Show[
plot,
Graphics[{Red, Opacity[.5], , Thickness[.02],
Line[points[[indexes[[k]]]]]}]]
, {{k, 1, "lines"}, 1, Length[indexes], 1}, FrameMargins -> 0]