Reihendarstellung

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
euler
User
Beiträge: 8
Registriert: Montag 6. Mai 2013, 13:48

Hallo ihr lieben,
ich sitze schon seid einiger Zeit und versuche, so dachte ich ein einfaches Problem mittels Python zu lösen.
Es geht um die Reihendarstellung der Funktion exp(-x).
Mein Code sieht wie folgt aus

Code: Alles auswählen

import numpy as np
import scipy as sp
import csv
from scipy import integrate
from scipy.integrate import quad
import sys 
print sys.float_info.max_10_exp
from decimal import *
from pylab import *
import pylab as pl
import matplotlib.pyplot as plt
from scipy.optimize.minpack import curve_fit 
R=1.0e15
d=1.2e25
q=1e-4
a=np.pi**2.0/700.0
alpha=1.5
n=2
x=10.0
xlow=10.0
E0=1000.0
sum=0.0
for k in range(101):
    g=math.factorial(k)*(k+1)
    b=-a*n**2
    sum+=(-1.0)**k*(x)**k/math.factorial(k)
print sum,  math.exp(-10)
Für Werte bis x=10 stimmt die Summe mit math.exp(-10) überein. Für größere x Werte erhalte ich ein falsches Ergebnis.
Ich habe einiges probiert, komme allerdings nicht weiter und hoffe, dass ihr eine Idee habt
Für jegliche Hilfe bin ich sehr dankbar :)
Grüße
Zuletzt geändert von Anonymous am Freitag 31. Mai 2013, 13:32, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@euler: Quelltext kursiv setzen reicht nicht, weil dabei die Einrückung nicht erhalten bleibt, die bei Python ja ein wichtiger Bestandteil der Sprache ist.

Warum ist denn da so viel unnützes Zeug in dem Quelltext? Über die hälfte der Zeilen wird man doch einfach entsorgen können, weil die überhaupt nichts sinnvolles zum Ergebnis beitragen.

Ohne jetzt auf die Mathematik einzugehen: Ist Dir klar, dass Gleitkommazahlen ungenau sind, und man Abweichung bei verschiedenen Rechenwegen erwarten muss‽ Bist Du sicher, dass man die Unterschiede nicht damit erklären kann?
euler
User
Beiträge: 8
Registriert: Montag 6. Mai 2013, 13:48

Hallo
Danke für die Verbesserung. Das ganze "unnütze Zeug" brauche ich für die späteren Berechnungen :wink:
Ich denke, dass der "Fehler" bei math.factorial zu finden ist. Allerdings weiß nicht, welche Alternative ich sonst hätte.

Grüße
euler
User
Beiträge: 8
Registriert: Montag 6. Mai 2013, 13:48

Das Problem konnte nun endlich gelöst werden.
Also man bildet die Reihe für exp(x) und bildet am Ende den Kehrwert :)

Danke für die Hilfe
BlackJack

@euler: Das magst Du vielleicht brauchen, aber hier stört es weil man erst einmal trennen muss zwischen dem was wirklich zum Problem beitragen kann und dem ganzen „Füllstoff”. Das hier hätte völlig ausgereicht:

Code: Alles auswählen

import math
import sys 


def main():
    print sys.float_info.max_10_exp
    x = 10.0
    result = sum((-1.0)**k * x**k / math.factorial(k) for k in xrange(101))
    print result, math.exp(-10)


if __name__ == '__main__':
    main()
Ich denke weiterhin es ist die begrenzte Genauigkeit bei Gleitkommazahlen. Sofern der Algorithmus stimmt.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@euler: hast Du Dir jemals angeschaut, was Du da so munter zusammen addierst?
Für negative x hast Du eine alternierende Reihe, Du bildest also jeweils die Differenz von zwei fast gleich großen Zahlen, wobei das Ergebnis daraus relativ klein ist. Dadurch werden die numerischen Fehler schnell sehr groß.
euler
User
Beiträge: 8
Registriert: Montag 6. Mai 2013, 13:48

@sirius
Ist mir auch aufgefallen. Die Frage ist, gibt es eine alternative Schreibweise, wie man die e-Funktion als unendliche Reihe darstellt?
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@euler: Die Darstellung als Grenzwert der Folge (1+x/n)^n ist robuster gegen Genauigkeitsfehler als die Reihendarstellung.
Antworten