cos (x) Reihe per Python. Nur für gerade Parameter kommt etwas

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
Edditheeagle
User
Beiträge: 2
Registriert: Mittwoch 20. Juni 2018, 14:22

Hallo,
ich besuche aktuell eine Numerik VL. Dort gibt es folgende Aufgabe:
Aus der Analysisvorlesung ist
cos x = 1 - x^2/x! + x^4/4! ....
bekannt, wobei die rechtsstehende unendliche Reihe für alle x E R konvergiert. Überzeugen Sie sich durch eine Implementierung in einem Python-Programm, daß man über diese Reihe nicht die Werte von cos x für große x, etwa x = 31:4159265 = 10pi hinreichend genau berechnen kann, da Auslöschungseffekte auftreten können. Berechnen Sie dazu die cos(kpi), k = 1; 2;...; 20 mittels der Reihe und geben Sie die Werte in einer Tabelle aus.

Ich habe mich mittels Literatur und Videos zu diesem Code durchgearbeitet:

Code: Alles auswählen

from math import pi
from math import factorial

def cosinus(k,n):
    cosk = 1
    sign = -1
    for k in range(21):
        for i in range (1, n):
            cosk = cosk + (sign*(pi**(2*i)))/factorial(2*i)
            sign = -sign
    return cosk

while True:
    try:
        n=int(input("Eingabe der Anzahl von Termen: "))
        if n>0:
            for k in range(1,21):
                print ('{} => {}\t' .format(k, cosinus(k,n)))
            
        break
        
    except ValueError:
        print("Bitte ganze Zahlen eingeben!")
Nun zu meinem Problem:
Für gerade n nähert es sich dem richtigen Wert von -1 an. Für ungerade aber geht es gegen -41. Ich finde aber einfach nicht den Fehler
Edditheeagle
User
Beiträge: 2
Registriert: Mittwoch 20. Juni 2018, 14:22

also die einrückung habe ich richtig gemacht. weiß nicht wie ich den code hier richtig einfügen kann
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es gibt im Editor einen grossen, freundlichen Button "Python", den muss man druecken nachdem man Code einfeguegt und MARKIERT hat. Ich hab' das mal fuer dich nachtraeglich bearbeitet.

Und was dein Algorithmus angeht: ich verstehe nicht, was das k soll. Deine Reihe ist doch nur in Abhaengigkeit von einer Zaehlvariable? Wozu als n UND k? Oder habe ich da was verpasst.

Und dein sign kannst du auch als (-1)**i darstellen. Das spart ein paar Zeilen.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Warum steht `pi` in der `cosinus()`-Funktion? In der Formel kommt das ja nicht vor‽

Ich hab's mal in Hy umgesetzt:

Code: Alles auswählen

#!/usr/bin/env hy
(import [math [factorial :as ! pi :as π]])


(defn cosinus [x m]
  (sum (map (fn [n] (* (** -1 n) (/ (** x (* 2 n)) (! (* 2 n)))))
            (range 0 m))))


(defmain [&rest args]
  (setv m 86)  ; Determined by trial and error.  ☺
  (for [k (range 1 21)]
    (setv kπ (* k π))
    (print k "· π =" kπ "→" (cosinus kπ m))))
Und da sieht die Ausgabe so aus:

Code: Alles auswählen

1 · π = 3.14159265359 → -1.0
2 · π = 6.28318530718 → 1.0
3 · π = 9.42477796077 → -1.0
4 · π = 12.5663706144 → 0.999999999996
5 · π = 15.7079632679 → -0.999999999936
6 · π = 18.8495559215 → 0.999999999324
7 · π = 21.9911485751 → -0.999999981214
8 · π = 25.1327412287 → 1.00000137574
9 · π = 28.2743338823 → -0.999983049123
10 · π = 31.4159265359 → 0.999925156774
11 · π = 34.5575191895 → -0.994650512315
12 · π = 37.6991118431 → 0.889086955522
13 · π = 40.8407044967 → -6.02069761586
14 · π = 43.9822971503 → -99.7680044963
15 · π = 47.1238898038 → 1162.5945773
16 · π = 50.2654824574 → 32644.4459495
17 · π = 53.407075111 → -538779.88382
18 · π = 56.5486677646 → -24570006.0826
19 · π = 59.6902604182 → 123137386.923
20 · π = 62.8318530718 → -2595101790.27
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten