使用 FFT 快速简单的离散 2D Helmholtz-Hodge 分解?

计算科学 傅立叶分析
2021-12-17 10:32:52

对于我正在尝试开发的一个愚蠢的屏幕保护程序,我想随机生成一个无散度的二维向量数组,然后用它来生成一个线积分卷积图。我听说1一种方法是产生随机噪声,然后投射出亥姆霍兹-霍奇分解的螺线管分量。为此,我尝试使用以下推理:

一个函数f:R2R2有亥姆霍兹-霍奇分解2

f=h+ϕ+Jψ
在哪里
J=(0110)
和在哪里ϕ,ψ是标量函数。现在,假设谐波分量h消失。

在傅立叶空间中,这变为

Ff=ikϕ^iJkψ^
我们可以在傅里叶空间上定义一个螺线管投影算子为
P=Ikkkk
它在其螺线管组件上投射一个功能,通过
F1PFf=Jψ.

然后我尝试在 Mathematica 中实现这一点,将其应用于21×21×2随机数组。首先,我生成随机数组,并将 FFT 应用于其两个组件中的每一个:

arr = RandomReal[{-1, 1}, {2, 21, 21}];
fArr = Fourier /@ arr;

然后我定义k作为数组索引的函数:

k[k1_, k2_] := Mod[{k1 - 1, k2 - 1}, 21, -10]/21;

然后我对傅里叶分量进行投影(奇点在k=0单独使用If语句):

dat = Transpose[
   Table[If[k1 == 1 && k2 == 1, fArr[[;; , k1, k2]], 
     fArr[[;; , k1, k2]] - 
      k[k1, k2] (k[k1, k2].fArr[[;; , k1, k2]])/(k[k1, k2].k[k1, 
           k2])], {k1, 21}, {k2, 21}], {2, 3, 1}];

然后我iIFFT这两个组件:

projArr = InverseFourier /@ dat;

这给出了一个纯实数数组,我天真地期望结果是Jψ. 我的问题是:

  • 结果在什么意义上近似Jψ?

假设 2D 数据的 Helmholtz-Hodge 分解是一项不平凡的任务,因为 Chris Beaumont 的HH_DECOMP例程应该使用 FFT 来执行 Helmholtz-Hodge 分解,但他也说(在代码顶部的注释中)该方法似乎不准确。同样,有更复杂的变分方法来执行亥姆霍兹-霍奇分解32D 数据,这似乎表明更简单的 FFT 方法在某种程度上是不够的。为什么?FFT 方法有什么问题?假设我的随机噪声谐波分量消失是错误的吗?

(1):稳定流体,乔斯·斯塔姆。

(2):使用 Helmholtz-Hodge 分解的向量场中的特征检测,Alexander Wiebel,第 12 页。

(3):离散多尺度向量场分解,童一英。

2个回答

生成无散二维函数的最简单方法是使用流函数,ψ. 在哪里

u=ψyandv=ψx

一旦你生成一个随机ψ,然后您可以使用傅立叶表示(或有限差分)来计算两个导数。不过,我还没有尝试过这种真正随机输入的事情。从更平滑但随机的输入开始(例如具有随机频率和系数的正弦函数的总和),您可能会受益。

您在帖子中提出了几个问题,因此虽然比尔为潜在问题提供了解决方案,但我觉得也应该有人对您提出的问题发表一些看法。

结果在什么意义上近似Jψ?

如果将输入数组解释为周期性带限矢量场的无别名采样f=h+ϕ+Jψ,那么结果恰好是h+Jψ. 毕竟,采样数组的 FFT 本质上是底层周期函数的傅里叶级数(假设有足够的采样)。

请注意,由于f是周期性的,h只是一个常数向量场。

Chris Beaumont 的 HH_DECOMP 例程应该使用 FFT 来执行 Helmholtz-Hodge 分解,但他也说(在代码顶部的注释中)该方法似乎不准确。

我不确定那里发生了什么,因为我无法读取 IDL,但看起来测试向量场不是周期性的?

同样,有更复杂的变分方法来执行二维数据的 Helmholtz-Hodge 分解,这似乎表明更简单的 FFT 方法在某种程度上是不够的。为什么?

我觉得你多虑了。在您引用的论文的第二页上,他们指出,“规则网格上的离散亥姆霍兹-霍奇分解已经在图形中使用(例如参见 [​​25, 10]),并且使用有限差分方法实现起来相对简单. 然而,为任意网格设计一种实用且准确的方法要困难得多。

FFT 方法有什么问题?

如果您有周期性边界条件,则没有。事实上,在这些条件下,与有限差分方法的多项式收敛相比,像这样的谱方法会为您提供指数收敛。不过,它们更难应用于任意几何形状。

假设我的随机噪声谐波分量消失是错误的吗?

从技术上讲,是的,但在周期性情况下,唯一可能的谐波矢量场是常数。因此,不理会 DC 组件就可以了。