2016-05-09 13 views
2

私は以下の二重積分を計算したいと思います。下限= -Infと上限= Infを両方の積分で計算したいと思います。関数の値をM = 0に対してゼロに定義したり、M = 0に対して数値積分を省略するにはどうすればよいですか? これは密度関数であり、確率を計算するときにM = 0以上の領域をゼロとして定義したいと考えています。Rの積分のポイントで関数値を定義する方法は?

機能はここで見ることができます:

enter image description here

1が原因私の問題への「ジャンプ」を参照してくださいすることができ、ここで、Rコードは、ここにある:

一つのアプローチは次のようになり
mum<-5.16 
mub<-1.5 
mur<-2.764 
sm<-3.37 
sb<-0.2 
sr<-0.056 

dk<-function(k){ 
integrate(function(r) { 
sapply(r, function(r) { 
1/(2*pi*sr^2)^0.5*exp(-(r-mur)^2/(2*sr^2))*integrate(function(m) {1/(abs(m)*2*pi*sm*sb)*exp(-(m-mum)^2/(2*sm^2)-((k-r)/m-mub)^2/(2*sb^2))},lower=Inf, upper=Inf)$value 
}) 
}, lower=Inf, upper=Inf)$value 

} 

curve(sapply(x,dk), from=-2, to=18, lwd=2,col="red") 
+0

であるとして、あなたのコードが実行されません。予期しない '}'があります。また、必要な動作をテストするためのデータは提供されていません。これらの問題に対処するために質問を編集できますか? (m-m3)^ 2 - ((kr)/ m-1)を計算すると、あなたの積分関数をfunction(m) m2)^ 2) }あなたの問題に対処しますが、確かめるためにはデータが必要です。 – dww

+0

詳細については、http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-exampleを参照してください。 MWEを作成します。 – dww

+0

あなたのご意見ありがとうございます、私は括弧を修正しました。しかし、私はフィットするデータがない、それは私が設定する必要があるパラメータです。私が実際に使用する関数とコードははるかに長いです。私はそれを簡略化した問題を提示するためにそれを簡略化しました。それは連続的な分布関数であり、私はRで実装する必要がある0を越える領域を定義することができます。 – Seb

答えて

2

単にその値が無効な値で関数dkを評価しないようにする

mum<-5.16 
mub<-1.5 
mur<-2.764 
sm<-3.37 
sb<-0.2 
sr<-0.056 

    dk<-function(k){ 
    integrate(function(r) { 
     sapply(r, function(r) { 
     1/(2*pi*sr^2)^0.5*exp(-(r-mur)^2/(2*sr^2))*integrate(function(m) {1/(abs(m)*2*pi*sm*sb)*exp(-(m-mum)^2/(2*sm^2)-((k-r)/m-mub)^2/(2*sb^2))}, lower=Inf, upper=Inf)$value 
     }) 
    }, lower=Inf, upper=Inf)$value 
    } 

x <- c(seq(-2,-0.1, by=0.2), seq(0.1,18,by=0.2)) 
y <- sapply(x,dk) 
plot(y~x, type="l", col="red") 

enter image description here

他の方法は、関数は、例えばのように失敗したため値であなたの関数DKリターンNAを持つことです

dk<-function(k){ 
    if ((k-mur)<0.4 & (k-mur)>-0.4) NA 
    else { 
    integrate(function(r) { 
     sapply(r, function(r) { 
     1/(2*pi*sr^2)^0.5*exp(-(r-mur)^2/(2*sr^2))*integrate(function(m) {1/(abs(m)*2*pi*sm*sb)*exp(-(m-mum)^2/(2*sm^2)-((k-r)/m-mub)^2/(2*sb^2))}, lower=Inf, upper=Inf)$value 
     }) 
    }, lower=Inf, upper=Inf)$value 
    } 
    } 

curve(sapply(x,dk), from=-2, to=18, lwd=2,col="red") 

enter image description here

関連する問題