How can I use a probability distribution object in a Stateflow chart?
6 views (last 30 days)
I'm trying to use a probability distribution object (from the function U = makedist('exp',...)) to model stochastic transitions between states in Stateflow, but I can't get it to work. In my chart I'm using the temporal logic after(u,sec), for which I want the argument u to be a number generated by the probability distribution object, U. I've tried to use u = random(U) but after(u,sec) gives me an error complaining about:
"Cannot perform an implicit cast between these two classes.
Even though u is declared as a double in my chart and the function after() takes a double as first argument.
Does anyone have any experience from a similar problem or know if it's possible? The goal with my little project is to be able to model situations where different transitions between states may take different times according to different distributions.
Andreas Apostolatos on 28 Sep 2021
Firstly please note that Simulink is under the hood generating and compiling code when you build and run a model. The Coder products do not support Code Generation for every MATLAB function. In particular, function 'makedist()' is not supported for Code Generation, otherwise this should be explicitly mentioned in the corresponding documentation page under the Section "Extended Capabilities", see the following documentation page accordingly,
If you do not need to generate standalone C/C++ code from your model, then you can use identifier 'persistent' for the probability distribution object in your state, so that the variable persists when the state goes out of scope and it is not recreated after entering the state again, and subsequently declare function 'makedist()' as 'coder.extrinsic()', such that Simulink does not generate code from this function, see also the following documentation pages accordingly,
Thus, the MATLAB code inside your Stateflow state could looks as follows,
U = makedist('exp');
u = zeros(1, 1);
u = random(U);
Please note that I define variable 'u' to hold a zero value, before assigning to it the random number using function 'random()'. The reason is that Simulink does not know which type it should assign to this variable when compiling the MATLAB code, and in this way you can make sure that Simulink knows its type.
Afterwards you should be able to use variable 'u' within function 'after()' on a state transition, such as,
I hope that this information is useful for your application.