Dieses System
eqs = {(1/2) Y'[x]^2 == (1 - Log[Y[x]^2]) Y[x]^2, Y[0] == 1}
hat bekanntlich eine einfache Lösung in Form von Gaußschen Funktionen, die analytisch überprüft werden kann (genauer gesagt, es hat zwei Gaußsche Lösungen, Und , aufgrund der Symmetrie dieser ODE).
Allerdings, wenn ich versuche, numerisch zu lösen und zeichnen Sie eine seiner Lösungen:
nsol = NDSolve[eqs, Y, {x, -5, 5}] // Flatten
Plot[{Y[x] /. nsol[[1]]} // Evaluate, {x, -4, 4}, PlotRange -> {{-3, 3}, All}]
Plot[{Y[x] /. nsol[[2]]} // Evaluate, {x, -4, 4}, PlotRange -> {{-3, 3}, All}]
es produziert nur die Hälfte jeder der Lösungen. Nach der Warnmeldung von NDSolve habe ich versucht, den MaxSteps-Wert zu erhöhen, aber es funktioniert nicht und friert den PC für MaxSteps = 10^7
und höher ein (ich habe MMA bis 11.2.0 ausprobiert).
Irgendwelche Vorschläge, welche Optionen/Methoden ich hier für NDSolve verwenden sollte?
Update 27.11 .: Es wurde von LutzL darauf hingewiesen , dass das Problem in dem Punkt liegen könnte, wo die RHS meiner ODE einen Nullwert erreicht. Wenn es leicht negativ wird (z. B. aufgrund numerischer Fehler/Schwankungen), versucht NDSolve, eine Quadratwurzel aus einem negativen Wert zu ziehen, und bricht zusammen. Wenn ja, wie kann man dies verhindern, ohne zu versuchen, die Ihnen bereits bekannte (Gaußsche) Lösung anzupassen?
Update 28.11 .: Es wurde vorgeschlagen, die Reihenfolge dieses Systems zu erhöhen. In der Tat ein System von ODE 2. Ordnung
eqs2 = {Y''[x] Y'[x] == -2*Log[Y[x]^2]*Y[x]*Y'[x], Y[0] == 1, Y'[0] == Sqrt[2]}
ist äquivalent zum Original, enthält aber jetzt keine Potenzen von Ableitungen (Sie können Y'[x] auch kürzen, es ändert nichts). Es beseitigt auch das Problem einer Quadratwurzel aus einer negativen kleinen Zahl, das im vorherigen Update und in einigen von Answers erwähnt wurde. Rate mal? NDSolve kann nicht richtig integrieren
entweder. Anstelle eines einzelnen Gauß-Operators erzeugt es eine seltsame quasi-oszillierende Kette von Gauß-Operatoren.
PS Angesichts der Existenz so vieler Probleme bei der numerischen Lösung eines so einfachen Systems stelle ich mir eine Frage. Wie viele raffinierte numerische Ergebnisse, die in Unmengen von Forschungsartikeln veröffentlicht wurden, enthalten tatsächlich versteckte Fehler rechnerischen Ursprungs, ganz zu schweigen von absichtlicher Fälschung? ... Numerische Pakete und Codes sind heutzutage so ziemlich Black Boxes, daher wette ich, dass, wenn solche Fehler passieren, 99,99 % der Gutachter wären nicht in der Lage, sie zu erkennen, insbesondere in Situationen, in denen Modelle konzeptionell neuartig sind und/oder nicht durch analytische Berechnungen oder Schätzungen gestützt werden. Und wir sprechen von Petabytes an Codes und Outputs, die derzeit in allen Wissenschaftszweigen verwendet werden...
Was Sie vom numerischen Löser verlangen, ist in mehrfacher Hinsicht unmöglich
Das unmittelbare Problem, das Ihr Fehlerbild erzeugt, besteht darin, dass Ihre ODE nicht außerhalb definiert ist
. Ein numerischer Löser für
, insbesondere diejenigen mit internen Schritten mit adaptiver Schrittgröße, möchten möglicherweise die ODE-Funktion auswerten
außerhalb der Grenzen der sichtbaren Lösung, das heißt mit
außerhalb des Bereichs der exakten Lösung und mit
außerhalb des angegebenen Integrationsintervalls. Möglicherweise gibt es Optionen zum Einschränken der Domäne von
, wie z. B. das Erzwingen von Positivität, die sich auf diese Situation erstrecken können. Eine Notlösung ist hier die Erweiterung des Geltungsbereichs von
durch ständige Fortsetzung wie in
An den Nullwurzeln der rechten Seite
In jeder expliziten autonomen ODE das qualitative Verhalten wird durch die Wurzeln bestimmt und das Zeichen von in den Zwischenräumen zwischen den Wurzeln. Bei positivem Vorzeichen ist die Lösung monoton steigend, bei negativem Vorzeichen monoton fallend. Wenn die ODE differenzierbar ist, dann sind die Wurzeln von geben die stationären, konstanten Lösungen, und keine andere Lösung kann diese kreuzen oder auch nur erreichen. Wenn die Ableitung nicht an einer Wurzel begrenzt ist, ist die ODE an diesem Punkt steif, was jedem numerischen Löser Probleme mit Lösungen gibt, die sich diesem Punkt nähern. Die Art der Probleme hängt auch vom Löser ab, Löser mit fester Schrittweite können diesen Punkt überschreiten und große quantitative und qualitative Fehler verursachen, Löser mit adaptiver Schrittweite neigen zum Stillstand, indem sie die Schrittgröße unter das Maschinen-Epsilon regulieren.
Beim Vorbereiten der impliziten ODE für den numerischen Löser muss der CAS sie explizit machen. Hier geht es darum, das Vorzeichen der Quadratwurzel zu wählen. Sobald dieses Vorzeichen gewählt ist, bleibt es für den vollständigen Integrationsprozess konstant. Man müsste eine Art Ereignisbehandlung einführen und geeignete Ereignisse definieren, um einen Vorzeichenwechsel zu bewirken. Wie das mit der gegebenen Mathematica-Syntax funktionieren würde, habe ich keine Ahnung.
Und schließlich eine Art Lösung
Die Wahl des richtigen Vorzeichens der Wurzel hängt vom Verhalten der Lösung an den vorherigen Punkten ab. Wenn der Term unter der Quadratwurzel nicht Null ist, würde man ein positives Vorzeichen wählen, wenn die Lösung zuvor steigend war, und ein negatives Vorzeichen, wenn sie fallend war. Um alle Spekulationen mit Taylor-Polynomen zu umgehen, nehmen wir einfach die Ableitung der ursprünglichen ODE
scipy.integrate.odeint
für diese ODE zweiter Ordnung
def odefunc2(y,t): return [ y[1], -2*y[0]*np.log(y[0]**2) ]
sol2 = odeint(odefunc2,[ 1.0, 2**0.5],x)
plt.plot(x,sol2[:,0],'-b',x,sol2[:,1],'.g'); plt.grid(); plt.show()
Ergebnisse in der Kurve
heropup
Winter
Konstantin