2017-12-21 7 views
0
X0=linspace(-.3,.3,10); 
[T,X] = ode45(@difflossy,[0 10],X0); 
plot(T,X,'-'); 

function dX = difflossy(T,X) 
    if X<-1 
     dX=0; 
    else 
     dX= X.*(1-X); 
    end 
end 

Das oben genannte ist mein Code, um die nichtlineare Differenzialgleichung zu lösen. Die Differentialgleichung als eine sich bewegende Singularität in der Zeit. Ich bekomme eine Warnung Warnung: Fehler bei t=1.466319e+00. Ich bekomme eine Grafik, wenn Tspan auf [0 1] reduziert wird. Aber ich muss wissen, was seit langer Zeit passiert. Ich denke, eine if-for-Schleife auferlegt eine Bedingung, so dass für Werte von X weniger als 1, dX = 0 lösen wird. Aber die Art und Weise, wie ich das Gleiche umgesetzt habe, ist etwas falsch. Bitte helfen Sie mirHandhabungssingularität in MATLAB

+0

Vielleicht versuchen Sie einen anderen Löser. Weitere Informationen finden Sie unter [Wählen Sie einen ODE-Solver] (https://uk.mathworks.com/help/matlab/math/choose-an-ode-solver.html) in der Dokumentation. – am304

+0

Nur für das Interesse, da es den Charakter des Problems nicht beeinflusst, was genau berechnet 'X <-1' für ein Array' X'? – LutzL

Antwort

0

Ihre Differentialgleichung ist nicht kontinuierlich. Der ode45 Solver erwartet, dass die Derivate bis zur 4. Ordnung der ODE-Funktion stetig und "zahm" sind. Da dies nicht der Fall ist, regelt die interne Schrittweitensteuerung die Schrittweite auf Null, wenn sich die Lösung der Sprungposition nähert. Phasen/Modus-Trennebene.

Sie können Ereignisse verwenden, um einen kontrollierten Wechsel zwischen den beiden Phasen der ODE durchzuführen.

Natürlich liefert jede Methode, die keine adaptive Schrittweite verwendet, auch ein mehr oder weniger genaues Ergebnis, man müsste untersuchen, wie stark der Sprung den globalen Fehler beeinflusst.