2013-04-26 110 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