私が開発しようとしている愚かなスクリーンセーバーの場合、2Dベクトルの発散のない2D配列をランダムに生成し、それを使用して線積分畳み込みプロットを生成します。これを行う1つの方法は、ランダムノイズを生成し、ヘルムホルツホッジ分解のソレノイドコンポーネントを投影することであると聞いたことがあります。それをするために、私は次の推論を使ってみました:
関数は、ヘルムホルツホッジ分解 ( 、およびはスカラー関数)とりあえず、調和成分が消失すると仮定します。2 F = H + ∇ φ + J ∇ ψ J = (0 - 1 1 0) φ 、ψ H
フーリエ空間では、これは なり、ソレノイド投影を定義できますとしてのフーリエ空間の演算子は 、介してソレノイドコンポーネントに関数を投影します P = I - K ⊗ K
次に、これをMathematicaで実装して、ランダム配列に適用しようとしました。最初にランダム配列を生成し、FFTを2つのコンポーネントのそれぞれに適用します。
arr = RandomReal[{-1, 1}, {2, 21, 21}];
fArr = Fourier /@ arr;
次に、を配列インデックスの関数として定義します。
k[k1_, k2_] := Mod[{k1 - 1, k2 - 1}, 21, -10]/21;
次に、フーリエ成分の射影を実行します(の特異点はステートメントを使用してそのままにしておきます)。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}];
次に、2つのコンポーネントをiFFTします。
projArr = InverseFourier /@ dat;
これにより、純粋に実数の配列が得られ、単純に結果が近似になると期待します。私の質問は:
- 結果はどのように近似しますか?
Chris BeaumontのHH_DECOMPルーチンがFFTを使用してHelmholtz-Hodge分解を実行することになっているため、2DデータのHelmholtz-Hodge分解は重要なタスクであると思われますが、メソッドのように彼は(コードの上部のコメントで)不正確。同様に、2Dデータのヘルムホルツ・ホッジ分解を実行するためのより複雑な変分法があります。これは、より単純なFFT法が何らかの形で不適切であることを示唆しているようです。どうして?FFTメソッドは何が間違っていますか?そして、ランダムノイズの高調波成分が消失すると仮定するのは間違っていますか?
(1):Stable Fluids、Jos Stam。
(2):Helmholtz-Hodge分解を使用したベクトルフィールドの特徴検出、Alexander Wiebel、12ページ。
(3):離散マルチスケールベクトル場分解、Yiying Tong。