Ich versuche, die Lane-Emden-Gleichung für beliebige Werte von n zu lösen (polytropischer Index). Um SciPy zu verwenden, habe ich die ODE zweiter Ordnung als eine Menge von zwei gekoppelten ODEs erster Ordnung dargestellt. Ich habe den folgenden Code:Das Lösen von ODE mit SciPy ergibt einen ungültigen Wert in double_scalars Fehler
import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import odeint
def poly(y,xi,n):
theta, phi = y
dydt = [phi/(xi**2), -(xi**2)*theta**n]
return dydt
Hier habe ich definiert phi = theta‘
y0 = [1.,0.]
xi = np.linspace(0., 16., 201)
for n in range(0,11):
sol = odeint(poly, y0, xi, args=(n/2.,))
plt.plot(xi, sol[:, 0], label=str(n/2.))
plt.legend(loc='best')
plt.xlabel('xi')
plt.grid()
plt.show()
jedoch in dem folgenden Fehler dieser Code Ergebnisse ausgeführt wird:
RuntimeWarning: invalid value encountered in double_scalars
app.launch_new_instance()
Zuerst habe ich dachte, dies sei ein Ergebnis der Singularität der Gleichung bei xi = 0, so änderte ich mein Integrationsintervall:
xi = np.linspace(1e-10, 16., 201)
Dies behebt das Problem bei n = 0., aber nicht bei anderen Werten von n. Die Plots, die ich bekomme, ergeben keinen Sinn und sind einfach falsch.
Warum bekomme ich diese Fehlermeldung, und wie kann ich meinen Code beheben?
Vielen Dank für Ihre Antwort! Das ist toll, mein Code funktioniert jetzt! Haben Sie eine Idee, warum es nur für ganzzahlige Werte von n funktioniert? –
Ich denke es mag es nicht, wenn Theta kleiner oder gleich Null ist. Wenn Sie sich die Lösungsausgabe anschauen, stoppt sie bei 'theta = 0'. –
Das macht Sinn, denn das würde zu komplexen Lösungen führen. Gibt es eine Möglichkeit, ODEint bis zu dem Punkt zu verwenden, an dem Theta <0 ist? –