Оба сообщения об ошибках предполагают, что в какой-то момент все значения в векторе Q равны 0, что вызывает первую ошибку.Пример: sample(3,1, prob = c(0,0,0))
.
Следовательно, скорость (Qt), которую вы передаете в генератор случайных чисел с экспоненциальным распределением, также равна 0, и возвращается NaN, что вызывает вторую ошибку.Пример: rexp(1,0)
К сожалению, ваш код мне было трудно читать, поэтому я реорганизовал его.Вы можете найти расширенную версию ниже, которая работает с примером ввода.Я предполагаю, что где-то есть ошибка, приводящая к тому, что Q принимает состояние 0, вы можете отследить это с помощью некоторых операторов печати и функций отладки.Вы можете дополнительно реорганизовать этот фрагмент кода, чтобы сделать его еще более читабельным и производительным.
В общем, вы можете исследовать математические условия для начальных входов, чтобы гарантировать, что вектор Q никогда не попадет в состояние 0.Я не уверен, если вы ищете указатели о том, как это сделать, а также.HTH
CHANGE_MATRIX <- matrix(
c(-1, 0, 1, 0, 0, 0, 0, 0
, 1, 0, -1, 0, 0, 0, 0, 0
, 0, 0, 0, -1, 0, 1, 0, 0
, 0, 0, 0, 1, 0, -1, 0, 0
, 0, 0, 0, -1, 1, 0, 0, 0
, 0, 0, 0, 1, -1, 0, 0, 0
, 0, -1, 0, 0, 1, 0, 0, 0
, 0, 1, 0, 0, -1, 0, 0, 0
, 0, 1, -1, 0, 0, 0, 0, 0
, 0, -1, 1, 0, 0, 0, 0, 0
, 0, 0, -1, 0, 0, 0, 1, 0
, 0, 0, 1, 0, 0, 0, -1, 0
, 0, 0, 0, 1, 0, 0, 0, -1
, 0, 0, 0, -1, 0, 0, 0, 1
, 0, 0, 0, -1, 0, 0, 1, 0
, 0, 0, 0, 1, 0, 0, -1, 0
, 0, 0, 0, 0, 0, -1, 0, 1
, 0, 0, 0, 0, 0, 1, 0, -1
, 0, 0, -1, 1, 0, 0, 0, 0
, 0, 0, 1, -1, 0, 0, 0, 0)
, ncol = 8
, byrow = T
)
UPDATE_LOCATION <- c(1, 3, 4, 6, 4, 5
, 2, 5, 3, 2, 3, 7
, 8, 4, 4, 7, 6, 8
, 3, 4)
UPDATE_WEIGHT <- c(1, 3, 5, 2, 5, 2
, 2, 2, 2, 2, 3, 2
, 2, 5, 4, 2, 2, 2
, 4, 5)
UPDATE_INDEX <- seq(17, 36)
BODY_PARTS <- c(' Tail'
,' Anal'
,' LB'
,' UB'
,' Pelvic'
,' Pectoral'
,' dorsal'
,' Head')
Fishsim_model <- function(b,d,m,X0,Ti){
#b=birth rate; d=death rate; m=movement rate; Ti=finishing time
#X0=initial distribution; X= states
X <- X0
Ti <- floor(Ti)
ti <- 0 # (initial) time
day <- 1
saved <- matrix(0, Ti+1, 8) #Matrix of zeros to save final results
saved[day,] <- X0
Q <- vector('numeric', 36)
Qt <- 0 # Qt = sum(Q) is departure rate from current state
while (ti < Ti){
#Calculate rates
Q[1:8] <- X*b
Q[9:16] <- X*d
Q[UPDATE_INDEX]<-X[UPDATE_LOCATION[seq_along(UPDATE_INDEX)]]*
(m*(1/UPDATE_WEIGHT[seq_along(UPDATE_INDEX)]))
Qt <- sum(Q)
# time for next jump
ti <- ti + rexp(1, Qt)
# new state
j <- sample(36, 1, prob = Q)
if (j <= 8) {
X[j] <- X[j] + 1
} else if (j <= 16){
X[j-8] <- X[j-8] - 1
} else{
X <- X + CHANGE_MATRIX[j-16, ]
}
day.old <- day #Keep track of previous days
day <- ceiling(ti)
if (day > day.old){
# What was this intended to achieve?
# saved[(day.old+1):day,] <- matrix(saved[day.old,]
# , (day - day.old)
# , 8
# , byrow=TRUE)
saved[day, ] <- X
cat(
paste('day:', day)
, '\n'
, paste(BODY_PARTS, ':', X)
, '\n'
)
}
}
return(saved)
}
#Suppose parasite prefer tail
b <- 0.5 #birth rate per day
d <- 0.14 #death rate
m <- 0.3 #movement rate
X0 <- c(2,0,0,0,0,0,0,0)# initial condition of gyro that prefers the tail
Ti <- 17 #finishing time
#set.seed(12)
Results <- Fishsim_model(b, d, m, X0, Ti)
Results