Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » Annäherung der positiven Nullstelle von cos(x) im Intervall [0,2] mittels Python » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Annäherung der positiven Nullstelle von cos(x) im Intervall [0,2] mittels Python
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Der Ahnungslose D.
Grünschnabel


Dabei seit: 06.07.2021
Beiträge: 3

Annäherung der positiven Nullstelle von cos(x) im Intervall [0,2] mittels Python Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Meine Frage:
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.



Meine Ideen:
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)))
06.07.2021 10:32 Der Ahnungslose D. ist offline E-Mail an Der Ahnungslose D. senden Beiträge von Der Ahnungslose D. suchen Nehmen Sie Der Ahnungslose D. in Ihre Freundesliste auf
as_string as_string ist männlich
Haudegen


Dabei seit: 06.11.2013
Beiträge: 639
Herkunft: Heidelberg

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ich glaube, ein Python Programm, bei dem die Formatierung verloren gegangen ist, ist ziemlich nutzlos. Probier mal, ob es besser wird, wenn Du den Text zwischen
[code]...[/code]
Tags packst.

Gruß
Marco
06.07.2021 13:46 as_string ist offline E-Mail an as_string senden Beiträge von as_string suchen Nehmen Sie as_string in Ihre Freundesliste auf
Der Ahnungslose D.
Grünschnabel


Dabei seit: 06.07.2021
Beiträge: 3

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hey as_string, hier nochmal das Programm in sauber.

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)))
06.07.2021 14:04 Der Ahnungslose D. ist offline E-Mail an Der Ahnungslose D. senden Beiträge von Der Ahnungslose D. suchen Nehmen Sie Der Ahnungslose D. in Ihre Freundesliste auf
as_string as_string ist männlich
Haudegen


Dabei seit: 06.11.2013
Beiträge: 639
Herkunft: Heidelberg

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hey as_string, hier nochmal das Programm in sauber.
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
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)))


[as_string: ich hab noch die code-Tags außenrum gemacht, damit die Einrückungen auch erhalten bleiben.]
08.07.2021 11:47 as_string ist offline E-Mail an as_string senden Beiträge von as_string suchen Nehmen Sie as_string in Ihre Freundesliste auf
as_string as_string ist männlich
Haudegen


Dabei seit: 06.11.2013
Beiträge: 639
Herkunft: Heidelberg

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Vorweg: Ich habe keine Ahnung von Python!

Aber trotzdem hab ich mal gegooglet. Klar ist, dass die Präzision eines normalen double (ich schätze mal, dass Python double verwendet) nicht ausreicht. Die Verwendung von decimal bringt dabei aber auch nichts, weil die Rückgabe von math.cos() ja ein double ist. Also bist Du nach wie vor auf die Präzision des normalen double beschränkt.
Ich habe mal testweise einfach mpmath statt math verwendet. Außerdem überall dieses decimal-Zeug raus geschmissen. decimal bringt nur was (so wie ich das verstehe), wenn Du es komplett mit Dezimalbrüchen zu tun hast und dabei Rundungsfehler vermeiden willst. Z. B. in Finanz-Anwendungen, wo alles so wie so auf Dezimalstellen gerundet werden muss, würden Fehler rein kommen, wenn Du auf 2-er Potenz gerundete Werte verwendest. Aber bei Kosinus/Sinus, etc. ist eine dezimal-Rundung ja genau so richtig oder falsch, wie eine im Dual-System. Da gewinnst Du keine Präzision.
Deshalb brauchst Du eine Zahlen-Darstellung mit höherer Präzision und die liefert offenbar das mpmath Paket, das auch cos() mit der höheren Präzision mitbringt.

Dann noch was mit dem Dezimal-Bruch. Normalerweise ist ein Dezimalbruch einfach die Darstellung mit 1,57... etc. Dann halt mit 50 Stellen. Du versuchst aber einen echten Bruch, was in meinen Augen nicht darunter zu verstehen wäre.

Ich hab mich jetzt trotzdem mal damit probiert (wie gesagt: Ich kann kein Python!) und hab das so zum Laufen gebraucht:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
from fractions import Fraction
from mpmath import *

mp.dps = 51
def annäherung_Nullstelle_cos():

     a_n = pi 

     b_n = mpf(0)

     for i in range(0,60): 
         
          c = (a_n + b_n)/mpf(2) 

          print(i, a_n, b_n, c, cos(c))
          print() 

          if (cos(c)) < 0: 
      
             a_n = c 

          elif (cos(c)) > 0: 

               b_n = c 

     nprint(c, 50)
     nprint(pi/mpf(2), 50)

annäherung_Nullstelle_cos()


Dabei habe ich pi-Halbe noch einmal das in mpmath fest verdrahtete ausgegeben. Wenn man statt 60 einfach mal 100 Schleifen-Durchläufe macht, sieht man, dass noch deutlich mehr Dezimalstellen sich dem Wert nähern, als noch nach 60 Durchläufen.

Gruß
Marco
09.07.2021 12:13 as_string ist offline E-Mail an as_string senden Beiträge von as_string suchen Nehmen Sie as_string in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » Annäherung der positiven Nullstelle von cos(x) im Intervall [0,2] mittels Python