私は2つのガウス関数を持っていますが、これらの関数にはif-elseステートメントと積分の結果の値を使って分割しています。どちらもかなり早く0になるので、最終的にRがNaNとして返す0/0を取得します。これにより、コードにエラーが発生します。 Rmpfrの精度を上げることとは別に、私は0/0またはNaNという結果になるものをどのように扱うのかと思っていました。R 0/0とNaNを扱うためのトリック
編集:
K(parameters, c(1,1), c(1,1))
私は私がであるため、これがあると思い
Error in integrate(Kz, -Inf, Inf, params = params, v. = v., u. = u.) : non-finite function value
を得る:ここで私は私が実行している場合はより明確にするために
parameters=c(1,1,2)
R<-function(params,z.){
params[2]*exp(-z.^2/(2*params[3]^2))
}
alpha<-function(params,z.,v.){
1/v.[2]*exp(-(z.-v.[1])^2/(2*v.[2]))
}
total.rel.alpha<-function(params,z.,u.){
final=0
species.number<-dim(u.)[1]
if(is.null(dim(u.))){
return(alpha(params,z.,u.)/R(params,z.))
}
for(i in 1:species.number){
final=final+alpha(params,z.,u.[i,])
}
return(final/R(params,z.))
}
Kz<-function(params,z.,v.,u.){
if(total.rel.alpha(params,z.,u.)>=0 & total.rel.alpha(params,z.,u.)<=1){
alpha(params,z.,v.)
}else if(total.rel.alpha(params,z.,u.)>1){
alpha(params,z.,v.)/total.rel.alpha(params,z.,u.)
}
}
K<-function(params,v.,u.){
integrate(Kz,-Inf,Inf,params=params,v.=v.,u.=u.)$value
}
を使用しているコードがあります私は0/0の合計を得ます.rel.alpha
私はすぐにコーディングにジャンプしていない理由は、本当に問題の説明は、単に失敗したコードがないということです。 'integrate'に渡される関数は、「ベクトル化」する必要があります。関数をベクトル化されたバージョンに変換するのに成功する 'Vectorize'関数があります。 ( 'alpha'関数は既にベクトル化されているように見えます)さらに、Kz関数の本体を実行するだけで、" object 'u'が得られます。それがどのように得られたのかは不明です。 –
K(パラメータ、c(0,1)、c(0,1))は機能します。結果を返します(ただし、警告メッセージが表示されますが、それにもかかわらず結果は返されます)。 – Plinth
だから...問題はほとんど解決?あなたの関数に問題とデータフローを記述するなら、私は警告を取り除く方法を理解することができたと確信しています。私は再開のためにノミネートされました。私は今、十分な具体的な資料があると思うからです。 –