Модель парализуемых систем в питоне - PullRequest
0 голосов
/ 30 мая 2018

Как часть более крупной модели, мне нужно иметь пару строк кода, которые могли бы реализовать для меня модель системы Paralazable.

Вся модель находится на детекторе.Этот детектор может записывать сигналы на основе поступающих элементов.Детекторы имеют такую ​​неэффективность, что они могут потерять свою чувствительность в течение определенного периода времени после того, как один элемент ударит его.

В моделях Paralyzable детектор будет мертв, когда элемент ударяет его, даже если он не обнаружил его,Это означает, что определенное число, которое мы имеем как мертвое время, может быть изменено, если другой элемент попадет в детектор за это время, и это добавит к этому другое мертвое время.

Есть ссылка, по которой вы могли бы прочитать немного больше об этой теме: Мертвое время

Я сделал случайную выборку Пуассона, используя numpy как нечто, что могло бы иметьТо же поведение, что и у источника (источник создает элементы на основе распределения Пуассона), тогда из-за того, что детектор может обнаруживать только один элемент за раз, нам нужно заменить все значения более одного на один.

Тогда последний шаг - это основная часть, которая фактически применяет эффект мертвого времени Paralzable, который удаляет значения с расстоянием мертвого времени обнаруженных значений.

import numpy as np
np.random.seed(2)
random_set = np.random.poisson(lam=1, size = 500) #The source is making the elements with Poisson distribution
#lam could be any other value 
d = 2 #dead time, could be any other integers

#Saturation effect
#detector could not detect more than one elements at a time
random_set[random_set>1] = 1

index = 1 
#Paralyzable dead time effect
for i in range(1, (random_set.shape[0])):
    for j in range(index, index + d+1):

        if random_set[j]==1:
            index = j
            random_set[j]=0

Это не делаетлюбые ошибки, но это, конечно, не делает то, что я ищу.Есть ли быстрый способ заставить его работать?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Я придумал этот действительно простой способ решения этой проблемы, мертвое время должно быть отсчитано от позиции, в которой элемент попадает в детектор, что означает, что если мертвое время должно блокировать 2 канала, первыйна самом деле это тот элемент, который получает в нем элемент.

Здесь я просто создал другой вектор, который в основном использует числа из numpy, и сделал расстояние d от основного вектора равным нулю, а затемпросто умножьте их вместе, и это приведет к тому, что вы получите единицы на позициях в оборках и нули в заблокированных позициях.

import numpy as np
np.random.seed(2)
random_set = np.random.poisson(lam=1, size = 20) #The source is making the elements with Poisson distribution
#lam could be any other value 
d = 3 #dead time, could be any other integers

#Saturation effect
#detector could not detect more than one elements at a time
random_set[random_set>1] = 1
print(random_set) 
new_vec = np.ones(random_set.shape)
for i in range(random_set.shape[0]):
    if random_set[i]==1:
        new_vec[i+1:i+d]=0

result = new_vec*random_set 

print(result)
0 голосов
/ 02 июня 2018

Насколько я понимаю, вы хотите, чтобы окно мертвого времени увеличивалось каждый раз, когда на датчик воздействует событие («единица»), когда оно уже находится в парализованном состоянии.Я считаю, что следующий код делает это.Хитрость заключается в том, чтобы использовать внутренний цикл while, чтобы вы могли динамически изменять границы цикла, поскольку это не представляется возможным с помощью цикла for в python.Я не удалял операторы print, чтобы было легче увидеть, откуда приходят данные, приведенные позже.

import numpy as np

np.random.seed(468316)
random_set = np.random.poisson(lam=1, size = 30) #The source is making the elements with Poisson distribution
#lam could be any other value 
d = 2 #dead time, could be any other integers

#Saturation effect
#detector could not detect more than one elements at a time
random_set[random_set>1] = 1

print('###initial random set')
print(random_set)
#set max index
max_index = random_set.shape[0] - 1
print('i', '\t', 'j', '\t', 'dt', '\t',' i+dt+1')

#Paralyzable dead time effect
for i,val in enumerate(random_set):
    #see if current value is an event
    if val == 1:
        #if so, set next d elements to zero
        dt = d
        #emulate 'for j in range(i+1, i+dt+1):' with a while loop
        j = i+1 if i < max_index else max_index        
        while j < i+dt+1:
            print(i, '\t',j, '\t', dt, '\t', i+dt+1)
            #if an event is foud within the d window, increase dt by another d
            if random_set[j]==1:
                random_set[j]=0
                dt += d

           #dont let the i+dt+1 to get out of the bounds of the random_set 
            if i+dt+1 > max_index:
                dt =   max_index - i
            j += 1
print('###final random set')
print(random_set)

Это приводит к следующему random_set (я использовал другое начальное и длина для презентабельного примера).В приведенном ниже списке i обозначает индекс внешнего цикла и j внутреннего цикла while.Это означает, что i указывает «единицы», которые будут оставаться в окончательном наборе, а j's указывает диапазон, в пределах которого «те» будут удалены. dt - это размер «мертвого времени» с момента, когда первоначальное событие попало в датчик.Он увеличивается каждый раз, когда в диапазоне [j, i + dt + 1] обнаруживается «единица».При этом i + dt + 1 обозначает внешнюю границу, после которой парализация должна прекратиться.

###initial random set
[1 0 0 0 1 1 0 1 1 1 1 1 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 1 0 1]
i    j   dt  i+dt+1
0    1   2   3
0    2   2   3
4    5   2   7
4    6   4   9
4    7   4   9
4    8   6   11
4    9   8   13
4    10  10  15
4    11  12  17
4    12  14  19
4    13  14  19
4    14  14  19
4    15  14  19
4    16  14  19
4    17  14  19
4    18  16  21
4    19  16  21
4    20  18  23
4    21  18  23
4    22  18  23
23   24  2   26
23   25  4   28
23   26  6   30
23   27  6   30
23   28  6   30
23   29  6   30
###final random set
[1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0]

Надеюсь, это решит ее.Пожалуйста, дайте мне знать, если вы неправильно поняли проблему.

...