Ich möchte die Lane-Emden-Isothermengleichung lösen [PDF, Gl. 15.2.9]
mit den Anfangsbedingungen
mit SciPy,odeint()
aber wie zu sehen ist, ist die Gleichung am Ursprung singulär. In der Dokumentation wird angegeben, dass ODEPACK verwendet wird.
Ich kenne bereits die Potenzreihen der Lösung in einer Nachbarschaft von ( ref ):
Ich habe versucht Einstellung tcrit
zu np.array([0.0])
, aber nicht Arbeit: Ich habe eine Warnung über ungültige Werte erhalten und dann meine Lösung ist alles NaN
. Sollte ich vielleicht ab 0,01 integrieren? Oder gibt es eine andere Lösung?
Antworten:
Gut, diese Antwort ist ein Schuss in die Dunkelheit, aber hier geht es weiter.
Transformieren Sie zunächst die ODE zweiter Ordnung in ein System aus zwei ODEs. Lassen
Dann die implizite ODE zweiter Ordnung
kann als explizite ODE erster Ordnung ausgedrückt werden
Erstens wissen wir das
Da wir davon ausgegangen sind, dass eine Lösung existiert, ist differenzierbar, was bedeutet, dass sie kontinuierlich sein muss. Die Grenze einer stetigen Funktion an einem Punkt ist ihr Wert an diesem Punkt, und wir kennen den Wert von da es sich um eine Anfangsbedingung handelt.φ2 φ2(0)
Das wissen wir auch
aus ähnlichen Gründen; Wir haben angenommen, dass differenzierbar ist, also stetig, und da es sich um eine Anfangsbedingung handelt.φ1 φ1(0)=0
Schließlich,
unter Verwendung der L'Hôpital-Regel auf der unbestimmten Form .0/0
Um weiter fortzufahren, müssen wir eine andere Annahme treffen: ist stetig bei . Dann folgt darausφ˙2 ξ=0
Wenn wir die ODE erster Ordnung erneut betrachten und die rechte Seite bei auswerten , können wir sehen, dass wir:ξ=0
woraus folgt, dass .φ˙2(0)=1/3
Mit dieser Analyse können Sie eineξ=0
if
Anweisung einfügen, die diese Werte der Funktion auf der rechten Seite bei zurückgibt , wodurch Sie die Singularität überwinden sollten. Diese Analyse erfordert jedoch einige Annahmen über die Kontinuität, die möglicherweise zutreffen oder nicht. Nehmen Sie die resultierende Lösung mit einem Salzkorn.quelle
if
if
Klausel. Vielen Dank!Wenn Sie mehr Optionen für Ihren ODE-Solver wünschen, schauen Sie sich das Assimulo- Paket an, das Bindungen an das CVODE-Paket (und RADAU und einige einfache Integratoren) implementiert.
quelle
if
Anweisung zu verwenden, um die richtige Grenze der rechten Seite als auszufüllen ?