2016-07-03 9 views
1

Hi Ich bin mit der numerischen Integration einer Funktion fest. Ich habe diese Funktion:numerische Integration von multivariablen Funktionen

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

, die in einer anderen Funktion nachstehend definiert verwendet:

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

wo, theta() ist eine bekannte Funktion. Mit diesen Funktionen kann ich also Nd (t) auswerten. Aber wenn ich versuche, es plotten mit:

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

ich die folgende Fehlermeldung erhalten:

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

Ich verstehe nicht, wenn ich es für alle Werte von t auswerten kann, warum kann ich Grundstück es?

l = 0,025, v = 0,001 und

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

Vielen Dank im Voraus!

Antwort

6

Ich gehe davon aus theta = exp und l = r = 1, so:

Nd_f <- function(a,t) exp(t-a)*exp(-(1-exp(-r*a))) 

Funktion Nd <- function(s) integrate(Nd_f, lower = 0, upper = s, t=s)$value zielt darauf ab, das Integral zu bewerten:

enter image description here

Beachten Sie, dass integrate kein vektorisiert Funktion ist. Eine vektorisierte Funktion kann Vektoreingabe nehmen und einen Vektor zurückgeben. Zum Beispiel wird die exp Funktion vektorisiert, weil:

exp(1:3) 
# [1] 2.718282 7.389056 20.085537 

Aber integrate nicht. Sie dürfen nur einen Skalar für lower und upper übergeben. So gibt es kein Problem, wenn Sie tun:

Nd(1) 
# [1] 1.273614 

aber es funktioniert nicht, wenn Sie das tun:

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 

Sie benötigen eine skalare Funktion einpacken Nd eine vektorisiert Funktion zu erhalten. Wenn Sie wirklich neu für R sind, können Sie eine for Schleife verwenden:

Nd_vectorized_for <- function(s) { 
    result <- numeric(length(s)) 
    for (i in 1:length(s)) { 
    result[i] <- Nd(s[i]) 
    } 
    result ## or `return(result)` 
    } 

Jetzt kann diese Funktion Vektoreingang nehmen und einen Vektor zurück:

Nd_vectorized_for(1:2) 
# [1] 1.273614 4.276839 

erfahreneren mit R Menschen werden vorschlagen ersetzen for Schleife mit *apply Familie Funktion (lesen ?sapply diese Familie zu sehen):

Nd_vectorized_sapply <- function(s) sapply(s, Nd) 

Nd_vectorized_sapply(1:2) 
# [1] 1.273614 4.276839 

Aber integrate ist kein billiger Betrieb, so gibt es keinen Leistungsgewinn von sapply ist:

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 

Mit einer vektorisiert Funktion geben Sie den Plot Sie produzieren können:

plot(Nd_vectorized_for(1:50), log = "y") 

enter image description here

+2

Can Verwenden Sie 'Vectorize', dh' Vectorize (Nd) (1: 2) # [1] 1.273614 4.276839' – akrun

+1

Es ist aus Erfahrung. – akrun

+1

@akrun Dies war hilfreich, insbesondere bei der Integration von multivariablen Argumenten. Vielen Dank! – VitalSigns

Verwandte Themen