积分错误:非限定函数值

时间:2018-12-04 09:48:53

标签: r integration

在p_2的定义中使用了

f_heston,在g_heston函数中也使用了它。我需要将g_heston从0集成到无穷大。

f_heston=function(u,r,q,tau,V0,S0,sigma,rho,kappa,theta){
  i=complex(imaginary = 1)
  X0=log(S0)
  M=sqrt((rho*sigma*i*u-kappa)^2+sigma^2*(i*u+u^2))
  N=(rho*sigma*i*u-kappa-M)/(rho*sigma*i*u-kappa+M)
  A=(r-q)*i*u*tau+kappa*theta/sigma^2*(-(rho*sigma*i*u-kappa-M)*tau-2*log((1-N*exp(M*tau))/(1-N)))
  B=(exp(M*tau)-1)*(rho*sigma*i*u-kappa-M)/(sigma^2*(1-N*exp(M*tau)))
  return(exp(A+B*V0+i*u*X0))
}

f_2=function(u,r,q,tau,V0,S0,sigma,rho,kappa,theta){
  i=complex(imaginary = 1)
  return(exp(-i*u*log(S0))*exp(-i*u*(r-q)*tau)*f_heston(u,r,q,tau,V0,S0,sigma,rho,kappa,theta))
}

g_heston=function(u,S0,K,r,q,kappa,theta,V0,tau,sigma,rho){
  i=complex(imaginary = 1)
  k=log(S0/K)+(r-q)*tau
  g=Re(exp(-i*u*k)*f_2(-u-i/2,r,q,tau,V0,S0,sigma,rho,kappa,theta))/(u^2+1/4)
  if(is.nan(g)) return(0) else return(g)
}

g_heston迅速达到应有的0,但是对于较大的u值,它开始生成NaN。我试图通过使函数返回0(如果g是NaN)来抵消这种情况。

integrate(g_heston, lower=0, upper= Inf ,S0=100,K=120,r=0.05,q=0.02,kappa=1,theta=1,V0=1,tau=2,sigma=1,rho=-0.3 )

这并没有消除错误:“非有限函数值”,此外,该函数现在还发出警告:

此外:警告消息: 1:如果if(is.nan(g))return(0)else return(g):   条件的长度> 1,并且只会使用第一个元素

我不知道is.nan(g)的长度如何> 1,为什么会产生错误(以及为什么stop.on.error条件无法捕获错误),以及g_heston为什么会首先产生NaN。

0 个答案:

没有答案