2012-04-08 9 views
2

Ich habe das Projekt der Erstellung einer einfachen Konsole App zugewiesen. das modelliert die Brownsche Bewegung in einer 2D-Ebene. Ich habe nicht viele Informationen dazu bekommen (und ich hoffe, dass es eine ziemlich populäre Aufgabe ist, damit ich einen Einblick bekommen kann), nur dass es auf der Generierung von Zufallszahlen beruht. Ich habe die Brownsche Bewegung ein wenig untersucht und einige Formeln gesehen, die kompliziert aussahen, aber bei der Beschreibung scheint es sich einfach so zu bewegen, dass sie sich zufällig innerhalb eines bestimmten Zahlenintervalls bewegen. Kann jemand klären? Soll ich ein Programm erstellen, das ständig eine Zufallszahl in einem Intervall erzeugt und dann die "x" - und "y" -Koordinaten der Partikel ändert oder gibt es da noch mehr?Random Walk- Brownian Motion

Danke für jede Hilfe.

+0

Was genau haben Sie versucht oder haben Sie ein Problem mit? – Chad

+2

Das klingt nach etwas, um deinen TA zu fragen. –

+0

Ist es ausgewachsen [Brownian motion] (http://en.wikipedia.org/wiki/Brownian_motion) oder der weitaus einfachere [random walk] (http://en.wikipedia.org/wiki/Random_walk)? Müssen Sie das Programm in der nächsten Iteration von random walk in Brownian motion migrieren? – sarnold

Antwort

1

Denken Sie daran, dass die zufällige Bewegung nicht "einheitlich" ist, sondern wenn Sie die Häufigkeit von Bewegungen gegen Bewegungsabstand grafisch darstellen, werden Sie sehen, dass die meisten kurz sind, einige länger sind und einige sehr lang sind etwas, das einem exponentiellen Verfall ähnelt.

Ich kann mich nicht erinnern, welche statistische Kurve die Bewegung beobachtet, aber Sie können das wahrscheinlich herausfinden, und dann müssen Sie einen Zufallszahlengenerator erstellen, der Werte generiert, die dieser Kurve entsprechen.

Was ich tun würde, ist die Entfernung mit diesem RNG berechnen, dann verwenden Sie eine einheitliche RNG, um Winkel von Null bis 2 * Pi zu berechnen, und machen Sie die Bewegung polar. Sie könnten ein zufälliges X und ein zufälliges Y separat berechnen, aber ich bin nicht sicher, ob Sie die gleiche Verteilung erhalten würden.

+0

Ja, bdares hatte die Verteilung - Gaussian. (Habe seit 1972 nicht mehr über diese Dinge nachgedacht.) Es gibt Zufallszahlen, die direkt Gaußsche Zufallszahlen berechnen (oder zumindest 1972). –

+1

C++ hat eine Gauss-Verteilung zur Verwendung mit seiner Zufallszahlenbibliothek. Es heißt 'std :: normal_distribution'. – bames53

3

Brownsche Bewegung ist das Ergebnis von zufälligen Luftmolekülen, die auf ein kleines Teilchen treffen. Da die Summe einer Menge zufälliger Kräfte unwahrscheinlich genau 0 ist und die Masse des Teilchens so klein ist, scheint es herumzuwackeln, daher Brownsche Bewegung. Sie erhalten also eine zufällige Bewegung, die aber nicht einheitlich ist.

Die dumme Weise, es zu modellieren, würde sein, eine gleichmäßige Verteilung für die Richtung und Gaußsche Verteilung für den Impuls von Hunderten von Luftmolekülen zu erhalten, Kollisionen auf ein Partikel anzuwenden und die Summe zu erhalten. Tun Sie dies viele Male und Sie erhalten eine Brownsche Bewegung. (Die einzelnen Luftmoleküle haben einen mittleren Impuls abhängig von der Temperatur und die Anzahl der Luftmoleküle ist abhängig vom Druck.)

Beachten Sie, dass die resultierende Bewegung nicht Gauß ist, sondern die Summe vieler Stichproben aus der Gaußschen Verteilung. Nicht sicher, wie es heißt.

+0

Sollte die Summe vieler Stichproben aus der Gaußschen (Normal-) Verteilung nicht selbst Gauß sein? Nach dem zentralen Grenzwertsatz nähert sich die Stichprobenverteilung des Stichprobenmittelwerts der * any * -Distribution der Normalverteilung an, wenn die Anzahl der Stichproben ohne Bindung wächst. – wchargin

0

Ja, Sie müssen nur die Zufallszahl an die x hinzuzufügen und y Koordinaten zu jedem Zeitschritt wie folgt:

int x=0, y=0; 

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

wo die Verteilung als {0,1} einfach sein kann, ein Intervall oder eine Gaußverteilung .

Edit: Für sehr großen N, können Sie messen, ob der mittleren Abstand R = d(x,y) und prüfen, ob es wie t ~ R^2 skaliert wird. Sicher, der obige Code erzeugt nur eine Brownsche Bewegung, damit die Beziehung halten kann, müssen Sie viele Male wiederholen. Mach das Experiment selbst.

+0

Beachten Sie, dass wir es vermeiden möchten, direkt vorgefertigten Code als Antwort auf [Tag: Hausaufgabe] Fragen zu geben. (Nicht, dass dies Drop-In bereit ist, aber zumindest Bdares und Hot Licks haben weiter das Problem der Verteilung speziell angesprochen, dass ich fühle, dass sie überlegene Antworten sind.) – sarnold

+0

Dies ist nicht wahr. Wie weit sich ein Brown'scher Prozess innerhalb eines Intervalls bewegt, folgt einer Gauß-Verteilung. –

+0

@ApprenticeQueue: Es ist statistisch nur wahr, wenn das N sehr groß ist. Für kleine "N", können Sie sagen, ob es eine Brownsche Bewegung ist – unsym

1

Ihre Frage ist schrecklich schlecht gestellt. Dies ist mit ziemlicher Sicherheit nicht Ihre Schuld, da Ihr Kursleiter Sie darauf hingewiesen haben sollte, dass eine korrekte Implementierung von Brown'schen Bewegungen viele ziemlich anspruchsvolle Spezifikationen und Analysen der Problemdomäne erfordert, noch bevor Sie mit dem Codieren beginnen.

Die genaue Definition der Brownschen Bewegung wird wahrscheinlich für Sie undurchsichtig sein, es sei denn, Sie haben die relevanten Kurse in Maßtheorie genommen.Es gibt jedoch viele Ressourcen im Netz, die adäquate Beschreibungen von Ito-Prozessen liefern (von denen Brownian-Bewegung ein Beispiel ist).

Wenn Sie daran interessiert sind, einen solchen Prozess zu programmieren, hier ein guter Tipp. Irgendwann wirst du Zufallszahlen generieren müssen. Mit ziemlicher Sicherheit werden Sie daran interessiert sein, Auslosungen aus einer normalen Verteilung zu generieren. Zum Glück gibt es einige gute Möglichkeiten, dies einem C++ - Programmierer zur Verfügung zu stellen. Am liebsten verwende ich die Boost.Random-Bibliothek (oder die relevanten Bibliotheken in C++ 11). Die klügste Strategie ist ein Funktionsobjekt zu verwenden, um die Zufallszahl zu erzeugen, die wahrscheinlich durch eine variate_generator mit:

#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; 
} 

Sobald Du einen Griff bekommen, was eine Brownsche Bewegung ist, sollte es dann trivial sein, einige Beispiele zu konstruieren, mit die Funktionalität in Boost.Random.

+0

Wahrscheinlich besser für das Beispiel, um die Standardbibliothek zu verwenden, anstatt zu boosten. – bames53