2

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

我知道Mathematica的ListStreamPlot函数可以直观地呈现积分曲线;但是,我需要包含它们的实际点。

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

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

我非常感谢您对这项任务的任何想法或建议。

谢谢!

4

1 回答 1

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]

在此处输入图像描述

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

在此处输入图像描述

于 2013-01-22T03:35:59.010 回答