Erwartungswert Münzwürfe bis Ruin

Neue Frage »

Dopap Auf diesen Beitrag antworten »
Erwartungswert Münzwürfe bis Ruin
ohne viel Geschichten:

1. ein linearer random walk mit p=1/2. Was ist der Erwartungswert an Schritten bis der Abstand n erreicht ist?
----
Sieht simuliert nach aus.
Finn_ Auf diesen Beitrag antworten »

Sei der Random Walk mit

wobei gleichverteilt ist.

Man definiert die Wartezeit für erstmaliges Erreichen von Zustand aus Zustand als


Nun ist eine neue Zufallsgröße mit Zielmenge . Gesucht ist der Erwartungswert bzw. . Mit

reduziert sich das Problem auf die Bestimmung von .

Die Anzahl aller möglichen Pfade mit Anfang und Schritten ist , also endlich, womit lediglich ein kombinatorisches Problem verbleibt. Wir müssen schlicht die Pfade von Schritten mit zählen.

Es bietet sich mal wieder das Zusammenfrickeln eines Python-Programms zur Berechnung der Anzahl an. Geht für kleine Werte von bis ca. 26. Die Wertetabelle hilft eventuell bei der Auffindung einer Formel.
Huggy Auf diesen Beitrag antworten »
RE: Erwartungswert Münzwürfe bis Ruin
Es sei der Erwartungswert der Zahl der Schritte, die es braucht, um aus dem Zustand mit in einen der beiden absorbierenden Zustände zu kommen. Wegen der Symmetrie des Problems kann man annehmen, dass man im ersten Schritt aus dem Zustand in den Zustand i kommt. Dadurch genügt es, die Zustände mit zu betrachten. Es ergibt sich das Gleichungssystem







Das Gleichungssystem hat die Lösung



Das kann man durch Einsetzen der Lösung in das System leicht verifizieren. Es ist also insbesondere

Finn_ Auf diesen Beitrag antworten »

Einseitig scheint die Reihe irgendwie divergent zu sein. Betrachten wir für stattdessen die Wartezeit bezüglich Abstand:



Es folgt die Tabelle .

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
     |  k=1  k=2  k=3  k=4  k=5  k=6  k=7  k=8  k=9 k=10 k=11 k=12 k=13 k=14 k=15
---------------------------------------------------------------------------------
n= 0 |    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
n= 1 |    2    0    0    0    0    0    0    0    0    0    0    0    0    0    0
n= 2 |    0    2    0    4    0    8    0   16    0   32    0   64    0  128    0
n= 3 |    0    0    2    0    6    0   18    0   54    0  162    0  486    0 1458
n= 4 |    0    0    0    2    0    8    0   28    0   96    0  328    0 1120    0
n= 5 |    0    0    0    0    2    0   10    0   40    0  150    0  550    0 2000
n= 6 |    0    0    0    0    0    2    0   12    0   54    0  220    0  858    0
n= 7 |    0    0    0    0    0    0    2    0   14    0   70    0  308    0 1274
n= 8 |    0    0    0    0    0    0    0    2    0   16    0   88    0  416    0
n= 9 |    0    0    0    0    0    0    0    0    2    0   18    0  108    0  546
n=10 |    0    0    0    0    0    0    0    0    0    2    0   20    0  130    0
n=11 |    0    0    0    0    0    0    0    0    0    0    2    0   22    0  154
n=12 |    0    0    0    0    0    0    0    0    0    0    0    2    0   24    0
n=13 |    0    0    0    0    0    0    0    0    0    0    0    0    2    0   26
n=14 |    0    0    0    0    0    0    0    0    0    0    0    0    0    2    0
n=15 |    0    0    0    0    0    0    0    0    0    0    0    0    0    0    2

Das macht







Sieht ganz nach aus. Stellt sich die Frage nach einer geschlossenen Formel für die Tabelle.
Huggy Auf diesen Beitrag antworten »

Zitat:
Original von Finn_
Sieht ganz nach aus.

Was oben auf einfacherem Weg schon bewiesen wurde.
Dopap Auf diesen Beitrag antworten »

also doch.
Den Binomialweg für allgemeines n war keine Option.
Der Gedanke, rekursiv über Erwartungswerte zu gehen war mir schon bekannt.
Hierzu gibt es ja zahlreiche Beispiele.
Nur war und ist mir die rechnerische Durchführung nicht klar, aber ein schönes Ergebnis.
 
 
Finn_ Auf diesen Beitrag antworten »

An der Tabelle ist ersichtlich, dass manchmal



gilt, vermutlich für .
Finn_ Auf diesen Beitrag antworten »

Transformieren wir das Koordinatensystem so, dass es um 45° gedreht ist und die erlaubten Gitterpunkte in liegen.

[attach]51792[/attach]

Betrachten wir nun ein allgemeineres Problem. Ausgehend vom Punkt ist die Anzahl der Pfade nach gesucht, wobei man sich nur auf dem Gitter nach rechts oder nach oben bewegen darf. Die Menge ist beliebig.

Diese Anzahl nennen wir die Pfadzahl . Klar ist bspw.



Die Zahl der Schritte ist ja bei jedem Pfad konstant, und zwar Schritte nach rechts und Schritte nach oben. Das macht insgesamt Schritte. Von dieser Schrittfolge wählt man aus, wo ein Schritt nach rechts kommen soll. Die Reihenfolge ist dabei unbedeutsam, also kommt die Anzahl der Kombinationen ohne Wiederholung bei raus.

Hier ist ein zweites Verfahren zur Berechnung aufgezeigt:
Carly Rozins: The grid path problem.

Demnach gilt die Rekursionsgleichung



Wenn alles klappt, wird das den Rechenaufwand enorm reduzieren.
Finn_ Auf diesen Beitrag antworten »

Die Koordinatentransformation ist



Zur Angabe von benötigen wir außerdem die Umkehrtransformation



Die bisherigen Überlegungen bringen die folgende rekursive Berechnung hervor.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
# Fixpunkt-Kombinator mit Memoisierung,
# für eine Funktion von zwei Argumenten.
def fix2(F):
    memo = {}
    def f(x,y):
        if (x,y) not in memo:
            memo[(x,y)] = F(f,x,y)
        return memo[(x,y)]
    return f

# Allgemeine Pfadzahl-Funktion [M](x,y).
def path_count(M):
    def F(f,x,y):
        if x<0 or y<0 or M(x,y): return 0
        return 1 if x==0 or y==0 else f(x-1,y) + f(x,y-1)
    return fix2(F)

# Spezielle Pfadzahl-Funktion zur vorgelegten Aufgabe.
def count(n,k):
    if (k-n)%2==1 or (k+n)%2==1: return 0
    def M(x,y):
        return x+y<k and abs(y-x)>=n
    return 2*path_count(M)((k-n)//2, (k+n)//2)

# Partialsumme des Erwartungswertes.
def E(n,kmax):
    return sum(k*count(n,k)/2**k for k in range(0,kmax+1))

def print_table(f,rn,rk):
    s = "".join(["{:>5}".format("k="+str(k)) for k in rk])
    print("     | {}".format(s))
    print("-"*(7+5*len(rk)))
    for n in rn:
        a = [f(n,k) for k in rk]
        s = "".join(["{:5}".format(z) for z in a])
        print("n={:2} | {}".format(n,s))

import sys
sys.setrecursionlimit(10**4)

print("Tabelle zu 2^k*P(tau[n] = k)")
print_table(count,range(0,16),range(0,16))

print("\nErwartungswert")
print(" n    E(tau[n])")
print("----------------")
for n in range(0,10):
    print("{:2}  {:12.8f}".format(n,E(n,600)))
Finn_ Auf diesen Beitrag antworten »

Kleine Korrektur: Die Zeile

code:
1:
return 1 if x==0 or y==0 else f(x-1,y) + f(x,y-1)

ist zu ersetzen gegen

code:
1:
return 1 if x==0 and y==0 else f(x-1,y) + f(x,y-1)


Der Fehler ist zwar bei count nicht aufgetreten, würde aber auftreten wenn Punkte der Form oder enthält und die Berechnung per Rekursion auf Punkte dahinter -- d.h. -- zurückgeführt wird.
Finn_ Auf diesen Beitrag antworten »

Für die Pfadzahl will ich ab nun kurz schreiben, mit Punkt und Menge . Komische Notation, aber pragmatisch.

Wie gesagt gilt .

Ist da nun ein Punkt Blockade, dann kann man zunächst alle Pfade von (0,0) bis zählen und davon die Anzahl der Pfade durch abziehen. Die Anzahl der Pfade durch ergibt sich als das Produkt der Anzahl der Pfade von (0,0) bis und der Anzahl der Pfade von bis . Das macht



Gibt es nun noch einen weiteren Punkt, der nicht strikt vor steht, überlegt man sich entsprechend: Anzahl von (0,0) bis minus Anzahl bis minus Anzahl von bis . Nun wurde die Zahl der Pfade durch und doppelt abgezogen, muss also einmal wieder hinzuaddiert werden. Das macht



Sei nun allgemein ein Punkt und eine Menge von übrigen Punkten. Keiner der Punkte in stehe strikt vor . Dafür überlegt man sich:



Mit ist dabei die Menge gemeint.

Weil die Mengen angeordnet sind, müssen sie im Programm als Listen dargestellt werden. Demzufolge ergibt sich das folgende Programm.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
# Binomialkoeffizient
def bc(n,k):
    if k<0 or k>n:
        return 0
    elif k==0 or k==n:
        return 1
    else:
        y = 1; k = min(k,n-k)
        for i in range(0,k):
            y = y*(n-i)//(i+1)
        return y

# Vektorsubtraktion
def sub(a,b):
    return (a[0]-b[0], a[1]-b[1])

# Pfadzahl {}(p)
def paths0(p):
    return bc(p[0]+p[1],p[0])

# Pfadzahl M(p)
def paths(M,p):
    if len(M)==0:
        return paths0(p)
    else:
        a = M[0]; subM1a = [sub(u,a) for u in M[1:]]
        return paths(M[1:],p) - paths0(a)*paths(subM1a,sub(p,a))

Bei der Aufgabe kommt nun die Schwierigkeit hinzu, wie die Punkte der Blockadelinien anzuordnen sind. Bei einer Blockadelinie ist es klar, allerdings gibt es ja noch die zweite unten. Hier kann man im Zickzack gehen, damit jeweils der Rest nicht strikt vor dem Punkt steht.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
def block_list(n,k):
    M = []
    for i in range(n,k,2):
        M.append((i,n))
        M.append((i,-n))
    return [((k-n)//2, (k+n)//2) for (k,n) in M]

def count(n,k):
    if (k-n)%2==1 or (k+n)%2==1: return 0
    M = block_list(n,k)
    return 2*paths(M,((k-n)//2, (k+n)//2))
Finn_ Auf diesen Beitrag antworten »

Mit strikt vor ist die folgende Relation gemeint: Der Punkt liege strikt vor , wenn es einen Pfad gibt, der zuerst durch und dann durch geht.

Ist weder strikt vor noch strikt vor , nennen wir und nicht gemeinsam besuchbar.
Finn_ Auf diesen Beitrag antworten »

Die Komplexität von paths ist vermutlich exponentiell, wogegen auch wieder fix2 anwendbar ist. Allerdings müssen dafür die Listen gegen Tupel ersetzt werden, weil Listen in Python nicht hashbar sind.

Das Programm stellt sich damit nun in der folgenden Modifikation dar:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
def new_paths():
    def F(f,M,p):
        if len(M)==0:
            return paths0(p)
        else:
            a = M[0]; subM1a = tuple(sub(u,a) for u in M[1:])
            return f(M[1:],p) - paths0(a)*f(subM1a,sub(p,a))
    return fix2(F)

paths = new_paths()

def block_list(n,k):
    M = []
    for i in range(n,k,2):
        M.append((i,n))
        M.append((i,-n))
    return tuple(((k-n)//2, (k+n)//2) for (k,n) in M)
Finn_ Auf diesen Beitrag antworten »

Für die Pfadzahl findet sich die Formel



wobei und .

Hierbei ist die Menge der Indexpaarmengen für Besuche in den Punkten. Haben wir bspw. Punkte , dann ist:

B(3,0) = {{(0,4)}}

B(3,1) = {{(0,1), (1,4)}, {(0,2), (2,4)}, {(0,3), (3,4)}}

B(3,2) = {
{(0,1), (1,2), (2,4)},
{(0,1), (1,3), (3,4)},
{(0,2), (2,3), (3,4)},
}

B(3,3) = {{(0,1), (1,2), (2,3), (3,4)}}

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
from itertools import combinations

def prod(iterable):
    p = 1
    for n in iterable:
        p *= n
    return p

def pairs(t,n):
    if len(t)==0: return [(0,n+1)]
    I = [(0,t[0])]
    for i in range(1,len(t)):
        I.append((t[i-1],t[i]))
    I.append((t[len(t)-1],n+1))
    return I

# Liste von Indexpaarlisten für k Besuche von n Punkten
def B(n,k):
    return [pairs(t,n) for t in combinations(range(1,n+1),k)]

# Pfadzahl M(p)
def paths(M,p):
    n = len(M); a = [(0,0)] + M + [p]
    return sum((-1)**k*sum(prod(paths0(sub(a[j],a[i]))
        for (i,j) in I) for I in B(n,k)) for k in range(0,n+1))
Leopold Auf diesen Beitrag antworten »

mathematischer Autismus
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »