2013-04-26 121 views
1

我試圖寫的R程序來優化功能,但我總是得到伽馬第(k + 1)產生的NaN警告。我不知道爲什麼,因爲K + 1應該非常小,但不是零。這裏是代碼:R伽瑪函數的NaN警告

x<-rlnorm(100,0,1) 
y<-x/(1+x) 
bernsum<-array(1:100) 
cvise1<-array(1:100) 
cvise2=0 
cvise<-0 
bernsum_temp1=0 
bernsum_temp2=0 
cvise1_temp1=0 
cvise1_temp2=0 

func_bernise<-function(bigm) 
{ 
    #Calculate the second part of CVISE 
    for (i in 1:100) 
{ 
    z<-y[-i] 
    for (j in 1:99) 
    { 
     for (k in 0:bigm-1) 
     { 
     bernsum_temp1=bernsum_temp1+bigm*((sum(z[j]<=(k+1)/bigm)-sum(z[j]    
<=k/bigm))/100)*(gamma(bigm)/(gamma(k+1)*gamma(bigm-k+1))) 
*(z[j]^k)*((1-z[j])^(bigm-k-1))/50 

     } 
     bernsum_temp2<-bernsum_temp2+bernsum_temp1 
     bernsum_temp1=0 
} 
bernsum[i]=bernsum_temp2 
bernsum_temp2=0 
} 



cvise=sum(bernsum)#+sum(cvise1) 
return(cvise) 
} 

bigmtrue=optimize(func_bernise,c(1,15)) 

在此先感謝!你可以看到k從0到bigm-1,bigm從1到15進行了優化,這使得k + 1也從1到15。

回答

0

我想我的問題。優化例程會將「bigm」設置爲某些非整數值。所以,我必須使用 其中(k 0:圓(BIGM-1)) 來解決這個問題。我希望還有其他優化例程着重於整數。

+0

你的函數返回'NaN'即使對於整數輸入'bigm'。 – 2013-04-27 01:53:53

+0

這很奇怪,因爲在我做出改變後,程序從未發出警告。無論如何,它似乎現在工作。謝謝! – 2013-04-27 12:53:43

3

爲了調用你的函數,你需要通過這一切在它使用的變量,或者變量需要定義/函數中初始化如果使用它們,並在執行函數結束時扔掉。

例如,你用你的函數內以下,而沒有經過變量函數:

y 
bernsum_temp1  #this is used in an assignment without being initialized 

您可以check out this編寫函數。

EDIT1: 我忘了提,NaN是產生的原因是:

gamma(0) = NaN 

所以在您第一次通過時,以下等於零,你會得到錯誤

  • BIGM -k + 1個
+0

謝謝Aaron Brown先生,我會詳細閱讀並做相應的修改。是的,錯誤來自gamma(0)。 – 2013-04-28 23:17:23