2016-10-03 3 views
5

にODEを解く私はマニホールドF(v,n,h)=0vにおける非線形関数でこの方程式を解決したい MATLABは不変多様

dn/dt=f(n,v) 
dh/dt=g(h,v) 

のように見えるシステムを持っています。私は v=fzero(@(x) F(x,n,h),0)のようなものを使用して、各時間ステップでマニホールド上のvの値を求めようとしました。しかし、これは信じられないほど遅く、ode15s(私のシステムはリラクゼーション・オシレータ)は積分公差を満たしません。 F(v,n,h)=0で定義されたマニホールド上のODEに対する解決策を見つけるにはどうすればよいですか?

+1

システムは微分代数系であるため、DAEソルバを使用する必要があります。 – LutzL

答えて

2

@ LutzLのコメントは非常に役に立ちます。 ode15sを使用してDAEソルバを設定することができます。 例:私の場合はhttps://www.mathworks.com/help/matlab/ref/ode15s.html

での「半明示的な微分代数方程式(のDAE)とロバートソンの問題を解決する」、私はセットアップ行列になります。

M=[zeros(1,3);0,1,0;0,0,1]; 
options = odeset('Mass',M,'RelTol',1e-5,'AbsTol',1e-6,'MaxStep',0.01); 
y0=[v0,n0,h0]; 
[T,Y]=ode15s(@slow,[0 50],y0,options); 

そしてslowとして定義された関数であります:

function dy = slow(t,y) 
    v=y(1); n=y(2); h=y(3); 
    dy=zeros(3,1); 
    dy(1)=F(v,n,h); 
    dy(2)=f(n,v); 
    dy(3)=g(h,v); 
end 
0

この問題を解決するための可能な方法の一つは、 F(v,n,h)=0式区別することです:

を今、私たちは、ODEシステムに

または

を得ることができます

これは通常の方法で解決できます。

+0

私はこのようにしました。しかし、dF/dvの項は、システムの折り畳み構造の近くで0に非常に近くなります。したがって、解の精度はあまり良くありません。 – Badoe

関連する問題