web-dev-qa-db-ja.com

ベクトル場から軌道を計算するアルゴリズム

2次元のベクトルフィールドがあります。つまり、各ポイント(x, y)ベクトルがあります(u, v)uvxyの関数です。

このベクトル場は、一連の軌道、つまり、粒子がベクトル場に沿ってたどる場合に粒子がたどる一連の経路を標準的に定義します。次の画像では、ベクトルフィールドが赤で示され、部分的に表示されている4つの軌跡が濃い赤で示されています。

trajectories

与えられたベクトル場のいくつかの軌道を効率的に計算するアルゴリズムが必要です。軌道は、平面内のある種の最小密度(平面内のすべての点について、「近くの」軌道を持っている必要があります)または妥当な軌道のセットを取得するための他の条件を満たす必要があります。

これに関してGoogleで役立つものを見つけることができず、Stackexchangeもこのトピックを処理していないようです。

このようなアルゴリズムを自分で考案する前に、次のようにします。この問題の既知のアルゴリズムはありますか?名前は何ですか、検索する必要があるキーワードは何ですか?

3
cheesus

明らかに、一連の微分方程式を扱っています。

dx/dt = u(x、y)
dy/dt = v(x、y)

実際にそのような方程式を統合できる多くのアルゴリズムがありますが、uとvに依存します(線形かどうかなど)。これについてもう少し情報を提供できますか?

要件に関連して、複数の軌跡を「互いに近くに」作成することは正しく理解されていますか?それとも別の意味ですか?

編集:

私が元の投稿を書いたとき、私は少し混乱したに違いありません。明らかに、微分方程式は線形であり、uとvの実際の形式はそれほど重要ではありません。

実際、これらの方程式の統合は非常に簡単です。精度がそれほど重要でない場合は、単純なオイラー積分を行うことができます。それ以外の場合は、ルンゲクッタ法(たとえば、RK4-4次ルンゲクッタ)を検討することをお勧めします。

これらはどちらもよく知られているので、ここでは詳しく説明しません。グーグル検索を行うか、ウィキを確認してください:

オイラー法
ルンゲクッタ法

緻密さを実現するのは少し難しいと思います。微分方程式は線形であるため、2つの初期位置を少しずらすと、同様の軌跡が得られます。明らかに、コンピュータの精度が許すのと同様の軌跡を得ることができます。代わりに、2つの軌跡を同じような点で終わらせたい場合は、単に終点を定義して、逆統合を行うことができます。

4
nilu

これは微分方程式の解法についてです。

あなたの場合、f(t)は、瞬間の粒子の位置tです。 f'(t)は、この軌道に沿って移動するポイントの速度です。

したがって、ベクトルフィールドが速度の方向と大きさを定義する場合、方程式はf'(t)=V(f(t))です。

そのような方程式を解くには、いくつかの出発点が必要です。異なる方向からの多くの軌跡が収束しない「良い」場所では、中間点さえもあり、両方向で方程式を解いても問題ありません。

したがって、「密度」を確保するための可能なソリューションの1つは次のとおりです。

  1. ランダムポイントを取る
  2. そのための軌道を構築する
  3. 既存の軌道からの距離が最大の点を見つける
  4. この距離が十分に短い場合-完了です
  5. このポイントの軌道を構築する
  6. 3に行く
2
maxim1000

(niluが言うように)数値的方法に基づいた素朴なアルゴリズム:

  1. 開始点を現在の点とする
  2. フィールド内の最も近いベクトルに基づいてベクトルを計算し、現在のポイントからそれらまでの距離に基づいて重みを付けます
  3. 現在のポイント、計算されたベクトル、およびステップの長さを示すいくつかのイプシロンに基づいて新しいポイントを計算します
  4. 2と3を繰り返して、軌道のポイントのリストを取得します

ステップ2.は最もトリッキーです。最初に頭に浮かぶのは、 perlinノイズ で使用されているのと同じ種類の重み付き距離計算を使用することです。許容可能なエラーで結果を得るには、おそらく微調整が必​​要になるでしょう。しかし、「これだけ」は低密度フィールドでしか行えません。

1
Euphoric