Pi auf gewisse Stellengrösse berechnen

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
Furgy
User
Beiträge: 5
Registriert: Donnerstag 3. September 2009, 19:06

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

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
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das ist übrigens eher eine "Allgemeine Frage". ;)

Edit (Leonidas): Ack, verschoben.
Antworten