首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MATLAB中ode求解器的事件(Event)属性

??

检测事件

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都是空矩阵)

那么适当延长求解时间区间,将上次的最后时刻和状态作为初始状态

再一次求解时间范围更大的解,如此直到找到触发事件才停止。

?

?

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210321A09GEO00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com