How to use "poissrnd" function?

Hello!
I'm trying to use "poissrnd" function in order to generate an arrival of task each minute. But i use a time frame in second.
lambda = 4;
v = poissrnd(lambda, 1, 3600);
with this command , i get an arrival each second, but i want the result "task/ min"
T=3600 and taux =1 s
lambda = 4 task/ min
i will be grateful if you could find me a solution! Thank you in advance

Respuestas (1)

Torsten
Torsten el 4 de Oct. de 2022
Editada: Torsten el 5 de Oct. de 2022
lambda = 4
What is the unit of lambda ? Mean number of arrivals per minute ?
And you want to get a random vector for arrivals in each second ?
Note that the "3600" in the line
v = poissrnd(lambda, 1, 3600);
has nothing to do with time units (seconds in this case). It's only the number of random values "poissrnd" should return.

25 comentarios

Maria
Maria el 4 de Oct. de 2022
@Torsten i want to get a random vector that's why i used "poissrnd" function. the time unit is in second but i want to get arrival task each 60s not each second : lambda =4 tasks/60seconds.
Torsten
Torsten el 4 de Oct. de 2022
Editada: Torsten el 4 de Oct. de 2022
But if lambda= 4 tasks/min, you get random number of arrivals within each minute.
Or do I misunderstand something ?
lambda = 4;
v = poissrnd(lambda,10,1)
v = 10×1
4 2 5 4 8 3 9 1 5 4
For the first minute, you get 4 arrivals. For the next minute, you get 2 arrivals. And so on.
Maria
Maria el 4 de Oct. de 2022
@Torsten i don't know if the sum is a good solution. i have do an arrival of task in each second but i though it is not logical solution. i need something more realistic so i have to change the arrival tasks each 60 second but saving the same period T=3600s.
this is my first result : with lambda=1/10 task/second, now i want to change lambda in each 60 second.
0 1 0 1 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 1 0 0 0
Maria
Maria el 4 de Oct. de 2022
Editada: Maria el 4 de Oct. de 2022
@Torsten i want to see value of those arrivals but each 60 second, for example 4 arrivals in the first time slot and the 2 arrivals after 60 time slot ,etc,..(time slot =1s)
Torsten
Torsten el 4 de Oct. de 2022
Editada: Torsten el 4 de Oct. de 2022
this is my first result : with lambda=1/10 task/second, now i want to change lambda in each 60 second.
Here you get numbers of random arrivals for the next 10 seconds:
lambda = 0.1;
v = poissrnd(lambda,10,1).'
v = 1×10
0 0 0 0 0 0 0 1 0 0
Here you get numbers of random arrivals for the next 10 minutes:
lambda = 0.1*60;
v = poissrnd(lambda,10,1).'
v = 1×10
11 5 12 7 5 9 4 4 6 5
If you want to compare both, you have to generate 10*60 random arrivals for lambda = 0.1 and sum every 60 values of the vector v. Both methods simulate the same process:
lambda = 0.1;
v = poissrnd(lambda,10*60,1);
for i=1:10
w(i) = sum(v((i-1)*60+1:60*i));
end
w
w = 1×10
4 4 3 4 4 3 6 5 5 6
Maria
Maria el 4 de Oct. de 2022
Editada: Maria el 4 de Oct. de 2022
@Torsten it seems that i can't explain the problem.
the row vector v should be equal to the period T, it means i will have 3600 columns, after each 60 columns i have a value.
for example
v[1 0 0 0........................................2 0 0 0.............................................5 0 0..................7 0 0......................]
this is v contains 3600 columns, the "1" is the arrival in the first instant t=1s
the "2" is the arrival after "60s"
the "5" is the arrival after "120s "
the "7" is the arrival after "180s" etc....
between this range the value was "0".
the arrival it may be "0" also.
Torsten
Torsten el 4 de Oct. de 2022
Editada: Torsten el 4 de Oct. de 2022
And what is the meaning of the 0's in between ? I can't make sense of it.
If the rate is 0.1 tasks/sec, then the 2,5,7 ... can be generated as
lambda = 0.1*60;
v = poissrnd(lambda,10,1);
v = cumsum(v)
v = 10×1
3 9 12 19 26 33 40 46 50 56
This gives you a random vector of arrivals within the first minute, the first 2 minutes, the first 3 minutes,...,the first 10 minutes.
Maria
Maria el 4 de Oct. de 2022
Editada: Maria el 4 de Oct. de 2022
@Torsten because the arrival of tasks each 60 second so the interval between two 60s should get "0".
for example if i change to minutes , in each minute i have an arrival of task so the vector v will display values from column 1 to column 60.
but now i want to see the time in second, so every 60 second i will have a value. and the rest are zeros.
Torsten
Torsten el 4 de Oct. de 2022
because the arrival of tasks each 60 second so the interval between two 60s should get "0".
That's wrong. The arrivals happen within the time span of 60 seconds, not every 60 seconds.
Maria
Maria el 4 de Oct. de 2022
@Torsten i will explain you by this example,
i put lambda=3 task/min
Period is 60 min , each column is 1 min
i get this V(1,60)
v [2 2 4 1 4 2 2 2 1 2 4 2 3 2 3 1 3 3 6 4 1 3 4 2 6 1 4 2 4 4 4 1 2 4 1 4 5 3 5 2 0 2 3 2 2 2 2 3 2 7 1 0 7 3 1 3 1 5 3 2]
now i want to save the same concept but when i change the time in second,
Period will be 3600s , each column is 1 sec, and lambda will be 3 task/60s.
so v will get values each 60 second.
if i can use any function to separate values with "0" and get 3600 columns ,no problem.
Torsten
Torsten el 4 de Oct. de 2022
Editada: Torsten el 4 de Oct. de 2022
I understand your point, but it's against the concept.
The v you obtain has not '0''s in between because the idea is that people not only arrive after 60 seconds, but every second. Thus an equivalent v for arrivals every second would be
lambda = 3/60;
v = poissrnd(lambda,1,3600)
v = 1×3600
0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Maria
Maria el 4 de Oct. de 2022
@Torsten as i know , we can fix the parametre lambda , the number of arrival task/ time slot , and we fix the time slot we need. this is why i choose to fix the time at 60 time slot, it means the event will product every 60 seconds.
Maria
Maria el 4 de Oct. de 2022
@Torsten if i want to separate values i mentioned in vector v with 0 , it means i generate new vector between two values i put 59 "0"; in order to get vector with 3600 columns. How can i do this?
Torsten
Torsten el 4 de Oct. de 2022
Editada: Torsten el 4 de Oct. de 2022
v = [v;zeros(59,60)];
v = (v(:)).'
Maria
Maria el 4 de Oct. de 2022
@Torsten this code display the value in the next column, it is not exact in 60 column.
i have change
v = [v;zeros(58,60)];
in this case the number of columns reduce , i will have 3540 columns instead of 3600.
Torsten
Torsten el 4 de Oct. de 2022
Editada: Torsten el 4 de Oct. de 2022
You start with a value at position 1, put 59 zeros. Then you are at position 60 with the last zero. The next value will be at position 61 and you put 59 zeros. You arrive at position 120. The next value will be at position 121 ...
v = rand(1,60);
v = [v;zeros(59,60)];
v = (v(:)).';
size(v)
ans = 1×2
1 3600
Torsten
Torsten el 4 de Oct. de 2022
Editada: Torsten el 4 de Oct. de 2022
And where do you want the first value ? In position 0 which does not exist ?
Maria
Maria el 4 de Oct. de 2022
@Torsten the first value in position 1, the next value in position 60.
it is possible to create a vector A=zeros(1,58) , and each time i add it between two columns
Torsten
Torsten el 4 de Oct. de 2022
Editada: Torsten el 4 de Oct. de 2022
And where is the third value ? If it were at position 119, it would be consistent because 60 - 1 = 119 - 60. If it were in position 120, the distance between second and first (59) compared to the distance between third and second (60) would be different.
But it's possible:
v = rand(1,60);
m = zeros(1,3600);
m(1) = v(1);
m((1:59)*60) = v(2:60);
Torsten
Torsten el 4 de Oct. de 2022
Editada: Torsten el 4 de Oct. de 2022
Yes, usually, but between the first and the second value, there are 58 zeros.
And after the last value, there follow 60 zeros until 3600 is reached. Or you put an end value in position 3600.
Maria
Maria el 4 de Oct. de 2022
Editada: Maria el 4 de Oct. de 2022
@Torsten why i don't get the result until 3600 columns?
the code is just gave me the result for 180 columns !! should i repeat the same line or what?
Torsten
Torsten el 4 de Oct. de 2022
Editada: Torsten el 4 de Oct. de 2022
The code
v = rand(1,60);
m = zeros(1,3600);
m(1) = v(1);
m((1:59)*60) = v(2:60);
writes v(1) in m(1), v(2) in m(60), v(3) in m(120), ..., v(60) in m(3540) as you wanted.
All other values of m are zeros.
Maria
Maria el 4 de Oct. de 2022
@Torsten just the last value i didn't find it , the value in position 3600
Torsten
Torsten el 4 de Oct. de 2022
Editada: Torsten el 4 de Oct. de 2022
You already used all 60 for the other positions.
If you want a value at position 3600, v must be of size 61:
v = rand(1,61);
m = zeros(1,3600);
m(1) = v(1);
m((1:60)*60) = v(2:61);
All this confusion is unnecessary. The usual way is to put values at positions 1, 61, 121, ..., 3541. Then the distance between the non-zero elements is the same throughout the vector (60) and v has the usual size 1x60.
Maria
Maria el 5 de Oct. de 2022
@Torsten okay! i really appreciate your effort ant time, thank you for your help

Iniciar sesión para comentar.

Etiquetas

Preguntada:

el 4 de Oct. de 2022

Editada:

el 5 de Oct. de 2022

Community Treasure Hunt

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

Start Hunting!

Translated by