Aus reiner Neugier habe ich die Lotka-Volterra-Gleichungen auch einmal in Python implementiert. Gefällt mir beinahe besser als die Maxima-Version. Aber das kann natürlich daran liegen, daß ich mich in Python zu Hause fühle und Maxima neu für mich ist.
Der große Unterschied zur (interaktiven) Maxima-Version ist der, daß ich das Gleichungssystem als Funktion implementiert habe. Daher konnte ich vorab die Parameter als Variablen angeben, was mehr Komfort verspricht, wenn man mit den Parametern spielen möchte.
# Parameter eps1 = 0.5 # Reproduktionsrate der Beute gamma1 = 0.0333 # Freßrate der Räuber = Sterberate der Beute eps2 = 1.0 # Sterberate der Räuber gamma2 = 0.01 # Reproduktionsrate der Räuber def deriv(u, t, eps1, eps2, gamma1, gamma2): x, y = u dBdt = eps1*x - gamma1*x*y dRdt = -eps2*y + gamma2*x*y return(dBdt, dRdt)
Für die (numerische) Integration der Differentialgleichungen mußte das gute, alte odeint()
aus dem Modul scipy ran, das auf die ebenso gute, aber noch ältere FORTRAN-Bibliothek ODEPACK (erste Implementierung 1983) zugreift. Diese dürfte über die Jahre so ausgereift und fehlerfrei sein, daß es da nichts mehr zu bemängeln gibt (darum lieben Numeriker die guten alten FORTRAN-Bibliotheken LAPACK, ODEPACK, etc.).
Für Nachahmer hier das komplette Programm (oder besser Progrämmchen):
import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt # Startwerte B0 = 100 # Startwert Beutepopulation R0 = 45 # Startwert Räuberpopulation max_t = 50 # Parameter eps1 = 0.5 # Reproduktionsrate der Beute gamma1 = 0.0333 # Freßrate der Räuber = Sterberate der Beute eps2 = 1.0 # Sterberate der Räuber gamma2 = 0.01 # Reproduktionsrate der Räuber def deriv(u, t, eps1, eps2, gamma1, gamma2): x, y = u dBdt = eps1*x - gamma1*x*y dRdt = -eps2*y + gamma2*x*y return(dBdt, dRdt) y0 = B0, R0 T = np.linspace(0, max_t, 100*max_t) ret = odeint(deriv, y0, T, args = (eps1, eps2, gamma1, gamma2)) b, r = ret.T plots = plt.plot(T, b, "g", lw = 2, label = "Beute") \ + plt.plot(T, r, "r", lw = 2, label = "Räuber") plt.title("Lotka-Volterra-Gleichung") plt.xlabel("Zeit [Tage]") plt.ylabel("Anzahl") plt.grid(True, linestyle = "--") plt.legend(loc = "upper right") plt.show()
Von den Lotka-Volterra-Gleichungen gibt es diverse Variationen und Erweiterungen (zum Beispiel mehrere Beutetiere oder mehrere Arten von Räubern oder Beutetiere mit begrenzter Weidekapazität). Wenn ich in meiner Bibliothek die Literatur dazu (wieder-) finde, werde ich eventuell noch einmal darauf zurückkommen. Still digging!
Über …
Der Schockwellenreiter ist seit dem 24. April 2000 das Weblog digitale Kritzelheft von Jörg Kantel (Neuköllner, EDV-Leiter Rentner, Autor, Netzaktivist und Hundesportler — Reihenfolge rein zufällig). Hier steht, was mir gefällt. Wem es nicht gefällt, der braucht ja nicht mitzulesen. Wer aber mitliest, ist herzlich willkommen und eingeladen, mitzudiskutieren!
Alle eigenen Inhalte des Schockwellenreiters stehen unter einer Creative-Commons-Lizenz, jedoch können fremde Inhalte (speziell Videos, Photos und sonstige Bilder) unter einer anderen Lizenz stehen.
Der Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfaßt. Hier können Sie der Erfassung widersprechen.
Diese Seite verwendet keine Cookies. Warum auch? Was allerdings die iframes
von Amazon, YouTube und Co. machen, entzieht sich meiner Kenntnis.
Werbung
Diese Spalte wurde absichtlich leergelassen!