2012-04-08 9 views
2

私は単純なコンソールアプリケーションを作成するプロジェクトが割り当てられています。 2D平面上でブラウン運動をモデル化する。私はそれを行う方法について多くの情報を与えられていませんでした(そして、それは乱数生成に依存しているので、かなりの普及が期待されています)。私はブラウン運動を少し調べて、複雑に見えるいくつかの数式を見ましたが、説明によっては特定の数の間隔内でランダムに移動しなければならないようです。誰でも明確にすることはできますか?私は一定の間隔で乱数を連続的に作成し、それから粒子 "x"と "y"座標を変更するプログラムを作成するのですか?ランダムウォークブラウン運動

ありがとうございました。

+0

具体的に何を試しましたか、問題がありますか? – Chad

+2

これはあなたのTAに尋ねる何かのように聞こえる。 –

+0

それは本格的な[ブラウン運動](http://ja.wikipedia.org/wiki/Brownian_motion)か、はるかに単純な[ランダムウォーク](http://en.wikipedia.org/wiki/Random_walk)ですか?次の反復でランダムウォークからブラウン運動にプログラムを移行する必要がありますか? – sarnold

答えて

1

ランダムモーションは「均一」ではなく、動きの頻度と移動距離をプロットすると、ほとんどが短く、長めが長く、長さが非常に長いことがわかります指数関数的な減少に似たもの。

モーションが観測する統計的な曲線は覚えていませんが、それを理解してから、その曲線に合わせて値を生成する乱数ジェネレータを作成する必要があります。

私はこのRNGを使って距離を計算し、次に一様なRNGを使って0から2 * piの角度を計算し、動きを極座標にします。ランダムXとランダムYを別々に計算することができますが、私はあなたが同じ分布を得るのかどうかはわかりません。

+0

うん、bdaresは分布 - ガウス分布を持っていた。 (1972年以来、このことについては考えていませんでした)ガウス乱数を直接計算するRNGがあります(少なくとも1972年にあった)。 –

+1

C++は乱数ライブラリで使用するガウス分布を持ちます。 'std :: normal_distribution'と呼ばれています。 – bames53

3

ブラウン運動は、小さな粒子に衝突するランダムな空気分子の結果です。ランダムな力の集まりの合計は正確に0であるとは限らないため、粒子の質量は非常に小さいので、周囲を揺らすように見え、したがってブラウン運動が見える。だからあなたはランダムに見えるモーションを得るが、一様ではない。

数百の空気分子の運動量に対する方向とガウス分布の一様分布をモデル化し、粒子に衝突を加え、その和を求めるのが愚かな方法です。これを何度もやってブラウンタイプの動きを得るでしょう。 (個々の空気分子は温度に依存する平均運動量を有し、空気分子の数は圧力に依存する)。

結果運動はガウス分布ではなく、ガウス分布からの多くのサンプルの合計分布。それが何と呼ばれているかわからない。

+0

ガウス分布(正規分布)の多くのサンプルの和がガウス分布であるべきではないか?中心極限定理によって、*任意の分布の標本平均の標本分布は、標本の数が束縛されずに増加するにつれて正規分布に近づく。 – wchargin

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のようにスケールされているかどうかを確認することができます。確かに、上記のコードはブラウン運動を生成するだけです。関係を保持するためには、何度も繰り返す必要があります。自分で実験してください。

+0

[タグ:宿題]の質問に応じて、事前に書かれたコードを直接与えないようにしてください。 (これはドロップインの準備ではありませんが、少なくともbdaresとHot Licksはさらに、どのディストリビューションの問題を提起して、彼らが優れた答えであると感じているかを特定しています)。 – sarnold

+0

これは当てはまりません。ブラウンのプロセスがある間隔内でどれだけ移動するかは、ガウス分布に従う。 –

+0

@ApprenticeQueue:Nが非常に大きい場合にのみ統計的に真です。小さな「N」の場合は、ブラウン運動であるかどうかを知ることができます – unsym

1

あなたの質問はひどく悪いです。ブラウン運動を適切に実装するためには、コーディングを始める前であっても、問題のドメインについてかなり洗練された仕様と分析が必要であることを指導者が指摘すべきであったため、これはほとんど間違いではありません。

ブラウン運動の正確な定義は、測定理論で関連するコースを取らない限り、おそらくあなたに不透明になるでしょう。しかし、ネット上には、Itoプロセス(ブラウン運動の例)の適切な記述を与える多くのリソースがあります。

このようなプロセスをコーディングすることに興味がある場合は、こちらを参考にしてください。ある段階で乱数を生成する必要があります。ほぼ確実に、あなたは正規分布から描画を生成することに関心を持つでしょう。ありがたいことに、これを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の機能

+0

ブーストではなく標準ライブラリを使用するほうがよいでしょう。 – bames53