Display output of ODE45 after error

조회 수: 5 (최근 30일)
Telema Harry
Telema Harry 2021년 7월 1일
댓글: Telema Harry 2021년 7월 2일
Hello Programmers,
I have a model that predicts the altitude (Z) of a UAV.
The model is a sets of ODE and I solved it using ODE45.
The issue is that the UAV altitude (Z) decreases to a negative value and the program terminate as Z cannot be negative.
If Z = 0, it means that the UAV is on the surface of the earth.
Instead of giving error when Z is negative. I will like to display a message that "The object has successfully landed at location, Longitude = .. and Latitude = " and return the output of ODE45. So, I can plot all the output variables.
Please I will appreciate any help.
Thank you.

답변 (2개)

Amit Bhowmick
Amit Bhowmick 2021년 7월 1일
I dont know your equation but you can use similar trick
tspan = [0 5];
y0 = 20;
[t,y] = ode45(@fun, tspan, y0);
plot(t,y,'-o')
function dydt=fun(t,y)
if(y<=0)
dydt=0;
else
dydt=-2*t;
end
end
  댓글 수: 8
Amit Bhowmick
Amit Bhowmick 2021년 7월 1일
Please follow the quote "I dont know your equation but you can use similar trick" hence i did not write the code for UAV rather it's a free fall case where a particle can not go below the ground i.e. negetive y.
at the zero point after colison the velocity will be governed by two factor,
  1. the value of coefficient of restitution(e) and 2. Velocity before colision
And the equation mentioned correctly represents the case of plastic colision e=0. also there will be discontinuity in y as well as dydt (downward and upward velocities ) which suggest modification of function is required (since at y=0 the velocities exist one before colison and other after colision). Hence ode45 will keep producing results coinsidering velocity -2t such that particle moves below the ground. Therefore one need to modify the function with two values at ground so that ode45 can produce correct results.
For UAV landing there must be a deaceleration by some sort jet to neutralize the affect of gravity and accordingly ode should be governed for perfect landing. However, in an actual case the perfect landing never possible there have to be some sort of colision at the ground. If your equation is not fit enought to consider the colision then it will go below the ground.
Telema Harry
Telema Harry 2021년 7월 2일
Thank you for the contribution. But my model is slightly different

댓글을 달려면 로그인하십시오.


Walter Roberson
Walter Roberson 2021년 7월 1일
편집: Walter Roberson 2021년 7월 1일
You should use an event function to terminate integration. See the ballode example.
Note that in order to be able to detect height being a particular value, you would probably need to have height be one of the boundary conditions. You might not need its integral on output, but you need it for the steering calculations. For example, the UAV is going to make different decisions about how much lift it needs to generate if the UAV is 50m off the ground than if the UAV is 50cm off the ground.
  댓글 수: 8
Jan
Jan 2021년 7월 2일
Use the debugger for investigations:
dbstop if error
Then run your code again. When Matlab stops at the error, check the contents of "eventFcn".
I guess boldly, that the problem is caused as side-effect by providing the function to be integrated by its name instead of a function handle. This notation is outdated for over 20 years, so change:
[t,output] = ode45('BalloonODE',tspan,In0,options);
to
[t,output] = ode45(@BalloonODE,tspan,In0,options);
Telema Harry
Telema Harry 2021년 7월 2일
woooow. thank you so much @JanJan. The code now runs without the error.
However, I have not been able to get my desired result. The Z is still decreasing below 0 and P_air can only be calculated when Z > 0. So the program terminates.
Thank you for the help.
options = odeset('Events',@stopevents);
In0 = [lat_0; lon_0; T_gas_0; T_film_0; M_gas_0; Uz_0; Z_0]';
[t,output] = ode45(@BalloonODE,tspan,In0,options);
function [value,isterminal,direction] = stopevents(t,y)
% Locate the time when height passes through zero in a decreasing direction
% and stop integration.
value = y(7); % detect height = 0
isterminal = 1; % stop the integration
direction = -1; % negative direction
end

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 UAV에 대해 자세히 알아보기

제품


릴리스

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by