Conditionally execute a function inside a vector field while integrating with an ODE solver

I am integrating some equations that represent an astrodynamics problem. They are defined by a vector field such as:
where x are the states (e.g. position, velocity, mass...). The dynamics that I'm integrating are fed by a control u, that is computed based on the states and time: . This control u is computed inside the vector field, which we could explicitely state as . I am integrating with an ODE solver (e.g. ode45()), and thus the solver computes the control at every time step.
Now, what I want is to avoid computing the control at every time step, but rather only at certain times, with a given frequency (e.g. let's say I want to compute the control at 0.1 Hz, every 10s). How would you recommend me to approach this?
I hope I was clear enough. Thank you for any help.

답변 (1개)

Try to pass your condition inside ode function
An example
function dy = func1(t,x)
tset = [10 20 30];
if any(abs(t-tset)>0.05)
u = x(1)*t-1;
end
% dy function ...
end
function main
[t,y] = ode45(func1,tspan,x0);
plot(t,y)
end

댓글 수: 2

Thanks @darova, seems a feasible option! Will keep the answer opened to see if someone else contributes to the brainstorming.
PS: shouldn't the "any()" expression have a < instead?
if any(abs(t-tset)<0.05)
...
end
will execute the control if we are close to a pre-scribed epoch with a resolution of 0.05s.
  • will execute the control if we are close to a pre-scribed epoch with a resolution of 0.05s.
You are right, my bad

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

카테고리

도움말 센터File Exchange에서 Programming에 대해 자세히 알아보기

제품

릴리스

R2019b

질문:

2021년 6월 4일

댓글:

2021년 6월 7일

Community Treasure Hunt

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

Start Hunting!

Translated by