Je suppose theta = exp
et l = r = 1
, donc:
Nd_f <- function(a,t) exp(t-a)*exp(-(1-exp(-r*a)))
Fonction Nd <- function(s) integrate(Nd_f, lower = 0, upper = s, t=s)$value
vise à évaluer l'intégrale:
Notez que integrate
n'est pas une fonction vectorisé. Une fonction vectorisée peut prendre une entrée vectorielle et renvoyer un vecteur. Par exemple, la fonction exp
est vectorisé, parce que:
exp(1:3)
# [1] 2.718282 7.389056 20.085537
Mais integrate
n'est pas. Vous êtes seulement autorisé à passer dans un scalaire pour lower
et upper
. Donc, il n'y a pas de problème si vous:
Nd(1)
# [1] 1.273614
mais il ne fonctionne pas lorsque vous faites:
Nd(1:2)
# [1] 2.286086
# There were 15 or more warnings (use warnings() to see the first 15)
# warnings()
# Warning messages:
# 1: In t - a : longer object length is not a multiple of shorter object length
Vous devez terminer votre fonction scalaire Nd
pour obtenir une fonction vectorisé. Si vous êtes vraiment nouveau à R, vous pouvez utiliser une boucle for
:
Nd_vectorized_for <- function(s) {
result <- numeric(length(s))
for (i in 1:length(s)) {
result[i] <- Nd(s[i])
}
result ## or `return(result)`
}
Maintenant, cette fonction peut prendre l'entrée de vecteur et retourner un vecteur:
Nd_vectorized_for(1:2)
# [1] 1.273614 4.276839
Les gens plus expérimentés avec R suggérera remplacement boucle for
avec *apply
fonction de la famille (lire ?sapply
voir cette famille):
Nd_vectorized_sapply <- function(s) sapply(s, Nd)
Nd_vectorized_sapply(1:2)
# [1] 1.273614 4.276839
Mais integrate
n'est pas une opération pas cher, donc il n'y a pas de gain de performance de sapply
:
system.time(Nd_vectorized_for(sample(1:10,100000,replace=TRUE)))
# user system elapsed
# 6.256 0.004 6.268
system.time(Nd_vectorized_sapply(sample(1:10,100000,replace=TRUE)))
# user system elapsed
# 6.200 0.004 6.212
Avec une fonction vectorisé, vous pouvez produire le tracé que vous voulez:
plot(Nd_vectorized_for(1:50), log = "y")
Can 't vous utilisez 'Vectorize' c'est-à-dire' Vectorize (Nd) (1: 2) # [1] 1.273614 4.276839' – akrun
C'est par expérience. – akrun
@akrun Cela a été utile, en particulier pour l'intégration d'arguments multivariables. Merci! – VitalSigns