Pi berechnen mit Monte Carlo Methode

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
BlackJack

@Gipsyjack: Lass Dir doch einfach mal `sum` und `maxsteps` ausgeben. Dann sollte klar sein, warum da 4 heraus kommt.

Edit: Falls Du `x` und `x` gleichmässig statt zuvällig über die Fläche verteilen wolltest, dann ginge das zum Beispiel so:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
from math import sqrt
from random import random

max_steps = 1000000
steps_per_dimension = int(sqrt(max_steps))
hits = 0
for i in xrange(steps_per_dimension):
    for j in xrange(steps_per_dimension):
        x = 1.0 / steps_per_dimension * i
        y = 1.0 / steps_per_dimension * j
        if x * x + y * y <= 1:
            hits += 1

estimation = 4.0 * hits / steps_per_dimension**2

print 'Abschaetzung fuer pi nach ', steps_per_dimension**2, 'Schritten:', estimation
Gipsyjack
User
Beiträge: 23
Registriert: Samstag 13. November 2010, 20:19

ich weiß sum ist die anzahl an schritten die gemacht wurden und maxsteps auch als 1/1 =1
range wurde auch verbessert in:

Code: Alles auswählen

for i in range(1000000):
hab das mit der division gemacht also einfach:

Code: Alles auswählen

	x = 0.0+step/maxsteps
aber wie kriege ich es jetzt hin das die Ergebnisse aufsummiert werden?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Gipsyjack hat geschrieben:hab das mit der division gemacht also einfach:

Code: Alles auswählen

	x = 0.0+step/maxsteps
aber wie kriege ich es jetzt hin das die Ergebnisse aufsummiert werden?
Zuerst einmal eine Anmerkung zum vorher gezeigten Code. Du solltest besser keinen Bezeichner mit dem Namen sum verwenden. sum() ist bereits eine eingebaute Funktion und wird damit überschrieben. Verwende doch einfach estimate, schließlich ist das der Bezeichner, dem du hinterher ohnehin dein sum zuweist.

Dein konkretes Problem hier liegt darin, dass du den Tipp mit den testweisen print-Ausgaben nicht beherzigt hast. In dem Fall wäre dir nämlich etwas sehr interessantes aufgefallen. Vielleicht mal als kurzer und knapper Hinweis:

Code: Alles auswählen

print 1/2
Was erwartest du als Ergebnis? Was stellst du fest, wenn du es laufen lässt?
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Damit man nicht immer auf die merkwürdige Division achten muss, empfiehlt sich ein

Code: Alles auswählen

from __future__ import division
am Beginn des Codes.
Gipsyjack
User
Beiträge: 23
Registriert: Samstag 13. November 2010, 20:19

Hallo,

Entschuldigung, dass ich ich mich vorher nicht gemeldet hatte. Hatte ne anstrengede Woche und nicht wirklich Zeit gefunden.
Nochmal danke für die Hilfe an alle!!

wollte nochmal meine Endgültige Lösung posten:

Code: Alles auswählen

#!/usr/bin/python

from random import random
import math

maxsteps=100000
sum=0.0
step=0.0

for i in range(100000):
		x = 0.0+step/maxsteps
		y= math.sqrt(1.0-x*x)

		step= step +1.0

		sum= sum +y

estimate = 4.0*sum/maxsteps

print "Abschaetzung fuer pi nach",maxsteps,"Schritten:", estimate

MfG

und noch ein schönes WE!
Antworten