Annäherungsweise Pi

fvaltrock

Neues Mitglied
Ich soll eine Funktion:
public static double getPi(int n)
schreiben welche mithilfe der Formel: 𝜋 = 4 ⋅ (1 − 1/3+ 1/5 − 1/7 + 1/9 − … ) annäherungsweise berechnet werden kann.
Also verstehe ich das so, dass für den Wert n so und so viele Schritte näherungsweise mithilfe der Formel berechnet werden sollen.

Das hier ist bisher mein Code:

int x = 3;
double m = 0; //double nur testweise um etwas zurückzugeben. Am ende soll n zurückgegeben werden.
for (x=0; x<100; x++) {
if (x%2 == 0) {
m = 3 + x;
}
}
return m;

Damit schaffe ich es, dass mir die Zähler schon in der Reihenfolge ausgegeben werden. Mein Problem besteht nun darin gezielt die Vorzeichen an dem in der Formel zu erkennenden Schema umzukehren. Hatte erst überlegt die Negativen zu nehmen und immer mit +4er Sprüngen die Werte zu erreichen um sie dann mit -2 zu multiplizieren und die Positiven in einer separaten Schleife zu erstellen aber ich denke dass das Unfug ist. Zumal ich die Werte dann ja noch sinnvoll in die Formel stecken muss.


Vielen Dank im voraus für die Hilfe.
 

KonradN

Super-Moderator
Mitarbeiter
Der Ansatz ist doch immer der gleiche:
Überlege Dir doch erst einmal mit Stift und Zettel wie DU es machen würdest.

Und machst Du da dann so einen "Quatsch"? (Bitte nicht böse sein - da geht es nur um den etwas zu komplizierten Ansatz und in keiner Weise um Dich als Person!)

Und da ist dann doch etwas mit 1/1 - 1/3 + 1/5 - 1/7 + .....
Wie kommst Du da zu dem nächsten Element? Also erst einmal zu dem 1/9, 1/11, 1/13, ....
Und wie kommst zu zu dem Operator, also dem + oder -?

Das ist doch eigentlich ganz einfach - das wirst Du doch dann auch einfach beschreiben können, oder?

Und dann willst Du das angenäherte Ergebnis ja berechnen. Wenn Du weisst, dass es x Schritte sein sollen, dann kann man das mit dem *4 am Ende machen ... Ansonsten kannst Du das auch ausklammern: 4 * (a+b+c+d) = 4a + 4b + 4c +4d
Das wäre wichtig, wenn Du solange rechnen willst, bis die Abweichung kleiner ist als ein gegebener Wert Epsilon (z.B.)

Willst Du das einmal in Worten beschreiben?
 

fvaltrock

Neues Mitglied
Hey KonradN,

danke für deine Antwort! Ich selber bin gerade erst in meiner 2ten Woche Java Blockkurs demnach Scheiter ich noch oftmals an scheinbar simplen dingen.

Wie kommst Du da zu dem nächsten Element? Also erst einmal zu dem 1/9, 1/11, 1/13, ....

-Die generiere ich ja in der For-Schleife. Die 1/1 schreibt man noch in die Formel und ab 1/3 gibt mir die Schleife die Sprünge bis zu meinem gewünschten x. Hatte mir vorgestellt mit den in der for-Schleife generierten Zahlen dann zu rechnen. Der Formel entsprechend wollte ich dann die Operatoren abwechselnd vertauschen da ich ja noch nicht weiß für wie viele weitere x ich annäherungsweise rechnen will.

Und dann willst Du das angenäherte Ergebnis ja berechnen. Wenn Du weisst, dass es x Schritte sein sollen, dann kann man das mit dem *4 am Ende machen ... Ansonsten kannst Du das auch ausklammern

-Ob ich die *4 vor oder hinter der Klammer stehen habe macht ja keinen Unterschied falls ich dich jetzt richtig verstanden habe. Die Formel zur Annäherung habe ich noch nicht gemacht da ich ja schon an der for-Schleife gescheitert bin.

Grüße
Frederic
 

KonradN

Super-Moderator
Mitarbeiter
Hast Du es denn mal durchgespielt? Einfach mit Stift und Zettel?

Man fängt also bei 4* 1/1 an - und erhält somit pi := 4
Dann kommt - 4 * 1/3 - also hat man pi = 4 - 4/3 = 2,666666666
Dann kommt + 4 * 1/5 - also hat man pi = 2,6666666666 + 4/5 = 3,46666666666666
u.s.w.

Und dabei überlegen: Was habe ich denn genau gemacht? Was ist von Schritt zu Schritt meine Aktion?

Worauf ich hinaus wollte ist eine Beschreibung wie:
Wie kommst Du da zu dem nächsten Element? Also erst einmal zu dem 1/9, 1/11, 1/13, ....
Ich starte bei 1 und addiere von Iteration zu Iteration jeweils 2. Dann kann ich rechnen 1/Wert (Oder 4/Wert, wenn man das ausgeklammert hat).

Und wie kommst zu zu dem Operator, also dem + oder -?
Man startet bei + und wechselt das Vorzeichen von Iteration zu Iteration.
Mathematisch ist dann evtl. noch als Option wichtig: -x = -1 * x sowie x = 1 * x - der Wechsel wäre also immer ein Wechsel eines Faktors von 1 zu -1 und zurück.

Was jetzt von mir unterschlagen wurde ist natürlich die Berechnung von pi. Das ist aber oben bei dem aktiv durchspielen dann einfach: Das wäre dann noch eine Aussage wie:
berechnetesPi := berechnetesPi + Iterationswert.

Das kann man also dann in eine Schleife bauen und die Beschreibung wäre etwas:

divisor := 1
pi := 0
faktor := 1
So lange man pi noch weiter berechnen will:
  • iterationswert = faktor * 4 / divisor
  • pi := pi + iterationswert
  • divisor := divisor +2
  • faktor := -faktor

Das "So lange man pi noch weiter berechnen will" kann man dann noch spezifizieren. Das war jetzt nicht bestimmt meine ich. Das kann ein Zähler sein (a.la. "gehe die Iteration 10 Mal durch") oder das ist einfach eine Frage der Genauigkeit ("Mache das so lange, bis die Abweichung zwischen zwei Iterationen < 0,00001 ist")

Mir ist ein Punkt wichtig:
Das ist ein Standard Vorgehen. Das gibt es wirklich immer! Der erste Schritt ist immer ein genaues Verständnis der sogenannten Problemdomäne. Ich muss als Entwickler erst verstehen, was ich denn da abbilden soll. Das muss ich so gut verstanden haben, dass ich es selbst durchspielen kann. (Wenn ich das nicht kann, dann kann ich auch nicht testen. Wie soll ich einen Fehler finden, wenn ich nicht weiss, wo was in welcher Variablen zu erwarten ist?)

Erst, wenn ich selbst im Detail verstanden habe, was zu tun ist, dann kann ich anfangen Code zu schreiben.
 

Oben