2016-07-03 1 views
1

Salut Je suis coincé avec l'intégration numérique d'une fonction. Je cette fonction:intégration numérique de fonctions multivariables

Nd_f <- function(a,t) { 
theta(t-a)*exp(-l*(1-exp(-a))) } 

qui est utilisé dans une autre fonction définie ci-dessous:

Nd <- function(s) { 
integrate(Nd_f, lower = 0, upper = s, t=s)$value } 

où thêta() est une fonction connue. Donc, en utilisant ces fonctions, je peux évaluer Nd (t). Mais lorsque je tente de tracer à l'aide:

plot(Nd(0:500), log="y") 

Je reçois l'erreur suivante:

Error in integrate(Nd_theta, lower = 0, upper = s, t = s) : evaluation of function gave a result of wrong length

Je ne comprends pas si je peux l'évaluer pour toutes les valeurs de t, pourquoi je ne peux pas intrigue il?

l = 0,025, v = 0,001 et

theta <- function(t) { exp(-v*t) } 

Merci à l'avance!

Répondre

6

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:

enter image description here

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") 

enter image description here

+2

Can 't vous utilisez 'Vectorize' c'est-à-dire' Vectorize (Nd) (1: 2) # [1] 1.273614 4.276839' – akrun

+1

C'est par expérience. – akrun

+1

@akrun Cela a été utile, en particulier pour l'intégration d'arguments multivariables. Merci! – VitalSigns