Извлечение интегральных кривых из дискретного векторного поля (Mathematica)

Я пытаюсь написать скрипт Mathematica, который может интерполировать дискретное векторное поле в непрерывное векторное поле. Затем я хочу извлечь интегральные кривые (линии поля) из непрерывного векторного поля.

Я знаю, что функция Mathematica ListStreamPlot может визуально отображать интегральные кривые; однако мне нужны фактические точки, которые их составляют.

Я подумывал написать метод грубой силы со следующим эффектом: кажется, что интегральную кривую можно определить рекурсивно. Если бы в списке была выбрана точка, то «следующей» точкой на интегральной кривой была бы точка с самым близким наклоном. (Каждая «точка» на самом деле является вектором, и поэтому каждая имеет свой собственный наклон.) Есть только 4 кандидата на «следующую» точку — вверх, вниз, влево или вправо от текущей точки. Затем «следующая» точка станет новой начальной точкой, и процесс будет повторяться до тех пор, пока не будет достигнут край сетки.

Однако мне интересно, есть ли более простой метод, использующий функции Mathematica более высокого уровня. (Я также не знаю, правилен ли мой метод хотя бы концептуально.)

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

Спасибо!


person ueronica    schedule 22.01.2013    source источник


Ответы (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]

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

person Vitaliy Kaurov    schedule 22.01.2013
comment
Привет, я понимаю, что это старая тема, но я работаю над этой же проблемой. Возможно, вы знаете, как эта функция реализована в Mathematica? Как он вычисляет интегральные кривые через это дискретное векторное поле? Спасибо - person user2520938; 01.03.2016