【问题标题】:MATLAB solve ODE on invariant manifoldMATLAB 在不变流形上求解 ODE
【发布时间】:2016-10-03 22:56:42
【问题描述】:

我的系统看起来像

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 的解决方案?

【问题讨论】:

  • 您应该使用 DAE 求解器,因为您的系统是微分代数的。

标签: matlab ode


【解决方案1】:

我发现@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

【讨论】:

    【解决方案2】:

    解决这个问题的一种可能方法是区分 F(v,n,h)=0 方程:

    现在我们可以得到ODE系统了

    这可以通过通常的方式解决。

    【讨论】:

    • 我试过这种方式。然而,dF/dv 项在系统中的折叠结构附近变得非常接近 0。因此求解精度不是很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多