我遇到的问题是必须计算事件函数中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)
函数中引入任何新的不连续性。
感谢您的帮助!