Matlab中的DAE:ode15s

计算科学
2021-12-05 18:01:32

我必须解决这个问题

{y=4y+1h7yy(1)=1y(1)=1whereh=5y2y

因为它是一个 DAE(我知道我可以将代入方程,但这只是一个示例,因为实际上我必须解决的问题是一个 DAE,而且比这更复杂)。当我使用并将问题视为二阶微分方程时,图 Vs. _hode45ty

在此处输入图像描述

但是当我将其视为 DAE 时,图表完全不同,我不明白为什么。这是我的代码:

ode45二阶微分方程

function yp = dae_normale(t,y)
yp = zeros(2,1);
yp(1) = y(2);
yp(2) = 4*y(2) + 1/(5*y(2) - 2*y(1) ) - 7*y(1);

ode45二阶微分方程运行

[t,y] = ode45('dae_normale',[1,5],[1,1]);
[t,y(:,1)]
plot(t,y(:,1))

DAEode15s

function out = dae(t,y)
out = [y(2)
   4*y(2) + 1/y(3) - 7*y(1)
   y(3) - 5*y(2) + 2*y(1) ];

DAEode15s 运行

y0 = [1; 1; 3];
M = [1 0 0; 0 1 0; 0 0 0];
options = odeset('Mass',M);
[t,y] = ode15s(@dae,[1 5],y0,options);
[t,y(:,1)]
plot(t,y(:,1))
1个回答

ode45 是一个显式 (Runge-Kutta) ODE 求解器,因此仅是条件稳定的。通常,ode45 会自动减小步长以保持稳定性。但是,正如本文所讨论的,错误控制很重要,有时它不是因为错误容限太大。尝试按如下方式修改您的代码以减少容错:

opts=odeset('RelTol', 1e-4, 'AbsTol', 1e-7);
[t,y] = ode45('dae_normale',[1,5],[1,1], opts);