
Hi Pythonistas, hier genauer die mathematisch Bewanderten, ich stehe vor dem Problem, eine exponentiale Reihe aus einem gegebenen Anfangs-, Endwert mit einer Anzahl von Schritten zu generieren, was auch ganz gut klappt. Jetzt muß ich noch die Steilheit variieren können, aber finde dafür keine brauchbare Lösung. Hier ist mein aktueller Stand: from math import * def expseries(fromv, tov, steps): ret, rev = [], False if fromv > tov: fromv, tov = tov, fromv rev = True fromlog = log(fromv) tolog = log(tov) logdiff = (tolog - fromlog) / (steps - 1) v = fromlog for i in range(steps): ret.append(exp(v)) v += logdiff if rev: ret.reverse() return ret if __name__ == "__main__": a1 = expseries(1.00, 1000.00, 30) for i in range(len(a1)): print "%.2f" % a1[i] Hat hier jemand sowas schon mal realisiert, oder kann mir Hinweise liefern, wie ich dies am Besten machen kann (möglichst mit Python "Hausmitteln"). DiV, Pete _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Am Mittwoch, 18. Oktober 2006 22:37 schrieb Hans-Peter Jansen:
Hi Pythonistas, hier genauer die mathematisch Bewanderten,
ich stehe vor dem Problem, eine exponentiale Reihe aus einem gegebenen Anfangs-, Endwert mit einer Anzahl von Schritten zu generieren, was auch ganz gut klappt. Jetzt muß ich noch die Steilheit variieren können, aber finde dafür keine brauchbare Lösung. Hier ist mein aktueller Stand:
from math import *
def expseries(fromv, tov, steps): ret, rev = [], False if fromv > tov: fromv, tov = tov, fromv rev = True fromlog = log(fromv) tolog = log(tov) logdiff = (tolog - fromlog) / (steps - 1) v = fromlog for i in range(steps): ret.append(exp(v)) v += logdiff if rev: ret.reverse() return ret
if __name__ == "__main__": a1 = expseries(1.00, 1000.00, 30) for i in range(len(a1)): print "%.2f" % a1[i]
Hat hier jemand sowas schon mal realisiert, oder kann mir Hinweise liefern, wie ich dies am Besten machen kann (möglichst mit Python "Hausmitteln").
Hier das ganze als Generator: from math import exp, log def expseries(fromv, tov, steps): fromlog = log(fromv) tolog = log(tov) logdiff = (tolog - fromlog) / (steps - 1) v = fromlog for i in range(steps): yield exp(v) v += logdiff if __name__ == "__main__": for y in expseries(1.0, 1000.0, 30): print "%.2f" % y print "---" for y in expseries(1000.0, 1.0, 30): print "%.2f" % y Wie Du siehst, ist die Fallunterscheidung vorwärts/rückwärts überflüssig. Da die Kurve x -> exp(x) im Intervall fromv, tov eindeutig ist, musst Du weitere Parameter einführen oder unterschiedliche Intervalle auswählen, wenn Du einen anderen Verlauf haben willst. Hier mal ein Beispiel als Anregung: from math import exp, log import Tkinter as tk blowup = 5 def es(x0, dy, steps): """ x0: Startpunkt dy: Hoehendifferenz """ x1 = log(dy + exp(x0)) dx = (x1 - x0) / steps x = x0 y0 = exp(x0) for i in range(steps+1): yield i, exp(x)-y0 x += dx def draw(series, color): series = ((int(x)*blowup, int((100-y)*blowup)) for x, y in series) canvas.create_line(fill=color, *series) if __name__ == "__main__": root = tk.Tk() canvas = tk.Canvas(root, width=100*blowup, height=100*blowup) canvas.pack() for x0, color in [(-10.0, "green"), (1.0, "blue"), (10.0, "red")]: draw(es(x0, 100.0, 100), color) root.mainloop() Peter _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Hi Peter, Danke für Deine Fürsorge.. Am Donnerstag, 19. Oktober 2006 12:16 schrieb Peter Otten:
Am Mittwoch, 18. Oktober 2006 22:37 schrieb Hans-Peter Jansen:
Hi Pythonistas, hier genauer die mathematisch Bewanderten,
ich stehe vor dem Problem, eine exponentiale Reihe aus einem gegebenen Anfangs-, Endwert mit einer Anzahl von Schritten zu generieren, was auch ganz gut klappt. Jetzt muß ich noch die Steilheit variieren können, aber finde dafür keine brauchbare Lösung.
Hier das ganze als Generator:
from math import exp, log
def expseries(fromv, tov, steps): fromlog = log(fromv) tolog = log(tov) logdiff = (tolog - fromlog) / (steps - 1) v = fromlog for i in range(steps): yield exp(v) v += logdiff
Ahh, viel simpler. Cool.
if __name__ == "__main__": for y in expseries(1.0, 1000.0, 30): print "%.2f" % y print "---" for y in expseries(1000.0, 1.0, 30): print "%.2f" % y
Wie Du siehst, ist die Fallunterscheidung vorwärts/rückwärts überflüssig. Da die Kurve x -> exp(x) im Intervall fromv, tov eindeutig ist, musst Du weitere Parameter einführen oder unterschiedliche Intervalle auswählen, wenn Du einen anderen Verlauf haben willst.
Da die Intervalle festgelegt sind, bleibt nur die Option über einen zusätzlichen Parameter.
Hier mal ein Beispiel als Anregung:
from math import exp, log import Tkinter as tk
blowup = 5
def es(x0, dy, steps): """ x0: Startpunkt dy: Hoehendifferenz """ x1 = log(dy + exp(x0)) dx = (x1 - x0) / steps x = x0 y0 = exp(x0) for i in range(steps+1): yield i, exp(x)-y0 x += dx
Hier variierst Du die Intervalle, genauer den x0 Faktor, aber warum 10.0 als Startwert einen fast linearen Anstieg ergibt, 1.0 die klassische Exponentialkurve und -10.0 eine extreme Kurve, kapiere ich nicht, und daher fehlt mir auch die zündende Idee, wie man diesen Effekt in einen zusätzlichen Parameter verfrachten kann..
def draw(series, color): series = ((int(x)*blowup, int((100-y)*blowup)) for x, y in series) canvas.create_line(fill=color, *series)
if __name__ == "__main__": root = tk.Tk() canvas = tk.Canvas(root, width=100*blowup, height=100*blowup) canvas.pack() for x0, color in [(-10.0, "green"), (1.0, "blue"), (10.0, "red")]: draw(es(x0, 100.0, 100), color) root.mainloop()
Peter
Hmm, Pete _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Am Freitag, 20. Oktober 2006 14:41 schrieb Hans-Peter Jansen:
Hier variierst Du die Intervalle, genauer den x0 Faktor, aber warum 10.0 als Startwert einen fast linearen Anstieg ergibt, 1.0 die klassische Exponentialkurve und -10.0 eine extreme Kurve, kapiere ich nicht,
Das habe ich einfach ausprobiert, deshalb gab's auch die Grafik gratis dazu...
und daher fehlt mir auch die zündende Idee, wie man diesen Effekt in einen zusätzlichen Parameter verfrachten kann..
Weshalb nimmst Du nicht einfach x0 als "zusätzlichen Parameter" und verschiebst dann die Kurve um einen weiteren konstanten Wert nach links/rechts? Wenn das nicht geht -- vielleicht erzählst Du mal was über den Anwendungsfall, insbesondere welche Daten Du beschaffen kannst. Wenn Du das Problem analytisch angehen willst: die Kurve durch die (maximale oder mittlere) Krümmung zu parametrisieren ist wahrscheinlich zu kompliziert, aber es sieht so aus als ob die Fläche unter dem Grafen mit der Krümmung korreliert. exp(x) ist ja leicht zu integrieren -- notfalls musst Du halt einen Mathematiklehrer Deines Vertrauens auftun. Peter _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (2)
-
Hans-Peter Jansen
-
Peter Otten