You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:22:27