2017-06-13 4 views
1

Ich habe drei gekoppelte ODEs und ich verwende RK4-Methode in Python, um sie mit den angegebenen Anfangsbedingungen zu lösen. Als ich sie laufen erhalte ich folgende Fehlermeldung:RuntimeWarning: Überlauf in exp gefunden

RuntimeWarning: overflow encountered in exp

Jede Hilfe, wo ich falsch gemacht haben könnte wäre sehr geschätzt.

Hier ist der Code (ursprünglich eingefügt here):

#simple exponential potential 
# u = K*phi'/H0; v = omega_matter**(1/3)*(1+z); w = l*K*phi' - ln((K**2)*V0/H0**2) 
# f,g,h are functions of derivation of u,v,w respectively derieved w.r.t t*H0 = T 

import matplotlib.pyplot as plt 
import numpy as np 
import math 

def f(T,u,v,w): 
    return -3*u*((v**3 + (u**2)/6 + np.exp(-w)/3)**0.5) + l*np.exp(-w) 

def g(T,u,v,w): 
    return -v*(v**3 + (u**2)/6 + np.exp(-w)/3)**0.5 

def h(T,u): 
    return l*u 

p = 0.1 
q = 1.0 
dh = 0.1 
n = (q-p)/dh 
u = [0.0] 
v = [1100] 
T = [0.00001] 
w = [-44.927] 
l = 1.3 

for i in range(0,int(n)): 
    k1 = f(T[i],u[i],v[i],w[i]) 
    r1 = g(T[i],u[i],v[i],w[i]) 
    print k1, r1 
    s1 = h(T[i],u[i]) 
    print s1 
    k2 = f(T[i] + 0.5*dh,u[i] + k1*dh,v[i] + k1*dh,w[i] + k1*dh) 
    r2 = g(T[i] + 0.5*dh,u[i] + r1*dh,v[i] + r1*dh,w[i] + r1*dh) 
    s2 = h(T[i] + 0.5*dh,u[i] + s1*dh) 
    print k2,r2,s2 
    k3 = f(T[i] + 0.5*dh,u[i] + k2*dh,v[i] + k2*dh,w[i] + k2*dh) 
    r3 = g(T[i] + 0.5*dh,u[i] + r2*dh,v[i] + r2*dh,w[i] + r2*dh) 
    s3 = h(T[i] + 0.5*dh,u[i] + s2*dh) 
    k4 = f(T[i] + dh,u[i] + dh*k3,v[i] + dh*k3,w[i] + k3*dh) 
    r4 = g(T[i] + dh,u[i] + r3*dh,v[i] + dh*r3,w[i] + r3*dh) 
    s4 = h(T[i] + dh,u[i] + dh*s3) 
    T == T.append(T[i] + dh) 
    u == u.append(u[i] + (dh/6)*(k1 + 2.0*k2 + 2.0*k3 + k4)) 
    v == v.append(v[i] + (dh/6)*(r1 + 2.0*r2 + 2.0*r3 + r4)) 
    w == w.append(w[i] + (dh/6)*(s1 + 2.0*s2 + 2.0*s3 + s4)) 

plt.plot(T,u, '-b') 
plt.plot(T,v, '-r') 
plt.plot(T,w, '-g') 
plt.title('quintessence cosmological model') 
plt.show() 
+1

Willkommen! Es könnte nützlich sein, diese Frage etwas anders zu stellen. Es ist am besten, den * minimalen * möglichen Code anzugeben, der das fragliche Problem reproduziert und es im Hauptteil der Frage bereitstellt. Fragen, die nur um Hilfe beim Debuggen eines großen Codeabschnitts bitten, sind nicht wirklich gut für SO geeignet. Sie können https://stackoverflow.com/help/how-to-ask nachsehen, um zu erfahren, wie Sie hier am besten Fragen stellen können. – wphicks

+0

Mögliches Duplikat von [Überlauf in exp, python] (https://stackoverflow.com/questions/43100902/overflow-in-exp-python) –

+0

Ich vermute stark, dass Sie Ihre Gleichungen für 'f',' g' und haben 'h' falsch. Entweder das oder das Problem ist extrem schlecht konditioniert. Die Ableitung von 'v' an Ihrem Startpunkt hat den Wert' -3619146406000.8389', der bereits groß erscheint, und nach einem winzigen Schritt füttern Sie nun enorme (negative) Werte in ein 'np.exp (-w)', und dadurch Unendlichkeiten bekommen. (Ich sehe nichts falsches mit der RK4-Implementierung.) Haben Sie einen Hinweis auf das physische Problem, das Sie lösen? –

Antwort

1

Ihr Problem scheint, wie es in Ihrem f oder g Funktionsaufrufe entstehen würden. Beobachten Sie Ihren Wert von -w, wenn es an die numpy.exp-Funktion in diesem Code übergeben wird. Wenn es zu einer ausreichend großen positiven Zahl auswertet, würde das Anrufen der exponential function darauf scheinen, dass es leicht einen Überlauf verursachen könnte. Google sagt mir, dass e^44.927 zu 3.2474927e + 19 bewerten würde.

Möglicherweise müssen Sie einen kleineren absoluten Wert für w auswählen, um diesen Code auszuführen, ohne dass ein Überlauffehler auftritt.

(Siehe Python-How to determine largest/smallest int/long/float/complex numbers my system can handle für, wie Sie bestimmen, was die größten zulässigen ganzzahlige Werte sind in Python.)

+0

Minimal- und Maximalwerte für Ints sind hier nicht wirklich relevant; Das ist alles Fließkomma. –

+0

@MarkDickinson Guter Fang. Ich bin mit einer besseren Frage verbunden. –

+0

Danke für die Hilfe. Der verwendete Code ist korrekt, aber das Problem liegt bei den verwendeten Differentialgleichungen. Sie sind autonome Gleichungen, die nach einer bestimmten Zeit explodieren, wenn der Anfangswert groß ist. Irgendeine Idee oder eine Referenz, wie man autonome Gleichungen berechnet, kann ich im Netz nicht finden. @ MarkDickinson –

Verwandte Themen