Python lösen Verzögerungsdifferentialgleichungen bedingt

Ich verwende dde23 von pydelay Paket, um eine Verzögerungsdifferentialgleichung zu lösen. Meine Frage: Wie komme ich eine Gleichung bedingt? Zum Beispiel hat die Zielgleichung zwei Möglichkeiten:

 when x>1, dx/dt=0.25 * x(t-tau) / (1.0 + pow(x(t-tau),10.0)) -0.1*x otherwise, dx/dt=0.25 * x 

Ich habe zwei Ansätze ausprobiert, aber es scheint, als ob man keiner arbeitete:

  1. Ansatz 1 nicht beschweren, aber es ist die if else-Anweisung nicht interpretiert worden.

  2. Approach 2 erzeugte folgende Fehler:

    Gefunden ausführbare Datei c: \ mingw \ bin \ g ++ Exe c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b7c6f72c9e771ec4d311.cpp: In der Funktion 'double f (double, double)': c: \ Docx ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp: 734: Fehler: 'x' kann nicht als Funktion c verwendet werden: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ Python27_compiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp: 734: error: 'x' kann nicht als Funktion verwendet werden c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp: In der Funktion 'PyObject * compiled_func (PyObject *, PyObject *) ': c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp: 878: Warnung: Vergleich zwischen signierten und unsignierten Integer-Ausdrücken c: \ docume ~ 1 \ thao \ Einheimische ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b3c6f72c9e771ec4d311.cpp: 883: Warnung: Vergleich zwischen signierten und unsignierten Integer-Ausdrücken c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_c Ompiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp: 774: warning: unbenutzte Variable 'Nhistx_ar' c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b3c7f72c9e771ec4d311.cpp: 775: warning: unbenutzte Variable 'Shistx_ar' c: \ Dokument ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b7c6f72c9e771ec4d311.cpp: 776: Warnung: unbenutzte Variable 'Dhistx_ar' c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311. Cpp: 785: warning: unbenutzte Variable 'NVhistx_ar' c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b3c7f72c9e771ec4d311.cpp: 786: Warnung: unbenutzte Variable 'SVhistx_ar' c: \ docume ~ 1 \ Tha \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n \ r \ n \ Warnung: unbenutzte Variable 'NThist_ar' c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b27c6f72 C9e771ec4d311.cpp: 797: Warnung: unbenutzte Variable 'SThist_ar' c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b3c6f72c9e771ec4d311.cpp: 798: Warnung: unbenutzte Variable 'DThist_ar' c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp: 817: Warnung: unbenutzte Variable 'Ndiscont' c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp: 818: Warnung: unbenutzte Variable 'Sdiscont' c: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_compiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp: 819: Warnung: unbenutzte Variable 'Ddiscont' Traceback (letzter Anruf zuletzt): Datei "C: \ Dokumente und Einstellungen \ thao \ Desktop \ mackey-glass.py", Zeile 33, in dde.run () Datei "C: \ Python27 \ lib \ site-packages \ pydelay_dde23.py", Zeile 1120, in Run compiler = 'gcc') Datei "C: \ Python27 \ lib \ site-packages \ scipy \ weave \ inline_tools.py", Zeile 355, in Inline ** kw) Datei "C: \ Python27 \ lib \ site-packages \ Scipy \ weave \ inline_tools.py ", Zeile 482, in compile_f Unktion verbose = verbose, ** kw) Datei "C: \ Python27 \ lib \ site-packages \ scipy \ weave \ ext_tools.py", Zeile 367, in kompilieren verbose = verbose, ** kw) Datei "C: \ Python27 \ Lib \ site-packages \ scipy \ weave \ build_tools.py ", Zeile 272, in build_extension setup (name = module_name, ext_modules = [ext], verbose = verb) Datei" C: \ Python27 \ lib \ site-packages \ Numpy \ distutils \ core.py ", Zeile 186, in setup return old_setup (** new_attr) Datei" C: \ Python27 \ lib \ distutils \ core.py ", Zeile 169, im Setup erhöhen SystemExit," error: "+ Str (msg) distutils.errors.CompileError: error: Befehl "g ++ -O2 -Wand -IC: \ Python27 \ lib \ site-packages \ scipy \ weave -IC: \ Python27 \ lib \ site-packages \ scipy \ weave \ Scxx -IC: \ Python27 \ lib \ site-packages \ numpy \ core \ include -IC: \ Python27 \ include -IC: \ Python27 \ PC -cc: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ Python27_compiled \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.cpp -oc: \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_intermediate \ compiler_a77d1132635f0379270bcb96a5e542fc \ Freigabe \ docume ~ 1 \ thao \ locals ~ 1 \ temp \ thong \ python27_ Kompiliert \ sc_f68f7a878bf7b27c6f72c9e771ec4d311.o "fehlgeschlagen mit Exit-Status 1 [Fertig in 5.8s mit Exit-Code 1]

Ansatz 1 (verwenden Sie die if else-Anweisung, um eqns zu aktualisieren, was ein Python-Dict ist):

 import numpy as np import pylab as pl from pydelay import dde23 eqn_1a='0.25 * x(t-tau) / (1.0 + pow(x(t-tau),10.0)) -0.1*x' eqn_1b='0.45 * x' eqns = { 'x' : eqn_1a if 'x>1' else eqn_1b} dde = dde23(eqns=eqns, params={'tau': 15}) dde.set_sim_params(tfinal=1000, dtmax=1.0, AbsTol=10**-6, RelTol=10**-3) histfunc = {'x': lambda t: 0.5 } dde.hist_from_funcs(histfunc, 51) dde.run() sol1 = dde.sample(2, 3, 0.1) x1 = sol1['x'] 

Ansatz 2 (C-Code zum Löser):

 eqns = { 'x' : 'f(x, tau)'} # We can define ac function to be used in the equations mycode = """ double f(double x, double tau) { if (x>1){ return (0.25 * x(t-tau) / (1.0 + pow(x(t-tau),10.0)) -0.1*x); } else{ return (0.45 * x); } } """ dde = dde23(eqns=eqns, params={'tau': 15}, supportcode=mycode) dde.set_sim_params(tfinal=1000, dtmax=1.0, AbsTol=10**-6, RelTol=10**-3) histfunc = {'x': lambda t: 0.5 } dde.hist_from_funcs(histfunc, 51) dde.run() sol1 = dde.sample(1, 300, 1) x1 = sol1['x'] 

  • Objekt zu tief für gewünschtes Array - scipy.integrate.odeint
  • Wie berechnen Sie Clusterzuordnungen von Verknüpfungs- / Distanzmatrizen in scipy in Python?
  • Python: Multi variable nichtlineare Montage wie Matlabs nlinfit
  • Welcher Algorithmus verwendet in interp1d Funktion in scipy.interpolate
  • Python Shared Libraries: RTLD_GLOBAL segfault
  • Lesen und schreiben Sie Stereo. WAV-Datei mit Python + Metadaten
  • `Numpy.diff` und` scipy.fftpack.diff` geben unterschiedliche Ergebnisse bei der Unterscheidung
  • Installieren von SciPy mit Pip
  • One Solution collect form web for “Python lösen Verzögerungsdifferentialgleichungen bedingt”

    Der zweite Ansatz funktioniert mit einer kleinen Veränderung. Der Wert der verzögerten Variablen muss als Argument der Funktion direkt übergeben werden.

     eqns = { 'x' : 'f(x, x(t - tau))'} mycode = """ double f(double x, double x_tau) { if (x > 1.0){ return 0.25 * x_tau / (1.0 + pow(x_tau, 10.0)) -0.1*x; } else{ return 0.45 * x; } } """ 

    Obwohl dies läuft, beachten Sie, dass es nicht eine sehr genaue Lösung geben kann. Dies ist auf die Diskontinuität bei x=1 . Weitergehende Löser können diese Diskontinuitäten explizit behandeln (siehe zB http://www.radford.edu/~thompson/ffddes/ ).

    Wenn Sie mit dem pydelay Solver für Bequemlichkeit bleiben möchten oder einfach nur einen Überblick bekommen, können Sie versuchen, die maximale Schrittgröße dtmax klein genug zu setzen, um den Fehler zu reduzieren.

    Python ist die beste Programmiersprache der Welt.