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!
2 个评论
Walter Roberson
2024-1-15
Do you have 10 timesteps, or is your starting time 0 and your ending time 10 which is 11 time steps?
采纳的回答
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;
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Simulink Functions 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!