моделировать немарковский случайный процесс - PullRequest
0 голосов
/ 12 декабря 2018

Рассмотрим немарковский процесс, который описывает переход из состояния A в B, управляемый распределением времени отклика в непрерывном времени с дополнительным постоянным притоком в состояние A и выпуском из состояния B. См. Иллюстрацию процесса здесь. See process illustration here.

Например, у меня есть 100 ячеек типа A, которые переходят в тип B, где распределение между событиями распределяется не экспоненциально.Чтобы смоделировать это, мне нужно посмотреть на каждую ячейку индивидуально и проверить, когда произошел переход состояния. Я изо всех сил стараюсь интегрировать постоянный поток в состояние A, одновременно рассматривая вопрос о переходе в состояние B . Нужно ли мне сосредотачиваться на каждой ячейке по отдельности, или я могу взять из экспоненциального распределения, чтобы выяснить,когда еще одна ячейка добавляется в систему?Мой разум полностью застрял.

def semi_markov(start, stop, nsteps, ncells, nstates = 3):

# initialize cells
cells = np.zeros((ncells, nsteps, nstates))    
time = np.linspace(start, stop, nsteps)

# generate random number for each cell to compare with integral
# of response-time distribution
numbers_rnd = [np.random.rand() for i in range(ncells)]
fate_times = [np.random.exponential(1.) for i in range(ncells)]

# for each time point loop over each cell and check if transition occurs
for i in range(len(time)-1):
    t = time[i]
    t_new = time[i+1]

    cell_j = cells[:,i,:]

    for j in range(cells.shape[0]):          
        cell = cell_j[j,:]           

        n_rnd = numbers_rnd[j]
        fate_time = fate_times[j]

        # if cell is type A check if transition to B occurs
        if cell[0] == 0:
            if n_rnd > cell[1]:
                cell[1] = cell[1]+ (non_exp_cdf(t_new)-non_exp_cdf(t))
             else:
                cell[0] = 1
                cell[2] = t

        # if cell is type B check if transition occurs    
        if cell[0] == 1 and fate_time < (t - cell[2]):
            cell[0] = 2                

        cells[j,i+1,:] = cell

return [cells, time]
...