NDSolve löst diese gewöhnliche Differentialgleichung nur „halbwegs“

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, Y = e X ( X 2 ) Und Y + = e X ( X + 2 ) , aufgrund der Symmetrie Y Y dieser ODE).

Allerdings, wenn ich versuche, numerisch zu lösen e Q S 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^7und 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 e Q S 2 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...

Sie sollten diese Frage wahrscheinlich stattdessen auf mathematica.stackexchange.com stellen .
Ein Problem, das ich sehen kann: aufgrund des Platzes von Y ' ( X ) 2 dies ist keine normale ODE - es ist mehrwertig. Wenn Y ( X ) ist dann eine Lösung Y ( X ) ist auch eine Lösung.
Winther, danke für die Idee, aber diese Z-Symmetrie ist nicht die Ursache des Problems. Diese Symmetrie führt nur zu den beiden Lösungen des Systems, in diesem Fall zu zwei Gaußschen. Mathematica sieht beide (die nsol ist eine Liste mit zwei Einträgen), erzeugt/plottet aber nur "die Hälfte" von jedem von ihnen.

Antworten (1)

Was Sie vom numerischen Löser verlangen, ist in mehrfacher Hinsicht unmöglich

1. Der Bereich von ODE ist begrenzt, der Solver kann die Grenze verletzen

Das unmittelbare Problem, das Ihr Fehlerbild erzeugt, besteht darin, dass Ihre ODE nicht außerhalb definiert ist | j | e 1 / 2 . Ein numerischer Löser für j ' = F ( X , j ) , insbesondere diejenigen mit internen Schritten mit adaptiver Schrittgröße, möchten möglicherweise die ODE-Funktion auswerten F außerhalb der Grenzen der sichtbaren Lösung, das heißt mit j außerhalb des Bereichs der exakten Lösung und mit X außerhalb des angegebenen Integrationsintervalls. Möglicherweise gibt es Optionen zum Einschränken der Domäne von F , 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 F durch ständige Fortsetzung wie in

j ' 2 = 2 max ( 0 , 1 ln ( j 2 ) ) j 2 .
Der numerische Löser bleibt dann bei der konstanten Lösung, sobald sie erreicht ist, und das ist richtig, da dies eine Annäherung an eine der möglichen exakten Lösungen für dieses Anfangswertproblem ist.

1.-2. Vollständiger Lösungssatz der impliziten ODE

An den Nullwurzeln der rechten Seite

0 = ( 1 ln ( j 2 ) ) j = ± e 1 / 2 ,
die ODE ist nicht Lipschitz, da die Quadratwurzel als vertikale Tangente funktioniert. Damit gilt die Eindeutigkeit des Satzes von Picard-Lindelöf nicht, nicht konstante Lösungen erreichen diese Werte. Man kann beliebig Segmente dieser konstanten Lösungen in jede Gauß-Glockenkurven-Lösung einfügen, um weitere exakte Lösungen der impliziten ODE zusammenzusetzen.

2. Es gibt kein "up'n'down" in Ordnung 1 skalare autonome ODE

In jeder expliziten autonomen ODE j ' = F ( j ) das qualitative Verhalten wird durch die Wurzeln bestimmt F und das Zeichen von F 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 F 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.

3. Das Vorzeichen der Quadratwurzel ist fest

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

A) Ableitungen höherer Ordnung können als eine Art Gedächtnis dienen

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

j ' j = 2 j j ' + ( 1 ln ( j 2 ) ) 2 j j ' = 2 ln ( j 2 ) j j ' ,   j ( 0 ) = 1 , 1 2 j ' ( 0 ) 2 = 1
und unter Ausschluss konstanter Lösungen, sogar konstanter Segmente in einer Lösung, kann man durch dividieren j ' finden
j = 2 ln ( j 2 ) j , j ( 0 ) = 1 , j ' ( 0 ) = ± 2
Pythons scipy.integrate.odeintfü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

Lösung zweiter Ordnung od

LutzL, danke für deine Antwort, sie scheint robust. Ich bin mir jedoch nicht sicher, wie Ihr Rat lautet, meine ursprüngliche Gleichung in Ihre zu ändern j ' 2 = 2 max ( 0 , 1 ln ( j 2 ) ) j 2 kann helfen, die fehlende Hälfte der Gaußschen Funktion wiederherzustellen . Ihr Rat ersetzt die fehlende Hälfte durch eine Konstante, was nicht gerade das ursprüngliche Ziel ist ...
Nein, diese spezielle Lösung wird nicht wiederhergestellt. Analytisch können Sie eine gültige Lösung konstruieren, indem Sie jeden Gaußschen Wert am Maximum zerlegen, eine Weile konstant bleiben und dann mit der zweiten Hälfte des Gaußschen Werts nach unten gehen. Es muss nichts wiederhergestellt werden, da die Lösung gültig ist, die gewünschte Lösung ist nur eine von unendlich vielen richtigen Lösungen. Dies ist dem Standardbeispiel ähnlich und lokal äquivalent j ' = j mit j ( 0 ) = 0 . Satz j = e u dann bei deinem Problem u ' 2 = 2 4 u , das ist genau das.
Wenn es nicht wiederhergestellt wird, sehe ich in Ihrem Rat nicht viel Sinn (ich mag immer noch Ihre Beobachtung zum Vorzeichenwechsel der rechten Seite). Natürlich kann ich nach Belieben verschiedene Lösungen entlang der x-Achse patchworken (sie irgendwie aneinander anpassen), aber das ist nicht das, was ich brauche. Ich brauche einen numerischen Algorithmus, der die Gaußsche Lösung vollständig reproduziert, auch wenn ich nicht weiß, dass eine solche Lösung existiert ...
Außerdem weiß ich nicht, warum du anrufst Y = e hier eine richtige Lösung. Es erfüllt keine Bedingung Y ( 0 ) = 1 was ein Teil davon ist e Q S ...
Sie können patchen, weil Sie alle Möglichkeiten kennen und wählen können. Ein numerischer Algorithmus sieht, wenn überhaupt, nur, dass die Steigung gegen Null geht. Wie sollte die numerische Methode das richtige Vorzeichen der Quadratwurzel wählen, wenn dies auf globalen Überlegungen basiert?
Interessant ... Ich dachte immer, dass standardmäßige numerische ODE-Lösungsalgorithmen immer Lösungen erzeugen, die standardmäßig zu einer Klasse glatter Funktionen gehören (in dieser Klasse Lösung von e Q S ist einzigartig, und es ist eine Gaußsche, wie eine analytische Studie gezeigt hat) ... Wenn sie es nicht tun, wie können wir dann jemals numerischen Integrationen in der Physik vertrauen, insbesondere in den Fällen, in denen ein untersuchtes System völlig neu ist oder wir es nicht haben ein analytisches Backup?
Numerische Algorithmen erzeugen niemals glatte Funktionen, bestenfalls erzeugen sie stückweise Polynomfunktionen, die exponentiell von der exakten Lösung wegdriften. „Vertrauen“ kann man ihnen nur, wenn man neben der Lösung auch eine Fehlerabschätzung durchführt, wenn auch nur ungefähr. Die Fehlertoleranzen, die Sie den Algorithmen von Softwarepaketen geben, sind normalerweise eher Richtwerte als stark erzwungene Grenzen.
Verzeihen Sie meine lockere Terminologie. Da ODE-Löser endliche Differenzen verwenden, erzeugen sie natürlich keine glatten Funktionen, sondern diejenigen, die zu glatten Funktionen konvergieren, die durch Gleichungen bestimmt werden, die durch Rand- oder Anfangsbedingungen ergänzt werden. Die Frage ist nun, wie man NDSolve anweist, zur "wahren" Lösung von zu konvergieren e Q S (was in einer Klasse glatter Funktionen einzigartig ist). Übrigens, in Bezug auf Ihren ODE-Ansatz 2. Ordnung: Woher kommt die Bedingung? Y ' ( 0 ) = 2 komme aus?
Das gilt nur, wenn die ODE (die Funktion auf der rechten Seite) selbst glatt ist. Aber wie schon gesagt, bei j = ± e 1 / 2 diese ODE hat eine Singularität in den Ableitungen der ODE-Funktion (und der Vorzeichenfrage der Quadratwurzel). || Die Anfangsbedingung für die Ableitung erhält man durch Auswertung der Ausgangsgleichung an X = 0 , j ( 0 ) = 1 zu bekommen 1 2 j ' ( 0 ) 2 = 1 .
Ich habe gerade Ihr ODE-2-System in den MMA-Code implementiert ... es erzeugt keine Gaußsche, sondern eine verrückte oszillierende und divergierende Funktion, wenn |x| wächst. Habe ich Fehler im Code gemacht: eqs = {Y''[x] Y'[x] == -2*Log[Y[x]^2]* Y[x] Y'[x], Y[ 0] == 1, Y'[0] == Sqrt[2]}; nsol = NDSolve[eqs, Y, {x, -50, 50}] // Flatten; Plot[{Y[x]} /. nsol[[1]] // Auswerten, {x, -40, 40}, PlotRange -> {All, {-1, 2}}]