poissonv. in warteschlangensys < Stochastik < Oberstufe < Schule < Mathe < Vorhilfe
|
hallo!
ich muss für die schule ein stabiles warteschlangensystem am computer simulieren (sprich das ganze in c# programmieren)
in einem stabilen warteschlangensystem sind die zeiten zwischen zwei ereignissen (z.b. ein kunde kommt an) poissonverteilt.
nimmt man einen mittelwert von 5min zwischen zwei ereignissen an, dann soll dieser wert poissonverteilt werden und sich bei nur lang genug ausgeführter simulation an 5 annähern.
mein problem ist:
die poisonverteilung liefert nur die wahrscheinlichkeit für das eintreten von x ereignissen in einem bestimmten zeitraum. (z.b. bei P(5, my=5) = 0,17)
wie kann ich aus diesen wahrscheinlichkeiten auf eine variation des mittelwertes schließen? ich brauche eine funktion, die diesen mittelwert nach poisson streut (also manchmal soll zwischen zwei kunden 2min, manchmal 9min, usw. vergehen, insgesamt soll sich der mittelwert 5 annähern).
auch meine mathelehrer und der lehrer der mir die aufgabenstellung gegeben hat, wissen nicht, wie dieses problem gelöst werden kann.
bitte um hilfe. danke.
alex
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 23:00 Do 26.05.2005 | Autor: | Stefan |
Hallo!
Verstehe ich dein Problem richtig, dass du poissonverteilte Pseudozufallszahlen simulieren möchtest?
Das kannst du am einfachsten so machen:
Berechne zu deinem Parameter [mm] $\mu=5$ [/mm] die Verteilungsfunktion $F(x)$ für [mm] $x=0,1,\ldots,N$, [/mm] wobei $N$ eine willkürliche Abbruchgröße ist (wähle $N$ aber hinreichend groß!). Erzeuge dir nun gleichverteilte Pseudozufallszahlen aus $[0,1)$ (die findest du in jedem Programm, meistens durch einen Befehl der Form $rnd()$ oder so ähnlich).
Jetzt ziehst du eine Pseudozufallszahl $z [mm] \in [/mm] [0,1)$. Dann gibt es ein $x [mm] \in 0,1,\ldots,N$ [/mm] mit
$F(x) [mm] \le [/mm] z < F(x+1)$.
(Im Falle $z>F(N)$ setzt du: $z=N$.)
Dann ist $x$ die gesuchte Pseudozufallszahl.
Viele Grüße
Stefan
|
|
|
|
|
hallo
danke für deinen vorschlag. ich habe ihn heute ausprogrammiert aber es gibt noch einige probleme.
der quellcode (ich weiß nicht, ob du ihn lesen kannst) sieht so aus und gleicht im prinzip deinem algorithmus.
public double distribPoisson(double my)
{
const int N = 1000;
double[] p1 = new double[N];
for(int x=0;x<N;x++)
{
p1[x] = Poisson(my,x);
}
Random r = new Random();
double z = r.NextDouble();
for(int x=0;x<N-1;x++)
{
if(p1[x] < z && z < p1[x+1])
return(x);
if(z>p1[N-1])
z = N;
}
return -1;
}
als ausgabe bei einem mittelwert von my = 20 und 100 wiederholten versuchen, bekomme ich folgendes ergebnis:
x =
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
9
9
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
12
12
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
14
14
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
236
15
15
236
236
236
236
236
236
das ist doch etwas sonderbar.
1. weil du schreibst x ist die gesuchte zufallszahl (x iteriert doch nur über die kurve -> es ist immer eine ganzzahl was für zufallszahlen komisch ist)?
2. wenn ich statt x F(x) nehme, kommt immer der selbe wert (1,81031887155028E-161), egal wieviele versuche ich mit gleichem my mache.
3. kommt sehr oft die selbe zahl und das ist leider unrealistisch...
vielleicht könntest du mir nochmal helfen.
danke
alex
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 14:05 Fr 27.05.2005 | Autor: | Stefan |
Hallo!
Also, das Verfahren ist auf jeden Fall richtig; es hat bei mir auch schon so funktioniert.
Die Tatsache, dass ganze Zahlen rauskommen, ist ja klar, da eine poissonverteilte Zufallvariable nun mal nur ganzzahlige Werte annimmt.
Warum man dir so seltsame Werte auftreten, weiß ich nicht, das muss am Programm liegen. Leider kenne ich mich aber mit C nicht so gut aus.
Kannst du mir mal den Sinn dieser zwei Zeilen erklären:
Random r = new Random();
double z = r.NextDouble(); ?
Was macht das "Random" da vor dem r? Und was soll die zweite Zeile?
Sorry, wenn meine Fragen naiv sind, aber wir müssen den Fehler ja schließlich finden.
Und bist du sicher, dass Poisson(my,x) den Wert der Verteilungsfunktion ausspruckt?
Viele Grüße
Stefan
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 14:40 Fr 27.05.2005 | Autor: | Stefan |
Hallo!
Ich habe dir hier mal einen Teil der C++-library rauskopiert, wo auch poisson-verteilte Zufallsvariable generiert werden. Ich sehe zwar gerade nicht, wo da der Unterschied zu meinem Vorgehen besteht
(es wird nur eleganter die Verteilungsfunktionsfunktion "in vitro" erzeugt, gemäß schematisch
[mm] $F(0)=e^{-\mu}$
[/mm]
$k(0)=1$
Für [mm] $i=0,1,\ldots$:
[/mm]
$k(i+1)=k(i) [mm] \cdot \frac{\mu}{i+1}$
[/mm]
$F(i+1)=F(i) + k(i+1)$
oder so ähnlich... ),
aber vielleicht kannst du es dir ja mal anschauen:
#include <stdlib.h>
#include <math.h>
#define RAND_UNIFORME (double)random()/(double)RAND_MAX
[...]
unsigned long random_poisson(double landa)
{
double p=exp(-landa);
double g=p;
double u=RAND_UNIFORME;
unsigned long k=0;
while (u>g)
{
p*=(landa/(double)(++k));
g+=p;
};
return k;
};
[...]
viele Grüße
Stefan
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 14:51 Fr 27.05.2005 | Autor: | Stefan |
Hallo!
> Random r = new Random();
Schreibe hier mal statt: Random() hin: "Random()/RAND_MAX" (in der richtigen Syntax, also mit double oder was da sonst noch hinkommt).
Es kann sein, dass die Zufallszahlen nicht aus $[0,1)$ sind, jedenfalls wird das in dem anderen Programm auch erst gemacht, um uniform verteilte Zufallszahlen aus $[0,1)$ zu finden.
Und, war es das?
Viele Grüße
Stefan
|
|
|
|
|
hallo.
der folgende quellcode scheint zu funktionieren (= dein c++ code auf c# adaptiert):
public double PoissonDistrib(double my)
{
double p=Math.Pow(Math.E,-my);
double g=p;
double u=r.NextDouble();
double k=0;
while (u>g)
{
p*=my/++k;
g+=p;
}
return k;
}
arith. mittel aus 2000000 poissonverteilten zahlen entspricht ziemlich genau dem angegebenen mittelwert my.
die initialisierung mit RAND_MAX ist nur in c/c++ nötig. in den neueren sprachen braucht man das scheinbar nicht mehr.
danke vielmals für deine hilfe! ich war echt schon am verzweifeln, weil mir keiner meiner lehrer helfen konnte.
grüße, alex
|
|
|
|
|
naja, ein problem war, das N (in deinem algorithmus) nur maximal 236 sein konnte, weil sonst die wahrscheinlichkeit in der poisson-wahrscheinlichkeitsvert. so klein wird (10^-160), dass sie nicht mehr berechenbar ist.
nachdem der jetzige algorithmus komplett auf die eigentliche poissonformel verzichtet, erübrigt sich dieser fehler.
nachdem das verfahren, wie du sagst, funktioniert, weiß ich sonst nicht, woran es gelegenhat...
ob es wirklich perfekt funktioniert, werden wir in ein paar stunden bis tagen sehen, weil ich es jetzt in mei simulationsprogramm einbauen muss. wenn sich dann die simulationen mit den berechnungen (little-formeln) decken (einigermaßen) dann würde ich sagen, es passt. ;)
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:15 Fr 27.05.2005 | Autor: | Stefan |
Hallo!
Ja, aber daran kann es nicht gelegen haben, weil so große Werte bei [mm] $\mu=20$ [/mm] eh nicht häufig vorkommen dürften. Könntest du trotzdem mal $N=200$ setzen oder so, und es nochmal versuchen?
Es wäre mir echt eine große Hilfe, wenn du den Fehler finden würdest.
Vielen Dank!
Viele Grüße
Stefan
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:24 Fr 27.05.2005 | Autor: | Stefan |
Hallo!
Okay, jetzt glaube ich es zu wissen. Wenn ich der Online-Hilfe von C++ glauben darf, dann ist Poisson() gar nicht die Verteilungsfunktion der Poissonverteilung (etwas Ähnliches hatte ich ja auch schon vermutet), sondern einfach der Wert der Poissonverteilung an dieser Stelle.
Na, dann war meine Idee doch richtig und du hast die falsche Funktion benutzt.
Da bin ich jetzt aber beruhigt...
Viele Grüße
Stefan
|
|
|
|
|
hm, was ist eigentlich der unterschied zw. der "normalen" poisson-funktion, der verteilungsfunktion, und dichtefunktion und was es da sonst noch alles gibt? ich war bis jetzt der meinung, das ist alles eine bezeichnung für ein und das selbe...
alex
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 18:27 Fr 27.05.2005 | Autor: | Stefan |
Hallo Alex!
Es gibt für die Poissonverteilung einmal die Wahrscheinlichkeitsfunktion
$f(k) = P(X=k)$ für [mm] $k=0,1,2,\ldots$
[/mm]
(die hast du (leider) mit Poisson() benutzt)
und dann die Verteilungsfunktion
$F(k) = P(X [mm] \le [/mm] k) = [mm] \sum\limits_{i=0}^k [/mm] f(i)$ für [mm] $k=0,1,2,\ldots$
[/mm]
(die hättest du benutzen sollen).
Es wäre jetzt kein Problem das alte Programm so umzuschreiben, das es läuft. Aber da das neue es ja tut, scheint das für dich nicht nötig. Für mich ist es aber wichtig, weil meine Schüler (ab der 9. Klasse) die Poissonverteilung nicht kennen und ich deshalb auf die Verteilungsfunktion als "Black Box" zurückgreifen muss (und es daher so programmieren lassen werde wie in meinem Vorschlag, allerdings mit der Verteilungsfunktion).
Viele Grüße
Stefan
|
|
|
|