【问题标题】:Number of ODE Events changes with varying condition simple ODEODE 事件数随不同条件简单 ODE 变化
【发布时间】:2019-07-26 03:59:06
【问题描述】:

我有以下简单的 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; 或 value = 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 解决方案中产生了“凹凸”。为什么?

【问题讨论】:

  • 查看“RelTol”和“AbsTol”选项。如果我设置 options = odeset('Reltol',1e-5,'Events',@test_events);我在“x-1”只有一个活动
  • 通过将 RelTol 设置为 1e-5,我也只能得到一个事件。但是,我仍然不明白为什么这会对如此简单且规模良好的 ODE 产生任何影响。我将更新问题以包含此信息。
  • ode 求解器的精度有限,您可以通过这两个属性进行更改。您获得的 t 值对于求解器是相同的。它无法区分它们。
  • 这仍然存在以下问题: - 在许多情况下,更严格的容差会降低求解器的准确性。对于像这样的简单情况,应该不需要更严格的容差,并且完全任意选择 - 设置 RelTol=1e-8 会产生与默认 RelTol=1e-3 相同的解决方案 - 更改 @test_events 中“值”的定义或更改初始条件可能会改变结果(RelTol 不应以不同方式影响这些结果)我将更新问题以包含此信息
  • 您还可以查看包含在 sol 对象中的内部采样点。在某些示例中可能会出现一个接近 4 的情况,但是由于步长应该相当大,所以它应该是一个低概率事件。

标签: matlab events ode ode45


【解决方案1】:

一种推测可以解释这个简单问题如何发生舍入误差:使用 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} 是精确的也是如此。在该累积浮点噪声范围内,该值可能会围绕根部振荡,从而导致检测到多个过零。

【讨论】:

  • 感谢您周到的回答。我已经考虑了一点,但我不确定我是否完全理解。但是,我将解决我能理解的问题:如果事件函数的根有多个交叉点,那么这是否意味着我需要奇数个事件来满足 value(t=0) > 0 和 value (t=t_end)
  • 如果插值多项式完全连续地拟合在一起,情况就是如此。我不知道到底发生了什么,但我认为由于浮点错误存在差距。但要知道到底发生了什么,就必须尽可能深入挖掘中间结果和代码。可以从绘制接近根的解开始,使用sol 的评估来获得插值多项式的值。
猜你喜欢
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
  • 2019-07-14
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多