我想两个方面的限制运动方程的我ODE45计算:位置和时间。 我已经得到了时间的事件工作,但我不知道我是否以及如何限制位置添加其他事件。 编辑:我也有一个ODE方程耦合在一起的许多不同的颗粒和需要,一旦他们达到一个“屋顶”,因为他们所有的旅行以不同的速度......我会能够通过事件来实现这一目标他们单独停下来? 我有我会怎么做这一点,但它非常复杂的一个想法,可能会很慢...
Answer 1:
我不知道如果你能做到你想要什么,但有可能做了很多的事件。 首先,这听起来像某种数值计算的第一通过时间 (又名第一击中时间)。 如果这些“颗粒”是随机的,停下来,不要用ode45
而是适合随机微分方程AA方法。
据我所知,你能有多少事件功能没有任何限制 - 或者更确切地说,事件功能(类似于您的ODE功能尺寸)的尺寸 - 和他们的人数是不依赖于你有多少ODE方程。 事件功能接收两个当前时间和当前状态矢量。 您可以在任何或所有这些的元素来创建每个事件。 你是正确的,更多的活动功能和更复杂的事件将减缓整合。 性能还取决于如何经常检测到的事件。 如果您的每一个粒子到达“屋顶”,正如你所说的,并触发只是一个单一的事件则不会太差。
在实施中,这里基于Matlab的一个简单的例子来说ballode
例如,模拟垂直独自ñ弹道颗粒。 有N个非终止事件,因为它通过Y = 0加到一个额外的终止事件,以检查是否所有的颗粒具有通过y = 0的过去(如果我们知道哪个粒子此搭上每个粒子的时间和速度会是这样,因为我们在这里做,我们只能作出这样的事件终止一个)。
function eventsdemo
% Initial conditions for n balls
n = 10;
y0(2*n,1) = 0;
y0(n+1:end) = linspace(20,40,n);
% Specify events function
options = odeset('Events',@(t,y)efun(t,y,n));
% Integrate
[t,y,te,ye,ie] = ode45(@(t,y)f(t,y,n),[0 10],y0,options);
figure;
plot(t,y(:,1:n),'b',te(1:n),ye(sub2ind(size(ye),ie(1:n),(1:n).')),'r.');
function dydt = f(t,y,n)
% Differential equations for ballistic motion
dydt = [y(n+1:end);zeros(n,1)-9.8];
function [value,isterminal,direction] = efun(t,y,n)
% Last event checks that all balls have hit ground and terminates integration
yn = y(1:n);
value = [yn;all(yn < 0)];
zn = zeros(n,1);
isterminal = [zn;1];
direction = [zn-1;1];
在某些方面,这是效率会低一点,因为我们一直在模仿甚至在有的已经到y传递= 0。然而,这是简单的输出数组是矩形的,而不是衣衫褴褛的所有N系统。
我不清楚你的意思恰恰是“连接在一起”,并需要颗粒“停止”。 如果你需要做的不仅仅是记录事件数据,如更改系统参数或以其他方式改变差分方程(组),那么你就需要在每次事件之后终止,并重新启动整合。 看看ballode
例子(类型edit ballode
在Matlab命令窗口)看到一些建议,以使这一点更有效。
文章来源: MATLAB: Is it possible to have two event values whilst using ode45?