Zeichnen der Poly.Vert. - Seite 2

Neue Frage »

Huggy Auf diesen Beitrag antworten »
RE: Zeichnen der Poly.Vert.
Du solltest die benötigte Zeit mal als Funktion der Zahl der Durchläufe plotten. Mit größer werdender Zahl der Durchläufe sollte die Zeit schnell ansteigen.
Lauraundlisa1 Auf diesen Beitrag antworten »
RE: Zeichnen der Poly.Vert.
hm okay. Was ist genau mit den Durchläufen gemeint ? Könntest du mir dazu ein Bsp mal geben bitte?
Tim[z_]= Timing[schleife[3,2,2,3]] so oder wie ?
Huggy Auf diesen Beitrag antworten »
RE: Zeichnen der Poly.Vert.
Sei
code:
1:
f[n_,n0_,n1_,n2_]
der reine Polynomialtest ohne jeden Schnickschnack, der die Summe aller Wahrscheinlichkeiten liefert, die kleiner oder gleich der Wahrscheinlichkeit

code:
1:
polyn[n,n0,n1,n2]
sind. Dabei wird gesetzt, damit die Summe der Ergebnisse ergibt. Was du für nimmst, ist ziemlich egal, da für den Test alle Kombinationen, deren Summe ergibt, berechnet werden müssen.

Jetzt kannst du zunächst mal probieren, was z. B.
code:
1:
Timing[f[n,n0,n1,n2]]
für bei festem ergibt, um ein Gefühl zu bekommen, wie die benötigte Zeit von abhängt. Anschließend kannst du für eine vernünftigen Bereich von dann eine Tabelle
code:
1:
Zeit[n]
erstellen und plotten. In deinen bisherigen Beispielen war immer die Zahl der Rouletterunden.
Lauraundlisa1 Auf diesen Beitrag antworten »
RE: Zeichnen der Poly.Vert.
Ich habe das jetzt gemacht. Das dauert ja wirklich sehr lange..

Ich kriege diesen Graphen raus. Bei n=50 sind es schon 12 sekunden..

ist das so in Ordnung?
Huggy Auf diesen Beitrag antworten »
RE: Zeichnen der Poly.Vert.
Das sieht für mich vernünftig aus, auch wenn ich es nicht mit einem eigenen Programm nachvollzogen habe. Für zeitintensive Aufgaben ist Mathematica natürlich nicht besonders geeignet. Da sollte man besser zu C++ oder so etwas greifen. Auch Mathematica kann man mit Compiled und Parallelize natürlich schneller machen. Aber darum geht es ja hier nicht. Der prinzipiell schnelle Anstieg der Laufzeit bleibt unverändert und der soll demonstriert werden.
Lauraundlisa1 Auf diesen Beitrag antworten »
RE: Zeichnen der Poly.Vert.
Hallo Huggy,

ich habe ein Problem und ich hoffe du kannst mir da helfen.
Ich habe nun die Analyse für die Rechenzeit programmiert.
Ich wollte nun für die Lösung mit "Compositions" auch eine Analyse der Rechenzeit durchführen.
Die Lösung mit Compositions sieht wie folgt aus:


code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
poly[x_] := PDF[MultinomialDistribution[n, {p1, p2, p3, p4}], x] // N;
Needs["Combinatorica`"]
b = Compositions[n, 4];
li1 = MapThread[Append, {b, poly[b]} ];
li2 = SortBy[li1, Last];
c = Length[li2]
sum := 0; kum = Table[ sum = sum + li2[[i, 5]], {i, 1, c}];
li3 = MapThread[Append, {li2, kum}];
g = 0;
PolynomialTest[{w_, x_, y_, z_}] := (Do[
   If[ li3[[i, 5]] == poly[{w, x, y, z}]  , 
    g = li3[[i, 1 ;; 6]] ], {i, 1, c}] ;   {w, x, y, z, 
   poly[{w, x, y, z}], g[[6]]})




Wie kann ich für diese Lösung nach der Rechenzeit überprüfen ? Ich habe schon mehrere Stunden rumprobiert allerdings muss man das n immer seperat ändern. Wie könnte hier der code aussehen vllt eine Idee ?
 
 
Huggy Auf diesen Beitrag antworten »
RE: Zeichnen der Poly.Vert.
Für den Polynomialtest und dessen Zeitanalyse sind kein Filterungen, Sortierungen oder sonstige Aktionen in b erforderlich. Es wird für den Vergleich einfach die gesamte Liste durchlaufen. Viele Wege führen nach Rom. Ein Vorschlag:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Needs["MultivariateStatistics`"];
Needs["Combinatorica`"];
p0 = 1./37; p1 = p2 = p3 = 12./37;
poly[n_, x_] := PDF[MultinomialDistribution[n, {p0, p1, p2, p3}], x];
t[n_] := poly[n, {3, 2, 2, n - 7}];
polytest[n_] := (tt = t[n]; sum = 0; b = Compositions[n, 4];
   Do[pp = poly[n, b[[i]]]; 
    If[pp <= tt, sum = sum + pp], {i, 1, Length[b]}];
   sum);
Zeit[n_] := Timing[polytest[n]][[1]];
Man kann natürlich die Vergleichskombination für den Test noch variabel gestalten. Die ist aber für die Zeitanalyse unerheblich, da sie nur einmal berechnet wird.
Lauraundlisa1 Auf diesen Beitrag antworten »
RE: Zeichnen der Poly.Vert.
Erstmal vielen dank für den Code.
Die Lösung ist von mir Praktisch. Ich lasse die Liste sortieren nach dem Wert p um danach die Kumulierten Werte zu hinzufügen. Dann kann man im
polynomialtest einfach nur überprüfen wann in der liste der p Wert auftaucht und diese dann in eine Variable speichern.

Hättest du eine Idee wie man das mit meinem
code machen könnte?
Huggy Auf diesen Beitrag antworten »
RE: Zeichnen der Poly.Vert.
Mir ist nicht klar, weshalb dein Verfahren besonders praktisch sein soll. Aber das macht nichts, er soll ja dir gefallen und nicht mir.

Wenn du die Zahl der Durchläufe als Variable benutzt, wie ich es gemacht habe, solltest du bei deinem Code ganz ähnlich wie ich bei meinem Code eine Funktion Zeit[n_] definieren können.
Lauraundlisa1 Auf diesen Beitrag antworten »
RE: Zeichnen der Poly.Vert.
Das habe ich auch gestern versucht es klappt einfach nicht unglücklich


code:
1:
2:
3:
4:
5:
6:
 Needs["Combinatorica`"]; 
p0 = 1./37; p1 = p2 = p3 = 12./37; 
poly[n_, x_] := PDF[MultinomialDistribution[n, {p0, p1, p2, p3}], x]; 
t[n_] := poly[n, {3, 2, 2, n - 7}];
 polytest[n_] := (tt = t[n]; sum = 0; b = Compositions[n, 4]; li1 = MapThread[Append, {b, poly[n, b]}]; li2 = SortBy[li1, Last]; c = Length[li2] kum = Table[sum = sum + li2[[i, 5]], {i, 1, c}]; li3 = MapThread[Append, {li2, kum}]; g = 0; 
Do[If[li3[[i, 5]] == tt, g = li3[[i, 1 ;; 6]]], {i, 1, c}]; {g[[6]]}) 
Huggy Auf diesen Beitrag antworten »
RE: Zeichnen der Poly.Vert.
Erwarte jetzt bitte nicht, dass ich analysiere, was weshalb bei deinem Code nicht funktioniert. Das musst du schon selber machen. Vom reinen Durchlesen kann ich das nicht erkennen. Als Alternative hast du immer noch meinen Code. Mit dem ergibt sich:


code:
1:
ListLinePlot[Table[{n, Zeit[n]}, {n, 10, 50, 10}]]

[attach]48163[/attach]
Neue Frage »
Antworten »



Verwandte Themen

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