Summenzeichen

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
mifo
User
Beiträge: 5
Registriert: Samstag 11. September 2010, 18:13

Hallo liebe Python-Gemeinde,

ich habe vor einiger Zeit mit Python angefangen und bin nun dabei
Pi mit den Gauß-Algorithmus zu berechnen. Das ganze scheitert leider
daran, dass ich nicht weiß wie ich in Python Summenzeichen benutze.
Ich hoffe, dass ich nichts offensichtliches übersehe und euch mit so etwas
nerve.

Vielen Dank im vorraus,

mifo
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Gar nicht. Du musst das Summenzeichen "ausrollen":
Σ_{i=0}^{20} wird zu

Code: Alles auswählen

sum(range(21))
mifo
User
Beiträge: 5
Registriert: Samstag 11. September 2010, 18:13

Vielen Dank. Könntest du mir den Aufbau bitte noch etwas genauer
erklären?

Code: Alles auswählen

sum(range(21))
Wie kommst du in dem Fall auf die 21?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

In der Summenzeichennotation sind sowohl das untere, als auch das obere Ende inklusive, bei `range` nur das untere (in dem Fall die implizite 0) das obere Ende ist exklusiv, d.h. du musst 1 hinzuzaehlen.

Direkt ein Tipp: Wenn dir etwas unklar ist, probier es doch selbst im Interpreter!
mifo
User
Beiträge: 5
Registriert: Samstag 11. September 2010, 18:13

Hey,

tut mir Leid, dass ich mich so blöd anstelle aber ich steige da immer
noch nicht durch. Ich zeige dir mal meinen bisherigen Code, vielleicht
kannst du mir das anhand dieses Beispiels besser erläutern.

Code: Alles auswählen

# Programm zur Berechnung von Pi durch
# den Gauß'schen Algorithmus
import math

n = input()
nintegerwurzel = int(math.sqrt(n))
halbnint = int(math.sqrt(n/2))

Algorithmus = 1 + 4 * nintegerwurzel + 4 * halbnint ** 2 + 8 * Summe von halbnint + 1 bis nintegerwurzel über Integer-Wurzel  aus N - halbnint + 1 ** 2 

Vielen Dank,


mifo
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

mifo hat geschrieben:ich habe vor einiger Zeit mit Python angefangen und bin nun dabei
Pi mit den Gauß-Algorithmus zu berechnen. Das ganze scheitert leider
daran, dass ich nicht weiß wie ich in Python Summenzeichen benutze.
Du musst die einzelnen Summanden einzeln ausrechnen und addieren, beispielsweise mit einer for-Schleife.

z.B. \sum_{i=1}^{20} \frac{1}{n^2} wird zu

Code: Alles auswählen

from __future__ import division # nötig, da sonst Integer-Division bei ganzen Zahlen, schreibs einfach unreflektiert in jede Datei rein wenn du was ausrechnen willst und Python 2.x verwendest

summe = 0
for i in range(1, 20 + 1): # iteriert über die ganzen Zahlen von 1 bis 20
    summe += 1/i**2
print summe
PS: Ich kenne die Formel die du verwendest nichst und ich steige auch nicht durch deine Nomenklatur durch, aber bist du dir sicher, dass du die abgerundeten ganzzahligen Werte benötigst?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Ich kenne diese "Formel von Gauß" auch nicht, aber habe erhebliche Zweifel daran, dass das in der gezeigten Form richtig ist. Am einfachsten wird es sein, wenn du mal die Quelle nennst oder die Originalformel postest.
Im übrigen findest du hier im Forum mehrere Threads, die sich mit der Berechnung von pi beschäftigen. Das Problem scheint jedoch zu sein, dass man diese Beiträge über die Suchfunktion schwer finden kann, weil Wörter, die aus weniger als 3 Buchstaben bestehen, bei der Suche ignoriert werden ...
mifo
User
Beiträge: 5
Registriert: Samstag 11. September 2010, 18:13

Guten Morgen,

Ich habe die Formel von einem Mathe-Arbeitsblatt. Ich hab das ganze mal
fotografiert und die entsprechenden Formeln makiert.

http://www.abload.de/image.php?img=dsc064001ve7.jpg


Viele Grüße


mifo
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Code: Alles auswählen

def gauss_pi(n):
    b, a = int(n**.5), int((.5*n)**.5)
    return (1+4*b+4*a*a+8*sum(int((n-i*i)**.5) for i in xrange(a+1,b+1)))/float(n)

print gauss_pi(10**12)
Liefert:

Code: Alles auswählen

3.14159264963
Ob der Einsatz von sum() hier eine gute Wahl ist, darüber mag man streiten. Ich würde wohl eher mit einer expliziten Schleife arbeiten. Das kannst du ja als Übung mal machen.
mifo
User
Beiträge: 5
Registriert: Samstag 11. September 2010, 18:13

Hey,

vielen Dank an euch alle ;) Den Code von dir, numerix, finde ich
super, da er wie ich finde sehr elegant ist. Ich werde mich demnächst
nochmal an eine Version mit einer Schleife setzen und diese bei den Code-Schnipseln
hochladen.

Schönen Tag euch alle,


mifo
Antworten