매트랩 ODE 이벤트 함수(Event function)

OpenJR·2022년 4월 18일
0

매트랩 ODE에서 사용되는 옵션 중 하나, 이벤트에 대해 설명드리겠습니다.
이벤트 함수는 내가 특정한 조건에서 ODE계산을 멈추고 싶을 때 사용되는 기능입니다.
매트랩 예제에서 사용되는 공튀기기(ballode)를 생각하시면 이벤트 함수가 언제 사용되어야 하는지 이해하기 용이합니다.

공을 하늘로 던지면 중력에 의해 아래로 떨어지게 되고 언젠간 땅에 떨어지게 됩니다.

h= h0+v0t12gt2h=\ h_0+v_0t-\frac{1}{2}gt^2

와 같이 간단한 다항식으로 이뤄져 굳이 ODE를 사용하지 않아도 되긴 하지만,,, 이해를 도우기 위해 이것을 ODE 형태로 변경하게 되면

function dydt = f(t,y)
dydt = [y(2); -9.8];

위 코드로 공의 위치와 속도를

[t,y] = ode45(@f,[시작시간 종료시간], 초기값)

이렇게 구할수 있게 됩니다.

자, 여기서 이제 문제가 생깁니다. 위 코드로는 저희는 공의 시간에 따른 공의 위치와 속도만 알 뿐, 입력한 종료시간에 따라 공은 무한히 떨어지게 될 것 입니다.

그렇다면 코드가 바닥을 어떻게 인식시킬 수 있을까요?
이러한 경우에 이벤트 함수를 사용하게 됩니다. 공이 바닥에 떨어진다는 것은 공의 수직 위치가 0이 된다는 것임으로 y=0일때 ode를 끝내주면 되는 것 입니다.

function [value,isterminal,direction] = events(t,y)

value = y(1);     % detect height = 0
isterminal = 1;   % stop the integration
direction = -1;   % negative direction

value 값은 0이 되어야 하는 값을 넣어 줍니다. 여기서는 공의 위치가 0일 때 이벤트 함수가 활성화 되야 하므로 y(1) 값을 넣어주게 되는 것입니다. 만약 지상 5미터에서 멈추게 하고 싶다 하면 y(1)-5를 넣어주면 되는 것이죠.

isterminal 값은 ode를 멈출지 안 멈출지 결정하는 값으로 1이 들어가면 멈추고 0이면 ode가 계속 진행되게 됩니다. 이 부분들을 많이들 헷갈리실거 같습니다. 예를 들어, isterminal 값이 0이면 value 값이 0이 되더라고 ODE는 멈추지 않습니다. 즉, 일종의 조건을 설정해주는 부분입니다. 지금의 예시는 공튀기기여서 이부분이 크게 중요하지않지만 나중에 복잡한 조건을 설정하신다면 꼭 건드려주셔야 하는 부분입니다.

direction은 0에 어떻게 수렴할지 결정하는 값입니다. 예를 들어 -1이들어가면 양수에서 0으로 될때 멈추게 되고, +1이면 음수에서 0이 될 때 멈추게 되고, 0 이라면 모든 방향에서 0이 될 때 멈추게 됩니다.

자 그럼 코드를 아래와 같이 짜면

tstart = 0;
tfinal = 30;
y0 = [0; 20];
options = odeset('Events',@events);
[t,y] = ode45(@f,tstart:0.1:tfinal,y0,options);
plot(t,y)
function dydt = f(t,y)
dydt = [y(2); -9.8];
end
% --------------------------------------------------------------------------

function [value,isterminal,direction] = events(t,y)
value = y(1);     % detect height = 0
isterminal = 1;   % stop the integration
direction = -1;   % negative direction
end


그림과 같이 공이 땅에 떨어질때 ode가 멈추는 것을 보실수 있습니다.
자세한 코드는 매트랩 명령창에서 open ballode를 치시면 보실수 있고 ballode를 실행하시면 아래의 그림을 보실수 있습니다.

profile
Jacob

0개의 댓글