1

Hey, ich soll in Python ein Programm schreiben welches die positive Nullstelle von cos(x) im Intervall [0,2] annähert. Diese ist ja bekanntlich Pi/2. Bei dem Programm das ich geschrieben habe, bleibt die Zahl jedoch irgendwann gleich und nähert sich der gesuchten Zahl nicht weiter an. Ich soll die Zahl auf eine Genauigkeit von 50 Nachkommastellen annähern und dann am Ende noch als Dezimalbruch angeben.

Hoffe jemand von euch kann mir weiterhelfen.

Mein Programm:

from fractions import Fraction import math import decimal

decimal.getcontext().prec=50

def annäherung_Nullstelle_cos():

a_n = math.pi

b_n = 0


for i in range(0,60):

    c = (decimal.Decimal(a_n) + decimal.Decimal(b_n))/decimal.Decimal(2.0)
    print(i, a_n, b_n, c, math.cos(c))
    print()


    if (math.cos(c)) < 0:

        a_n = c

    elif (math.cos(c)) > 0:

        b_n = c
print(Fraction.from_decimal(decimal.Decimal(a_n)))

Das Hauptproblem ist eigentlich folgendes:

Zahl die vom Programm ausgegeben wird:

1.5707963267948966724446668251803223211684205202832

Zahl die gesucht wird:

1.5707963267948965579989817342720925807952880859375

Diese Frage melden
gefragt

Punkte: 17

 
Kommentar schreiben
1 Antwort
2

Wenn du nur 61 Durchläufe machst (for i in range(0,60)), dann kann das Programm eben nur 60 BINÄRE Nachkommestellen herausfinden. Es benötigt mehr als 3 binäre Nachkommastellen, um eine Dezimale Nachkommastelle herauszufinden, denn log(10)/log(2) = 3.321928...

Hier ein paar Lösungsvorschläge:

  1. Du Lässt nicht von 0 bis 60 laufen, sondern formal korrekt von 1 bis ceil(50 * log(10) / log(2)), denn du willst 50 Stellen in Dezimal.
  2. Du verwendest keine normale binäre Suche, die den Suchraum pro Schritt nur halbiert, sondern zehntelt. Dann erhälst du pro Iteration auch eine dezimale Stelle hinzu und keine binäre.
  3. Du definierst nicht eine konstante Anzahl von Schleifendurchläufen (wie 60), sondern du lässt solange laufen, bis sich die Zahl nicht mehr ändert. Dabei musst du natürlich ein Dateiformat nehmen, dass Dezimal mindestens 50 Nachkommastellen ausdrücken kann aber nicht unendlich.

Schau mal wie viele Stellen bei deiner Lösung korrekt waren. Es sind 16 Nachkommestallen. Da du zusätzlich angefangen hast zwischen 0 und pi (also 2 Vorkommastellen mussten auch korrekt approximiert werden), hast du 18 Stellen korrekt berechnet.

Wie viele Stellen hätte dein Algorithmus korrekt berechnen müssen? 61*log(2)/log(10) = 18.3628297355 ...

Liebe Grüße

cunni

Diese Antwort melden
geantwortet

Punkte: 35

 

Kommentar schreiben