Matlab ODE事件函数设置双重触发条件的实现方法
修改MATLAB ODE事件触发条件的解决方案
要实现当y(1)+y(2)低于1或高于1e⁵时触发事件并终止求解,你只需要调整eventfunction,利用MATLAB ODE事件支持多条件触发的特性——返回数组形式的value、isterminal和direction即可。
修改后的完整代码
options = odeset('RelTol',1e-11,'Events',@eventfunction); [time,values] = ode45(@Eq,time,x0,options); function [value, isterminal,direction]=eventfunction(~,y) sum_y = y(1) + y(2); % 定义两个事件触发条件: % 1. 当sum_y等于1时触发(对应即将低于1的临界点) % 2. 当sum_y等于1e5时触发(对应即将高于1e5的临界点) value = [sum_y - 1; sum_y - 1e5]; isterminal = [1; 1]; % 两个事件都触发终止求解 % 控制事件触发的方向: % -1:仅当sum_y从大于1降到等于1时触发(向下穿越阈值) % 1:仅当sum_y从小于1e5升到等于1e5时触发(向上穿越阈值) % 若想忽略方向,只要达到阈值就触发,可改为direction = [0; 0] direction = [-1; 1]; end
关键细节解释
value数组:每个元素对应一个事件的触发阈值,当元素值为0时触发事件。这里第一个元素检测sum_y=1,第二个检测sum_y=1e5,分别对应你需要的两个临界条件。isterminal数组:每个元素对应一个事件是否终止求解,1表示触发后停止计算,0表示继续。这里两个事件都设为1,满足任一条件就终止求解。direction数组:用来限定事件触发的方向:-1:仅当sum_y从高于1降到1时触发(也就是即将进入低于1的区间)1:仅当sum_y从低于1e5升到1e5时触发(也就是即将进入高于1e5的区间)- 如果你的需求是只要
sum_y处于低于1或高于1e5的状态就触发(包括初始值就满足的情况),可以把direction改成[0; 0],这样不管数值变化方向,只要达到阈值就触发事件。
额外提示
如果初始状态x0本身就满足y(1)+y(2) <1或>1e5,ODE求解器会在第一步就触发事件并终止。如果需要提前处理这种情况,可以在调用ode45之前先做一次初始值检查。
内容的提问来源于stack exchange,提问作者sam_rox
相关产品推荐
相关产品推荐

