2016-05-04 10 views
0

für einige Simulationen muss ich eine Approximation der Exponentialfunktion verwenden. Nun, das Problem, das ich habe, ist, dass:Simulation der Exponentialfunktion mit Pertubation

function s=expone(N,k) 
s=0 
for j=1:k 
    s=s+(exp(-N+j*log(N)-log(factorial(j)))); 
end 
end 

ein ziemlich stabil ist, in dem Sinne, dass es fast 1 für k groß genug ist. Sobald N jedoch größer als 200 ist, fällt es schnell auf Null ab. Wie kann ich das verbessern, ich brauche große N. ich die mathematischen nicht wirklich, warum dies schreiben ändern, da ich eine zusätzliche Pertubationsbehandlung habe, wird mein letzter Code etwas liegen aussehen:

function s=expone(N,k) 
s=0 
for j=1:k 
    s=s+(exp(-N+j*log(N)-log(factorial(j))))*pertubation(N,k); 
end 
end 

DIe Pertubationsbehandlung zwischen 0 und 1, das ist also kein Problem, aber der Vorfaktor scheint nicht für N> 200 zu funktionieren. Kann jemand helfen? Vielen Dank!

+1

was ist der Zweck der Approximation, anstatt die Exponentialfunktion verwenden selbst? Was meinst du mit "es ist fast 1 für k groß genug"? Ein Exponential soll nicht gleich 1 sein, oder? Was meinst du mit "fällt schnell auf Null": wenn man weiter "N" erhöht oder "k" erhöht? Was erwarten Sie von Ihrer Funktion? – tvo

+0

Sollte es Pertubation (N, j) anstelle von Pertubation (N, k) sein? – dmuir

+0

ja, danke, dass du darauf hingewiesen hast! – Liealgebrabach

Antwort

1

Die Funktion log (x) - x hat positive und negative Teil Graphic in Wolframalpha

während x - log (! X) negativ für x> = 0 Graphic in Wolframalpha

So das Problem entstehen, wenn (N - log (N)) ist viel größer als (j - log (j)). Also ist die Lösung, ein j viel größer als N zu wählen. Exp (negativ) gegen Null

beispiel Expone (20,1) = 7.1907e-05 aber Expone (20,20) = 0,5591 und Expone (20,50) = 1,000

Als Schluss, wenn Sie möchten mit N big arbeiten, sollte j größer sein, und als ein zusätzlicher Tipp möchten Sie möglicherweise ändern Sie die Funktion für Schleifen zu vermeiden:

+0

Vielen Dank für Ihre Antwort! Nur zwei Probleme: Wenn ich Ihren Code verwende, und ich will es plotten (ich meine einen Vektor, variierende N), ich bekomme nur eine konstante Handlung, es scheint nicht den Vektor zu verarbeiten. Zweitens würde ich vorschlagen, dass ich summiere, wenn j sehr groß ist, also j >> N? – Liealgebrabach

+0

Ich finde auch, dass die Verwendung der Stirling-Formel hilft, weil faktorielle bricht für große Zahlen ... – Liealgebrabach

+0

Ja, habe ich mit Stirling-Formel versucht und es ist noch stabiler. Auf der anderen Seite kann der Code durch Vektor entweder mit arrayfun oder for loop verwendet werden – daleonpz