使用FFT fft()计算黎曼和

时间:2015-03-28 15:31:50

标签: r fft

我想通过应用快速傅立叶变换(FFT)来计算跟随和。我想用FFT计算以下黎曼和近似:

enter image description here 这是我使用的Psy功能:

Psyfun<-function(u,T,r,q,sigma,lmbda,meanV,v0,rho){
  j  <- as.complex(1i)
  a <- lmbda*meanV
  b <- lmbda
  d <- sqrt((j*rho*sigma*u-b)**2+(u**2+j*u)*sigma**2)
  g <- (b-j*rho*sigma*u-d)/(b-j*rho*sigma*u+d)
  ret <- exp(j*u*(r-q)*T)
  ret <- ret*exp((a/sigma**2)*((b - rho*j*sigma*u - d)*T - 2.0*log((1-g*exp(-d*T))/(1-g))))
  return (ret*exp((v0/sigma**2)*(b - rho*j*sigma*u - d)*(1-exp(-d*T))/(1-g*exp(-d*T))))
}

以下是示例参数:

r = 0.025 ,q= 0.01, sigma = 0.2, lmbda = 0.5, meanV = 0.5, v0 = 0.5 , rho = 0.3

我想计算K和T的值等于:

K1 = 172.77且T1 = 0.197,K2 = 75.63且T2 = 0.563,K3 = 269.54且T3 = 0.2648

我实现了以下代码:

  N=2^10           # Number of subdivision in [0,a]
  alpha=2          # alpha 
  delta= 0.25      # delta= a/N  where a is the up value of w (w in [0,a])
  lambda=(2*pi)/(N*delta)
  j=seq(1,N,1)
  k=seq(1,N,1)
  b=(lambda*N)/2
  strike= -b+(k-1)*lambda
  strike= exp(strike)
  res=c()
  for (i in 1:N){
    w=delta*(i-1)      #  w= j*delta but from 1 to N so w=(i-1)*delta
    w_FC=w-(alpha+1)*1i
    phi= Psyfun(w_FC,T,r,q,sigma,lmbda,meanV,v0,rho)
    phi=phi*exp(-r1*(T))
    phi=phi/(alpha^2+alpha-w^2+1i*(2*alpha+1)*w)
    phi=phi*delta*exp(1i*w*b)
    res=rbind(res,phi)
  }  
  Result=Re(fft(res))*exp(-alpha*(-b+(k-1)*lambda))/pi

我获得了k个值,所以如何获得对应于K1,K2,K3的值。 任何人都可以推荐一个程序来实现计算吗?感谢

我之前没有快速傅里叶变换(FFT)处理的经验,所以除了有关如何以编程方式更好地处理此方法的建议之外,我还要感谢与数学/方法/代码相关的任何提示和指示。

0 个答案:

没有答案