MATLAB 在不变流形上求解 ODE
MATLAB solve ODE on invariant manifold
我的系统看起来像
dn/dt=f(n,v)
dh/dt=g(h,v)
我想在流形 F(v,n,h)=0
上求解这个方程,v
中的一个非线性函数。我尝试使用 v=fzero(@(x) F(x,n,h),0)
之类的东西来求解每个时间步流形上 v 的值。但这非常慢,而且 ode15s(我的系统是张弛振荡器)无法满足积分公差。如何在 F(v,n,h)=0
定义的流形上找到 ODE 的解?
解决这个问题的一种可能方法是区分
F(v,n,h)=0
等式:

现在我们可以获得ODE系统
,%5C,&space;%5Cfrac%7Bdh%7D%7Bdt%7D=g(h,v),%5C,%5Cfrac%7Bdv%7D%7Bdt%7D=&space;-%5Cleft.%5Cleft(&space;%5Cfrac%7B%5Cpartial&space;F%7D%7B%5Cpartial&space;n%7D%5Cfrac%7Bdn%7D%7Bdt%7D+%5Cfrac%7B%5Cpartial&space;F%7D%7B%5Cpartial&space;h%7D%5Cfrac%7Bdh%7D%7Bdt%7D&space;%5Cright&space;)%5Cright/&space;%5Cleft(&space;%5Cfrac%7B%5Cpartial&space;F%7D%7B%5Cpartial&space;v%7D&space;%5Cright&space;))
或
,%5C,&space;%5Cfrac%7Bdh%7D%7Bdt%7D=g(h,v),%5C,%5Cfrac%7Bdv%7D%7Bdt%7D=&space;-%5Cleft.%5Cleft(&space;%5Cfrac%7B%5Cpartial&space;F%7D%7B%5Cpartial&space;n%7Df(n,v)+%5Cfrac%7B%5Cpartial&space;F%7D%7B%5Cpartial&space;h%7Dg(h,v)&space;%5Cright&space;)%5Cright/&space;%5Cleft(&space;%5Cfrac%7B%5Cpartial&space;F%7D%7B%5Cpartial&space;v%7D&space;%5Cright&space;))
按常规方法即可解决
我觉得@LutzL 的评论很有帮助。可以使用 ode15s
设置 DAE 求解器。
示例:https://www.mathworks.com/help/matlab/ref/ode15s.html
中的 "Solve Robertson Problem as Semi-Explicit Differential Algebraic Equations (DAEs)" 部分
在我的例子中,我会设置一个矩阵:
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
我的系统看起来像
dn/dt=f(n,v)
dh/dt=g(h,v)
我想在流形 F(v,n,h)=0
上求解这个方程,v
中的一个非线性函数。我尝试使用 v=fzero(@(x) F(x,n,h),0)
之类的东西来求解每个时间步流形上 v 的值。但这非常慢,而且 ode15s(我的系统是张弛振荡器)无法满足积分公差。如何在 F(v,n,h)=0
定义的流形上找到 ODE 的解?
解决这个问题的一种可能方法是区分
F(v,n,h)=0
等式:
现在我们可以获得ODE系统
或
按常规方法即可解决
我觉得@LutzL 的评论很有帮助。可以使用 ode15s
设置 DAE 求解器。
示例:https://www.mathworks.com/help/matlab/ref/ode15s.html
在我的例子中,我会设置一个矩阵:
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