从离散矢量场提取积分曲线(Mathematica)

时间:2013-01-22 02:20:36

标签: vector wolfram-mathematica field curve integral

我正在尝试编写一个Mathematica脚本,可以将离散矢量场插值到连续矢量场。然后,我想从连续矢量场中提取积分曲线(场线)。

我知道Mathematica的ListStreamPlot函数可以在视觉上呈现积分曲线;但是,我需要构成它们的实际点。

我考虑过将蛮力方法写成以下效果:似乎可以递归地确定积分曲线。如果在列表中选择了一个点,则积分曲线中的“下一个”点将是具有最接近斜率的点。 (每个“点”实际上是一个向量,因此每个都有自己的斜率。)当前点的“下一个”点 - 向上,向下,向左或向右只有4个候选者。然后,“下一个”点将成为新的起点,并且该过程将递归,直到达到网格的边缘。

但是,我想知道使用Mathematica的更高级函数是否有更简单的方法。 (我也不知道我的方法在概念上是否正确。)

我真的很感激有关此任务的任何想法或建议。

谢谢!

1 个答案:

答案 0 :(得分:3)

仅供参考: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]

enter image description here

在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]

enter image description here