ODE事件的数量随着条件的简单ODE而变化

问题描述 投票:1回答:1

我有以下简单的ODE:

dx/dt=-1

初始条件x(0)= 5时,我对x(t)== 1感兴趣。所以我有以下事件功能:

function [value,isterminal,direction] = test_events(t,x)
    value = x-1;
    isterminal = 0;
    direction = 0;
end

这应该在t = 4时产生一个事件。但是,如果我运行以下代码,我会得到两个事件,一个在t = 4,一个在附近的位置t = 4 + 5.7e-14:

options = odeset('Events',@test_events);
sol = ode45(@(t,x)-1,[0 10],5,options);
fprintf('%.16f\n',sol.xe)
% 4.0000000000000000
% 4.0000000000000568

如果我运行类似的代码来找到x(t)== 0或x(t)== - 1(值= x;或值= x + 1;分别),我只有一个事件。为什么这会产生两个事件?

更新:如果选项结构更改为以下内容:

options = odeset('Events',@test_events,'RelTol',1e-4);

...然后ODE仅在t = 4 + 5.7e-14时返回一个事件。如果'RelTol'设置为1e-5,则在t = 4时返回一个事件。如果'RelTol'设置为1e-8,则返回与默认事件相同的两个事件('RelTol'= 1e-3)。此外,将初始条件从x(0)= 5更改为x(0)= 4会产生单个事件,但设置x(0)= 4和'RelTol'= 1e-8会产生两个事件。

更新2:观察sol.x和sol.y输出(分别为t和x),时间以整数[0 1 2 3 4 5 6 7 ...]的形式进行,x以整数的形式前进到x(t) = 5)像这样:[5 4 3 2 1 1.11e-16 -1.000 -2.000 ...]。这表明在t = 4和t = 5之间存在某种情况,这会在ODE解决方案中产生“碰撞”。为什么?

matlab events ode ode45
1个回答
0
投票

一个可能解释如何在这个简单问题中出现舍入误差的推测:使用ODE导数函数的评估k_n(也称为“密集输出”)在内部步骤之间插入解。理论形式是

b_1(u)k_1 + b_2(u)k_2 + ...b_s(u)k_s

其中0 <= u<= 1它是内部点之间的间隔参数,即t = (1-u)*t_k+u*t_{k+1}

系数多项式是非平凡的。虽然在示例中所有的k_i=1都是常数,但总和b_1(u)+...+b_s(u)的求值可以累积舍入误差,这些误差在接近根的解值中变得可见,即使y_ky_{k+1}是精确的。在该累积浮点噪声范围内,该值可能在根周围振荡,导致检测到多个过零点。

© www.soinside.com 2019 - 2024. All rights reserved.