Persistent variables counting differently than integrator

3 次查看(过去 30 天)
Hello,
I am working with the MATLAB Function block in Simulink to model tank levels through persistent variables. My Code is basically looking like the following:
function y = fcn(u)
persistent total_u
if isempty(total_u)
total_u = 0;
end
total_u = total_u + u;
y = total_u;
Now I noticed some values for my MATLAB functions not adding up. The following shows a MATLAB function with the above code and comparing it to an integrator with the simulation having a stop time of 10 and a variable step size.
I basically need to achieve a result using my MATLAB functions like the integrator gives, so that each value per second is counted up once per second. I cant explain myself how the MATLAB function is counting up to 56. Im guessing it has something to do with the step size and how often Functions are called but I am hoping somebody can explain this more detailed to me.
If I switch in this little example to a fixed step size of 1 with a stop time of 10 seconds i get the following result:
This already looks better but i still cant explain myself how the MATLAB function counts to 11 even tho I only have 10 Timesteps and an initial value of total_u = 0;
I hope this explains my problem well enough. Thank you already for any answers!

采纳的回答

Fangjun Jiang
Fangjun Jiang 2024-1-16
编辑:Fangjun Jiang 2024-1-16
The MATLAB Function block is executed at every simulation step. The counting algorithm does not give a weight to the time elasped thus the output is dependent on how many times it is executed. Log the simulation time vector, also log the value of y at every time step. Compare the value at each time step or simply plot(t,y), you will see the issue clearly.
To explain the second instance where y ends at 11, it is due to the fact that the value of y, at t=0, is y=1, because at t=0, the whole model or the whole dynamic equation still needs to be held true. Thus, the function is evaluated, the value of u (Constant 1) is propagated, and it yields y=1.
To make y=0 at t=0, just make a simple change as below. The end value of y in the second instance will be 10, matching the output of the integrator.
function y = fcn(u)
persistent total_u
if isempty(total_u)
total_u = 0;
else
total_u = total_u + u;
end
y = total_u;
  1 个评论
Nurk
Nurk 2024-1-16
Thank you for the explanation! I fixed it now by switching to a fixed stepsize of 1 and now my persistent variables give te same count as the integrator block.

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Simulink Functions 的更多信息

产品


版本

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by