2012-08-21 3 views
3

통합 할 수있는 벡터 전달 방법 : integrate 통화 fun_integrate : 최대한 멀리 볼 수내가 함수 입력 매개 변수로 벡터 <code>vec</code>을 가지고 <code>fun_integrate</code> 통합하려는 기능

fun_integrate <- function(x, vec) { 
    y <- sum(x > vec) 
    dnorm(x) + y 
} 

#Works like a charm 
fun_integrate(0, rnorm(100)) 

integrate(fun_integrate, upper = 3, lower = -3, vec = rnorm(100)) 
300.9973 with absolute error < 9.3e-07 
Warning message: 
    In x > vec : 
    longer object length is not a multiple of shorter object length 

을, 문제는 다음과 같다 벡터는 upperlower을 기반으로 계산하는 x입니다. 이 벡터화 된 호출은 다른 벡터가 추가 인수로 전달되면 작동하지 않는 것 같습니다. 내가 원하는 것은 integratex 각각에 대해 fun_integrate을 호출하고 내부적으로 계산하여 벡터 vec에 해당하는 x을 비교합니다. 위 코드가 그렇게하지 않는다고 확신합니다.

직접 통합 루틴을 구현할 수 있습니다. 즉, lowerupper 사이의 노드를 계산하고 각 노드의 기능을 별도로 평가할 수 있음을 알고 있습니다. 그러나 그것은 내가 선호하는 해결책이 될 수 없다.

또한 Vectorize을 확인했지만이 문제는 다른 문제, 즉 x에 대한 벡터를 허용하지 않는 것으로 나타납니다. 내 문제는 내가 추가 벡터를 인수로 원한다는 것이다.

답변

3
integrate(Vectorize(fun_integrate,vectorize.args='x'), upper = 3, lower = -3, vec = rnorm(100),subdivisions=10000) 

304.2768 with absolute error < 0.013 


#testing with an easier function 
test<-function(x,y) { 
    sum(x-y) 
} 

test(1,c(0,0)) 
[1] 2 

test(1:5,c(0,0)) 
[1] 15 
Warning message: 
In x - y : 
longer object length is not a multiple of shorter object length 

Vectorize(test,vectorize.args='x')(1:5,c(0,0)) 
[1] 2 4 6 8 10 

#with y=c(0,0) this is f(x)=2x and the integral easy to solve 
integrate(Vectorize(test,vectorize.args='x'),1,2,y=c(0,0)) 
3 with absolute error < 3.3e-14 #which is correct 
+0

나는 말할 것이다 : 좋은 지적. 어쩌면 우리 중 한 명은 빠른 사다리꼴 버전을 작성하고 대답이 300 또는 6400에 가까운 지 확인해야합니다.하지만 모든 것을 변경했습니다. :-). 이 버전이 제대로 통합되었는지 확인하기 위해 이와 같은 작업을 수행 했습니까? –

+0

이 답변을 수정하십시오. – Roland

+0

그래서 Vectorize가 실제로 대답이었습니다 ... 내 옆에서 체크 한 것에 대해 너무 많이 ----) 어쨌든, 고마워요! –

2

롤랜드의 답변이 좋아 보인다. 그냥 경고 메시지를 던지고 integrate 아니라는 sum, 지적하고 싶었어요.

Rgames> xf <- 1:10 
Rgames> vf <- 4:20 
Rgames> sum(xf>vf) 
[1] 0 
Warning message: 
In xf > vf : 
longer object length is not a multiple of shorter object length 

당신이 얻은 대답은 사실이 아니라 올바른 값은 integrate 당신이 당신의 기능에 예상되는 X-벡터를 전송하지 제안 것입니다.

관련 문제