0

在我的教科书中,我遇到了一个在为 ODE 系统指定事件位置时应该使用的函数示例。函数示例如下:

function [value, isterminal, dircn] = proj(t,z,flag);
g = 9.81;
if nargin < 3 | isempty(flag)
    value = [z(2); 0; z(4); -g];
else
    switch flag
        case 'events'
            value = z(3);
            isterminal = 1;
            dircn = -1;
        otherwise
            error('function not programmed for this event');
    end
end

这里有一部分逻辑我不明白。假设我激活了“事件”选项,然后运行 ​​ode45。那么,ode45 如何实际读取方程组(在上述函数中指定为value = [z(2); 0; z(4); -g];)?当然,在指定 tspan 和初始条件之后,我已经基于上述函数运行了 ode45,它就像一个魅力。但是我不明白 ode45 仅在上面脚本的“if”部分中出现时如何正确读取系统。

如果有人能解释这里的逻辑,我将不胜感激!

4

3 回答 3

1

答案在if命令中:

if nargin < 3 | isempty(flag)
    value = [z(2); 0; z(4); -g];
else

如果参数个数小于 3 或 variableflag为空,则将 variable 设置value[z(2); 0; z(4); -g]。否则,如果 variableflag'events',则设置 variablevaluez(3),当flagis not时'events',报错。所以这个函数总是为变量分配一些返回值,或者使用命令value报告错误。error

于 2012-05-15T22:40:45.330 回答
1

好吧,我想我可以解释一些部分。正如我在上面所写的,奇怪的是维度的value变化。

给定您的状态空间和变量的名称,它看起来像二维运动。

在没有标志的情况下,状态空间似乎是:

  1. 水平位置 (x)
  2. 水平速度 (vx)
  3. 垂直位置 (y)
  4. 垂直速度(vy)

更正 ode 似乎可以'events'在您指定它们时发送。所以你的函数输出状态空间的第三个分量。看看这个网站解释它: http: //www.mathworks.de/help/techdoc/math/f1-662913.html

除非您事先指定,否则 ode 无法发送'events'到函数,因此不会调用此部分。

但是你的函数无论如何都不起作用 - 因为导数需要与状态空间(4x1)具有相同的维度。但只有 1x1。

但是我真的不知道您所说的“指定活动地点”是什么意思。也许秘密就藏在那里。

有了一些创造力,我认为您可以使用该函数来提取状态空间的第三个分量。

于 2012-05-16T08:49:37.943 回答
0

在编写完上面的函数后,我可以补充更多关于我们如何进行的信息。然后我们定义,说:

tspan = [0 6];
z0 = [0, 5*cos(pi/4), 0, 5*sin(pi/4)];
options = odeset('events','on');
[t y] = ode42('proj',tspan,z0,options)

通过编写此代码,输出为 5 列,其中 1 列,tspan每个 z 值(z(1)z(2)和)各 1 列。当达到零时,计算将因“事件”发生而终止。z(3)z(4)z(3)

另一方面,如果我不包括该options = odeset('events','on')行,则只需编写:

[t y] = ode42('proj',tspan,z0)

对整个tspan范围执行计算。

然而,当我们激活“事件”时,我仍然看不到如何ode42计算所有输出向量,因为我认为 MatLab 应该只在“proj”函数中执行“else”语句是合乎逻辑的。并且在这部分函数中,不包括微分方程的实际系统。

于 2012-05-16T11:05:44.443 回答