Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab ODE事件数随简单ODE条件的变化而变化_Matlab_Events_Ode_Ode45 - Fatal编程技术网

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

Matlab ODE事件数随简单ODE条件的变化而变化,matlab,events,ode,ode45,Matlab,Events,Ode,Ode45,我有以下简单的颂歌: 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

我有以下简单的颂歌:

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(分别为value=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),时间以整数[01 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解决方案中创建一个“凹凸”。为什么?

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

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

其中,
0一个推测可能解释了在这个简单问题中舍入误差是如何发生的:使用ODE导数函数的求值
k_n
在内部步骤之间插入解决方案,也称为“密集输出”。理论形式是

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

其中
0查看“RelTol”和“absol”选项。如果我设置选项=odeset('Reltol',1e-5,'Events',@test_Events);我在“x-1”只有一个事件,通过将RelTol设置为1e-5,我也只能得到一个事件。然而,我仍然不明白为什么这会影响到如此简单和规模良好的ODE。我将更新问题以包含此信息。ode解算器的精度有限,可以通过这两个属性进行更改。对于解算器,您获得的t值是相同的。它无法区分它们。这仍然留下以下问题:-在许多情况下,更严格的公差会降低解算器的精度。对于这样一个简单的情况,应该不需要更严格的公差,并且完全任意的选择-设置RelTol=1e-8产生与默认RelTol=1e-3相同的解决方案-更改@test_事件中“值”的定义或更改初始条件可能会改变结果(RelTol不应以不同方式影响这些结果)我将更新问题以包含此信息您还可以查看包含在sol对象中的内部采样点。在一些示例中,可能会出现一个接近4的情况,但是由于步长应该相当大,因此这应该是一个低概率事件。请查看“RelTol”和“ABSTROL”选项。如果我设置选项=odeset('Reltol',1e-5,'Events',@test_Events);我在“x-1”只有一个事件,通过将RelTol设置为1e-5,我也只能得到一个事件。然而,我仍然不明白为什么这会影响到如此简单和规模良好的ODE。我将更新问题以包含此信息。ode解算器的精度有限,可以通过这两个属性进行更改。对于解算器,您获得的t值是相同的。它无法区分它们。这仍然留下以下问题:-在许多情况下,更严格的公差会降低解算器的精度。对于这样一个简单的情况,应该不需要更严格的公差,并且完全任意的选择-设置RelTol=1e-8产生与默认RelTol=1e-3相同的解决方案-更改@test_事件中“值”的定义或更改初始条件可能会改变结果(RelTol不应以不同方式影响这些结果)我将更新问题以包含此信息您还可以查看包含在sol对象中的内部采样点。在一些示例中,可能会出现一个接近4的事件,但是由于步长应该相当大,因此这应该是一个低概率事件。我感谢您深思熟虑的回答。我已经考虑过这一点,但我不确定我是否完全理解。然而,我将阐述我能理解的:如果events函数的根有多个交叉点,那么这是否意味着我需要奇数个事件来满足value(t=0)>0和value(t=t_end)<0?此外,在这种情况下,施加方向约束不应该导致单个事件吗?我检查了后一个想法,设置direction=-1并不能解决这个问题。如果插值多项式完全连续地拟合在一起,就会出现这种情况。我不知道到底发生了什么,但我认为由于浮点错误,会有间隙。但要想知道到底发生了什么,就必须尽可能深入挖掘中介结果和代码。我们可以从接近根的位置绘制解开始,使用
sol
的求值来获得插值多项式的值。我感谢您深思熟虑的回答。我已经考虑过这一点,但我不确定我是否完全理解。然而,我将阐述我能理解的:如果events函数的根有多个交叉点,那么这是否意味着我需要奇数个事件来满足value(t=0)>0和value(t=t_end)<0?此外,在这种情况下,施加方向约束不应该导致单个事件吗?我检查了后一个想法,设置direction=-1并不能解决这个问题。如果插值多项式可以