ODE45, simple events

44 ビュー (過去 30 日間)
Stevon Kline
Stevon Kline 2019 年 10 月 29 日
コメント済み: Stevon Kline 2019 年 10 月 29 日
I'm trying to understand 'Events" and how to trigger them. But I'm not quite understanding how it works because my graph still runs past y = 0, and when I output the [t,y,te,ye,ie], I get empty sets. When I change check to = (y>=0), I get some negative number for ye.
h = 1000;
g = 9.8;
k = 1/10;
y0 = h;
t0 = 0; tfinal = 30;
tspan = [t0,tfinal];
options = odeset('Events',@landing);
v = @(t,y) -g*t;
ode45(v,tspan,y0,options);
function [check,stop,direction]=landing(t,y)
check = (y~=0);
stop = 1;
direction=0;
end
If somebody help me with what I'm missing. Thanks. I'd like the the integration to stop when it hits the ground. (ignore unused variables, I actually have to add drag force to this equation with k but I'm trying to learn the basics first).

採用された回答

Steven Lord
Steven Lord 2019 年 10 月 29 日
check = (y~=0);
You don't want to check only for y actually touching the ground. If the ODE solver were to evaluate your function at time t = 1 (when your projectile is above ground level) and t = 2 (when your projectile is under ground level) but not t = 1.6 (when it exactly reached the ground) this events function would not detect the landing.
The ballode example has an events function you can use for this purpose. In fact, that example seems pretty similar to the problem you're trying to solve. You can open that example in the Editor and take a look at its events function.
You don't want your events function to return a logical value, you want it to return the height above ground and let MATLAB stop the solver when that height crosses zero (landing.)
  1 件のコメント
Stevon Kline
Stevon Kline 2019 年 10 月 29 日
Thanks, so I'm stilling getting a negative value. So that just means I need to increase the step value of of tspan to get the exact point t, when it crosses zero. Because its close, but still getting a negative value, a very small one.

サインインしてコメントする。

その他の回答 (1 件)

Alex Mcaulley
Alex Mcaulley 2019 年 10 月 29 日
function [check,stop,direction]=landing(t,y)
check = y;
stop = 1;
direction=0;
end
  1 件のコメント
Stevon Kline
Stevon Kline 2019 年 10 月 29 日
Thank you.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeOrdinary Differential Equations についてさらに検索

タグ

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by