检测事件
matlab微分方程如何设定变量的范围
如
dy1=y2
dy2=y1+1
其中y1的范围为0
【解】
M文件:
function [value,isterminal,direction] = events1(t,y)
value = y(1)-4;
isterminal= 1;
direction = 0;
命令窗口:
dy = @(t,y) [y(2);y(1) + 1];
options=odeset('events',@events1);
[t,y] = ode45(dy,[0 12],[0 1],options);
plot(t,y)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%function [value,isterminal,direction]=events(t,x)
% 事件检查函数,此时需要做的是过零点检测
% ode45函数自动检查当value=0是否成立
% 如果我们要求检测Y=0的点,设置value=Y
% 这里我们要检测Y=4,那么就设置value=Y-4
% isterminal检测到指定条件时,是否终止ode45函数的运行
% 1表示终止,0表示继续
% 在我们这个问题上,我们只要检测到零点时就停止程序
% direction:value过零点检测的方向
% -1表示由正到负,+1表示由负到正
% 对于我们这个问题,当然是由正到负
在不知道结果时间的时候是需要先设定一个比较大的时间范围计算的
但是并不需要将整个范围的结果都算出来再插值
这个时候可以设定触发事件函数在一定条件下停止计算
用odeset可以为ode45求解器设定触发事件的函数
详细的用法要仔细查看matlab的帮助文件,这里我以你的题目,举个例子
微分方程还是用你的函数fun
在用ode45解方程之前,再写一个函数:事件触发函数eventfun,
它的格式固定要返回三个值,这三个值的意思是
当第一个值vaule的值到达0时,时间会触发
而根据第二个值isterminal设置,触发时间会否终止求解
第三个值是设置触发过0的方向
function [value,isterminal,direction] = eventfun(t,x)
value=x(1)-100; %触发时间,当其值为0的时候,时间会触发
isterminal=1; %设为1时会,触发时间会停止求解器,设0时触发不影响工作
direction=1; %触发方向设1时是上升触发,设-1是下降触发,设0是双向触发
end
写好fun和eventfun之后,你就可以调用ode45解方程了
但用ode45之前记得先用odeset,将触发函数加入哦
op=odeset('Events',@eventfun);
[T,X,Tend,Xend,evennum]=ode45(@fun,[0,15],[0 0],op);
这样你看看,到达100米时,求解器就停住了
细心的你注意,ode45多返回了Tend,Xend,evennum三个参数
第一个Tend是触发事件发生的时间
第二个Xend是触发时间发生时刻的X
第三个evenum是标识触发事件的编号
由于这里只设置了一个触发事件,所以编号肯定是1
其实你也可以将该时间isterminal设为0
那么求解器不会因为触发事件而停止15秒内的解都会算出
你仍旧可以根据Tend 和 Xend得到到达100米时的时间和状态
额外提示,有时候你不知道到底取多大的时间范围才能够等到你要的触发时间
那么你可以用循环判断的方法,先设一个时间范围,然后求解
到最后都没有等到触发事件(Tend和Xend都是空矩阵)
那么适当延长求解时间区间,将上次的最后时刻和状态作为初始状态
再一次求解时间范围更大的解,如此直到找到触发事件才停止。
领取专属 10元无门槛券
私享最新 技术干货