2

シンプルなコンソール アプリを作成するプロジェクトが割り当てられました。2D 平面でのブラウン運動をモデル化します。その方法に関する情報はあまり与えられませんでした (そして、それが乱数の生成に依存しているというだけで、洞察を得ることができるように、それがかなり人気のある割り当てであることを願っています)。ブラウン運動を少し調べてみると、複雑そうな式がいくつか見られましたが、説明によると、一定の数の間隔内でランダムに移動する必要があるようです。誰でも明確にできますか?間隔内で乱数を継続的に作成し、粒子の "x" と "y" 座標を変更するプログラムを作成する必要がありますか?それ以上のことはありますか?

助けてくれてありがとう。

4

4 に答える 4

3

ブラウン運動は、ランダムな空気分子が小さな粒子に衝突した結果です。一連のランダムな力の合計が正確に 0 になる可能性は低く、粒子の質量が非常に小さいため、揺れるように見えるため、ブラウン運動が発生します。したがって、ランダムに見えるモーションが得られますが、一様ではありません。

それをモデル化する愚かな方法は、方向の均一分布と数百の空気分子の運動量のガウス分布を取得し、粒子に衝突を適用し、合計を取得することです。これを何度も行うと、ブラウン型の運動が得られます。(個々の空気分子の平均運動量は温度に依存し、空気分子の数は圧力に依存します。)

結果のモーションはガウスではなく、ガウス分布からの多くのサンプルの合計であることに注意してください。それが何と呼ばれているかわかりません。

于 2012-04-08T23:19:08.707 に答える
1

あなたの質問はひどく不適切です。ブラウン運動を適切に実装するには、コーディングに着手する前に、問題領域の非常に洗練された仕様と分析が必要であるとインストラクターが指摘したはずなので、これはほとんど間違いなくあなたのせいではありません。

ブラウン運動の正確な定義は、測定理論の関連コースを受講していない限り、おそらくわかりにくいでしょう。ただし、ネット上には、伊藤プロセス (ブラウン運動がその例です) について適切に説明しているリソースがたくさんあります。

このようなプロセスをコーディングすることに興味がある場合は、ここに適切なヒントがあります。ある段階で、乱数を生成する必要があります。ほぼ確実に、正規分布からドローを生成することに興味を持つでしょう。ありがたいことに、C++ プログラマーが利用できる、これを行う優れた方法がいくつかあります。私のお気に入りは、Boost.Random ライブラリ (または C++11 の関連ライブラリ) を使用することです。最も賢明な戦略は、おそらく variate_generator を使用して、関数オブジェクトを使用して確率変量を生成することです。

#include <iostream>
#include <vector>
using namespace std;

#include <boost/random/mersenne_twister.hpp>
#include <boost/random/normal_distribution.hpp>
#include <boost/random/variate_generator.hpp>

int main()
{
  // Some typedefs to help keep the code clean
  // Always a good idea when using Boost!
  typedef boost::mt19937                                      T_base_prng;
  typedef boost::normal_distribution<>                        T_norm_varg;
  typedef boost::variate_generator<T_base_prng&, T_norm_dist> T_norm_varg;

  unsigned int base_seed = 42;  // Seed for the base pseudo-random number generator
  double       mean      = 0.0; // Mean of the normal distribution
  double       stdev     = 1.0; // Standard deviation of the normal distribution
  T_base_prng  base_prng(base_seed); // Base PRNG
  T_norm_dist  norm_dist(mean, stdev); // Normal distribution
  T_norm_varg  norm_varg(base_prng, norm_dist); // Variate generator

  // Generate 1000 draws from a standard normal distribution
  vector<double> drawVec(1000);
  for (vector<double>::iterator iter = drawVec.begin(); 
       iter != drawVec.end(); ++iter)
  {
    *iter = norm_varg();
  }

  // More stuff...


  return 0;
}

ブラウン運動が何であるかを理解したら、Boost.Random の機能を使用していくつかの例を作成するのは簡単です。

于 2012-04-09T05:11:17.837 に答える
1

ランダムな動きは「均一」ではないことに注意してください。むしろ、動きの頻度と移動距離をプロットすると、ほとんどが短く、一部は長く、いくつかは非常に長く、指数関数に似たものを作成していることがわかります。却下。

モーションがどの統計曲線を観察するかは覚えていませんが、おそらくそれを理解することができ、その曲線に適合する値を生成する乱数ジェネレーターを作成する必要があります.

私がすることは、この RNG を使用して距離を計算し、均一な RNG を使用してゼロから 2*pi までの角度を計算し、運動を極にすることです。ランダムな X とランダムな Y を別々に計算できますが、同じ分布になるかどうかはわかりません。

于 2012-04-08T23:19:51.363 に答える
0

xはい、次のように各時間ステップでとy座標に乱数を追加するだけで済みます。

int x=0, y=0;

for (int t=0; t<N; t++) {
    x += distribution(gen);
    y += distribution(gen);
    display(x, y);
}

{0,1}ここで、分布は、間隔、またはガウス分布として単純にすることができます。

編集:非常に大きな N の場合、平均距離を測定し、のR = d(x,y)ようにスケーリングされているかどうかを確認できt ~ R^2ます。確かに、上記のコードは 1 つのブラウン運動しか生成しません。関係が保持されるためには、何度も繰り返さなければなりません。自分で実験してください。

于 2012-04-08T23:20:03.383 に答える