如何在ode45中插入条件if ?

2次查看(最近30天)
西蒙Maucci
西蒙Maucci 2021年2月1日
评论道: 明星黾 2021年2月1日
你好,我想模拟一个漏洞百出的集成火灾模型。我使用的是Ode45,它工作得很好,但我想插入一个If条件,以便当y值小于特定值(-50)时,y必须重置为-65。我不知道如何实现它。有什么建议吗?非常感谢。
x0 = -70;
t0 = 0;
dt = 0.1;
达峰时间= 2;
tvec = t0: dt:最高温度;
(t, x) =数值(@test_ode tvec, x0)
情节(t, x)
函数[dydt] = test_ode (t, y)
dydt = -1/10 * y + 13
结束

接受的答案

明星黾
明星黾 2021年2月1日
试试这个:
x0 = -70;
t0 = 0;
dt = 0.1;
达峰时间= 20;
% tvec = t0: dt:最高温度;
Tvec = [t0 tmax];
选择= odeset (“事件”, @depolEvents);
k = 1:10
[t{k},x{k}]=ode45(@test_ode, tvec, x0, opts);
x0 = -65;
Tvec = [t{k}(end) t{k}(end)+tmax]
% tvec = t{k}(end): dt: t{k}(end)+tmax;
结束
电视=猫(1 t {:});
十五=猫(1,x {:});
数字
情节(电视、十五)
网格
函数[dydt] = test_ode (t, y)
dydt = -1/10 * y + 13;
结束
函数(位置、isterminal方向)= depolEvents (t, y)
Position = y(1) + 50;%我们想要的值为零
isterminal = 1;%停止集成
方向= 1;0可以从任意方向接近
结束
这使用了技术 歌唱活动的位置 停止在循环的下一个增量中重新启动的集成。
如果它不像你写的那样做(因为我可能不完全理解你想做什么),用它来试验一下,得到你想要的结果。
4评论
明星黾
明星黾 2021年2月1日
一如既往,我的荣幸!

登录评论。

答案(1)

史蒂文的主
史蒂文的主 2021年2月1日
不要使用条件句。使用事件函数来检测何时发生条件,停止ODE求解器,使用事件发生时的结果为对求解器的新调用创建初始条件,并在事件发生时调用ODE求解器。
你应该可以使用 ballode 作为你的函数的模型,虽然不是在地面上弹跳一个球,而是在-50“弹跳它”。

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!