2017-12-21 28 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 

上記は私の非線形微分方程式を解くコードです。微分方程式は、時間の移動特異点として。 警告が表示されています。警告:失敗しました。t=1.466319e+00. tspanが[0 1]に縮小されるとグラフが表示されます。しかし、私は何が起こっているのかを長い間知る必要があります。私はifとforループが1より小さいXの値に対してdX = 0が解決するような条件を課すと思います。しかし、私が同じように実装した方法はやや間違っています。助けてくださいMATLABで特異点を扱う

+0

多分、別のソルバーを試してみてください。詳細については、ドキュメントの[ODEソルバーの選択](https://uk.mathworks.com/help/matlab/math/choose-anode-solver.html)を参照してください。 – am304

+0

問題の性質に影響しないので、 'X <-1'は配列' X'に対して正確に何を計算しますか? – LutzL

答えて

0

あなたの微分方程式は連続していません。 ode45ソルバは、ODE関数の4次までの導関数が連続的であり、「慣れている」ことを期待しています。そうではないので、内部ステップサイズ制御は、ソリューションがジャンプ位置respに近づくにつれてステップサイズをゼロに調整します。位相/モード分離平面である。

イベントを使用して、ODEの2つのフェーズ間の制御された切り替えを実行できます。

もちろん、適応性のあるステップサイズを使用しない方法でも、多かれ少なかれ正確な結果が得られます。ジャンプがどれだけグローバルエラーに影響するかを調べなければなりません。

関連する問題