2

我在理解如何在 octave/matlab 中实现事件,在微分方程的解析中遇到了一些麻烦。

例如,考虑这个解决微分方程 y' = -y 的简单代码:

function dy = odefun(t,y)
    dy = -y;
endfunction

options = odeset('RelTol',1e-4,'AbsTol',[1e-4]);
[T,Y] = ode45(@odefun,[0 12],[1],options);

现在我想介绍一个随机事件。例如,在某个固定时间步长,我想随机改变 的值,y然后根据微分方程继续进化。我怎样才能做到这一点?

4

1 回答 1

2

这样做的方法是分段集成系统并将每次运行的结果输出附加在一起:

% t = 0 to t = 6
tspan = [0 6];
y0 = 1;
options = odeset('RelTol',1e-4,'AbsTol',1e-4);
[T,Y] = ode45(@odefun,tspan,y0,options);

% t = 6 to t = 12
tspan = [6 12];
y0 = Y(end,:)+randn; % Pertubation
[t,y] = ode45(@odefun,tspan,y0,options);
T = [T;t(2:end)];  % Remove first value as it will be same as last of previous run
Y = [Y;y(2:end,:)];

Matlab 编辑器可能会抱怨数组没有被预分配TY/或增长,但在这种情况下没关系,因为它们只增长了几次。

您不想尝试做的(但很多尝试)是将您的扰动添加到集成函数中。首先,如果您希望它恰好在特定时间或满足特定条件时发生,则无法在 ODE 函数内完成。其次,在您的 ODE 中插入较大的不连续性会导致精度降低和计算时间延长(尤其是ode45-ode15s可能是更好的选择,或者至少确保您的绝对和相对公差是合适的)。你会有效地产生一个非常僵硬的系统

如果您确实希望在满足特定条件时(而不是在特定时间)发生扰动,那么您将需要使用事件函数(例如,参见这个问题)。当条件满足时,您需要使用事件函数来终止集成,然后如上所示应用您的扰动。

于 2014-02-01T17:45:55.383 回答