在事件函数

时间:2017-07-11 19:24:54

标签: matlab ode

我遇到的问题是必须计算事件函数中ode45生成的解决方案的衍生(实时)。

解释我的意思的一些伪代码是,

function dx = myfunc(t,x,xevent,ie)
persistent xs
persistent dx2
% xevent is the solution at the event
if isempty(dx2) == 1
dx2 = 0;
end
k = sign(dx2*x(1));
if ie(end) == 1
xs = xevent
elseif ie(end) == 2
xs = xevent
end
dx(1) = x(2);
dx(2) = function of k,x(1),x(2), and xs;
dx2 = dx(2);
end


function [value,isterminal,direction] = myeventfcn(t,x)
% dx2 = some function of x
if dx2*x(1)>=0
position = [dx2*x(1); dx2*x(1)];
isterminal = [1; 1];
direction = [1 ; -1 ];
elseif dx2*x(1)<0
position = [dx2*x(1); dx2*x(1)];
isterminal = [1; 1];
direction = [-1 ; 1 ];
end

我知道如果我不需要在myfunc内的活动中使用该解决方案,我可以在我的事件函数中计算dx=myfunc(t,x)并使用dx(2),但是从{{1}开始1}}在xevent内使用我无法输入myfunc

我知道在事件函数中有一种输入常量参数的方法,但由于它是事件位置的解决方案,也会发生变化,我不知道如何去做。

我的工作是使用解决方案xevent来估算dx(2)。我想知道的是,如果在这里使用有限差分近似值是令人满意的,使用相对于步长θ45的小固定步长,这是一个可变步长。

作为一个注释,我x分隔myeventfcn语句的原因是要知道事件的方向是什么,因为它将在if内更新。

此外,我需要使用上一个成功时间步骤的myfunc,这就是为什么我将dx(2)定义为持久变量的原因。我相信让dx2可以做,因为我的事件取决于k=sign(dx(2)*x(1)),因此我不会在dx(2)*x(1)函数中引入任何新的不连续性。

感谢您的帮助!

0 个答案:

没有答案