Scipy odeint mit lsoda warnung

Ich bin völlig neu in der Kodierung und ich möchte diese 5 Differentialgleichungen numerisch lösen. Ich nahm eine Pythonschablone und wandte sie auf meinen Fall an. Hier ist die vereinfachte Version von dem, was ich geschrieben habe:

import numpy as np from math import * from matplotlib import rc, font_manager import matplotlib.pyplot as plt from scipy.integrate import odeint #Constants and parameters alpha=1/137. k=1.e-9 T=40. V= 6.e-6 r = 6.9673e12 u = 1.51856e7 #defining dy/dt's def f(y, t): A = y[0] B = y[1] C = y[2] D = y[3] E = y[4] # the model equations f0 = 1.519e21*(-2*k/T*(k - (alpha/pi)*(B+V))*A) f1 = (3*B**2 + 3*C**2 + 6*B*C + 2*pi**2*B*T + pi**2*T**2)**-1*(-f0*alpha/(3*pi**3) - 2*r*(B**3 + 3*B*C**2 + pi**2*T**2*B) - u*(D**3 - E**3)) f2 = u*(D**3 - E**3)/(3*C**2) f3 = -u*(D**3 - E**3)/(3*D**2) f4 = u*(D**3 - E**3)/(3*E**2) + r*(B**3 + 3*B*C**2 + pi**2*T**2*B)/(3*E**2) return [f0, f1, f2, f3, f4] # initial conditions A0 = 2.e13 B0 = 0. C0 = 50. D0 = 50. E0 = C0/2. y0 = [A0, B0, C0, D0, E0] # initial condition vector t = np.linspace(1e-15, 1e-10, 1000000) # time grid # solve the DEs soln = odeint(f, y0, t, mxstep = 5000) A = soln[:, 0] B = soln[:, 1] C = soln[:, 2] D = soln[:, 3] E = soln[:, 4] y2 = [A[-1], B[-1], C[-1], D[-1], E[-1]] t2 = np.linspace(1.e-10, 1.e-5, 1000000) soln2 = odeint(f, y2, t2, mxstep = 5000) A2 = soln2[:, 0] B2 = soln2[:, 1] C2 = soln2[:, 2] D2 = soln2[:, 3] E2 = soln2[:, 4] y3 = [A2[-1], B2[-1], C2[-1], D2[-1], E2[-1]] t3 = np.linspace(1.e-5, 1e1, 1000000) soln3 = odeint(f, y3, t3) A3 = soln3[:, 0] B3 = soln3[:, 1] C3 = soln3[:, 2] D3 = soln3[:, 3] E3 = soln3[:, 4] #Plot rc('text', usetex=True) plt.subplot(2, 1, 1) plt.semilogx(t, B, 'k') plt.semilogx(t2, B2, 'k') plt.semilogx(t3, B3, 'k') plt.subplot(2, 1, 2) plt.loglog(t, A, 'k') plt.loglog(t2, A2, 'k') plt.loglog(t3, A3, 'k') plt.show() 

Ich bekomme folgende Fehlermeldung:

 lsoda-- warning..internal t (=r1) and h (=r2) are such that in the machine, t + h = t on the next step (h = step size). solver will continue anyway In above, R1 = 0.2135341098625E-06 R2 = 0.1236845248713E-22 

Für einige Satz von Parametern, beim Spielen mit mxstep in odeint (auch versucht hmin und hmax aber bemerkte keinen Unterschied), obwohl der Fehler weiterhin besteht, sehen meine Graphen gut aus und sind nicht betroffen, aber die meisten der Zeiten sind sie. Manchmal ist der Fehler, den ich mir frage, mit der odeint Option full_output=1 zu laufen und dabei full_output=1 ich:

 A2 = soln2[:, 0] TypeError: tuple indices must be integers, not tuple 

Ich verstehe nicht, was das bedeutet, wenn man danach sucht.

Ich möchte verstehen, wo das Problem liegt und wie es zu lösen ist. Ist odeint sogar passend für was ich versuche zu tun?

One Solution collect form web for “Scipy odeint mit lsoda warnung”

In dieser lsoda Warnung bezieht sich t auf den aktuellen Zeitwert und h bezieht sich auf die aktuelle Integrationsschrittgröße. Die Schrittweite ist so nahe bei Null geworden, dass die aktuelle Zeit plus die Schrittweite als gleich der aktuellen Zeit aufgrund des Rundungsfehlers (dh r1 + r2 == r1 ) ausgewertet wird. Diese Art von Problem tritt normalerweise auf, wenn die ODEs, die du integrierst, schlecht benommen sind.

Auf meiner Maschine scheint die Warnmeldung nur bei der Berechnung von soln2 . Hier habe ich die Werte der einzelnen Parameter in der Region aufgezeichnet, in der die Warnungen auftreten (beachten Sie, dass ich zur Klarheit auf lineare Achsen umgestellt habe). Ich habe den Zeitschritt markiert, wo der lsoda Fehler zuerst erschien (bei r1 = 0.2135341098625E-06 ) mit einer roten Linie:

Bildbeschreibung hier eingeben

Es ist kein Zufall, dass das Aussehen der Warnmeldung mit dem "Knick" in E zusammenfällt!

Ich vermute, dass das Geschehen ist, dass der Knick eine Einzigartigkeit im Gradienten von E darstellt, die den Solver zwingt, kleinere und kleinere Schritte zu unternehmen, bis die Schrittgröße die Grenzen der Gleitkomma-Präzision erreicht. In der Tat können Sie einen anderen Wendepunkt in D sehen, der mit einem "Wackeln" in B zusammenfällt, wahrscheinlich verursacht durch das gleiche Phänomen.

Für einige allgemeine Ratschläge, wie man mit Singularitäten bei der Integration von ODE umgehen kann, werfen Sie einen Blick auf Abschnitt 5.1.2 hier (oder jedes anständige Lehrbuch auf ODEs).


Sie haben einen Fehler mit full_output=True weil in diesem Fall odeint ein Tupel mit der Lösung und einem dict mit zusätzlichen odeint zurückgibt. Versuchen Sie, das Tupel so auszupacken:

 soln, info = odeint(..., full_output=True) 
  • Hat jemand SciPy mit IronPython benutzt?
  • Schaffung eines Vertrauens Ellipsen in einem sccatterplot mit matplotlib
  • Wie kann man stückweise lineare Passform in Python anwenden?
  • Wie kann ich eine nichtlineare Optimierung mit scipy / numpy oder sympy durchführen?
  • Halten Sie unveränderte Daten beim Speichern von Numpy Array auf Bild mit Scipy Imsave
  • Finden Sie alle Punktpaare näher als eine gegebene maximale Entfernung
  • Warum sind lil_matrix und dok_matrix so langsam im Vergleich zu den üblichen Dict of Dicts?
  • Fehlgeschlagenes Gebäuderad für Spacy
  • Generierte korrelierte Daten in Python (3.3)
  • Gibt es eine "verbesserte" numpy / scipy dot Methode?
  • Python MemoryError in Scipy Radial Basis Funktion (scipy.interpolate.rbf)
  • Python ist die beste Programmiersprache der Welt.