Seite 1 von 1

Pi auf gewisse Stellengrösse berechnen

Verfasst: Dienstag 6. Oktober 2009, 22:07
von Furgy
Hallo,

Ich bin gerade dabei, ein einfaches Programm zu schreiben, welches Pi auf einen gewisse Anzahl Nachkommastellen berechnet. Allerdings klappt das ganze nicht so ganz, wie ich möchte:
Wenn man Pi auf 10 Stellen berechnen lässt, kommt -0.106148364023 raus, anstatt 3.1415926535...

Das ganze wurde mit dem Gauss-Legendre-Algorithmus gelöst.

Hier ist der Quellcode:

Code: Alles auswählen

import math

an = 1
bn = 1 / math.sqrt(2)
tn = 1 / 4
pn = 1

bn = int(input("Auf wieviele Stellen soll Pi berechnet werden? "))

for x in range(an, bn, 1):
	an = an + 1
	an = (an + bn) / 2
	bn = bn + 1
	bn = math.sqrt(an * bn)
	tn = tn + 1
	tn = tn - pn * math.pow((an - (an + 1)), 2)
	pn = pn + 1
	pn = 2 * pn

pi = (math.pow((an + bn), 2)) / (4 * tn)

print(pi)
Ich hoffe ihr könnt mir helfen - ich finde den Fehler einfach nicht...

Danke im voraus.

Re: Pi auf gewisse Stellengrösse berechnen

Verfasst: Dienstag 6. Oktober 2009, 22:37
von numerix
Furgy hat geschrieben:Ich hoffe ihr könnt mir helfen - ich finde den Fehler einfach nicht...
Da gibt es nicht DEN Fehler, dein Code ist total kaputt!
Du hast den Algorithmus von Gauß-Legendre bzw. die Indexschreibweise nicht verstanden und dadurch völlig falsch implementiert.

Aus dem int(input()) schließe ich mal, dass du Python 3.x verwendest; falls nicht, wäre schon der Startwert für tn falsch.

Wenn du diese Fehler behebst, funktioniert es; mit 3 Iterationen hast du schon die max. Genauigkeit erreicht - mehr geht mit float nicht.

Verfasst: Mittwoch 7. Oktober 2009, 03:47
von str1442
Nicht der obige Algorithmus, aber in einfach und mit schlechter Laufzeit je nach Genauigkeit:

Code: Alles auswählen

>>> def integrate(f, dx=.001):
...     def _integrated(lower, upper):
...         _sum = 0
...         i = lower
...         while i <= upper:
...             _sum += f(i) * dx
...             i += dx
...         return _sum
...     return _integrated
... 
>>> 2 * integrate(lambda x: (1 - x ** 2) ** 0.5)(-1, 1)
3.1415554669110248
>>> 2 * integrate(lambda x: (1 - x ** 2) ** 0.5, h=.00001)(-1, 1)
3.1415926164614789

Verfasst: Mittwoch 7. Oktober 2009, 04:19
von snafu
Das ist übrigens eher eine "Allgemeine Frage". ;)

Edit (Leonidas): Ack, verschoben.