R编程中的Newton Raphson算法

时间:2018-03-08 07:58:50

标签: r

我现在正在做的教科书练习是在R编程中实现Newton-Raphson算法。

代码是:

#Inputs:
  s0 <- 2.36
  E <- 2.36 
  r <- 0.01 
  t <- 1 
  c <- 0.1875

#Initial value of volatility: 
  sigma <-0.10 
  sig <- rep(0,10)
  sig[1] <- sigma

#Newton-Raphson method:
for(i in 2:100){
  d1 <- (log(s0/E)+(r+sigma^2/2)*t)/(sigma*sqrt(t)) 
  d2 <- d1-sigma*sqrt(t) 
  f <- s0*pnorm(d1)-E*exp(r*t)*pnorm(d2)-c 

#Derivative of d1 w.r.t. sigma:
      d11 <- (sigma^2*t*sqrt(t)-(log(s0/E)+(r+sigma^2/2)*t)*sqrt(t))/(sigma^2*t) 

#Derivative of d2 w.r.t. sigma: 
      d22 <- d11-sqrt(t) 

#Derivative of f(sigma):
      f1 <- s0*dnorm(d1)*d11-E*exp(-r*t)*dnorm(d2)*d22 

#Update sigma: 
    sigma <- sigma - f/f1 
    sig[i] <- sigma
    if(abs(sig[i]-sig[i-1]) < 0.00000001){sig <- sig[1:i]; break}}sig

我输入sig时的结果是 [1] 0.1000000 0.2140636 0.2117527 0.2117864 0.2117859 0.2117859

结果应该基于教科书练习: [1] 0.1000000 0.1877024 0.1876218 0.1876218

我在这里做错了什么?为什么我会得到不同的结果?

1 个答案:

答案 0 :(得分:1)

ff1的表达式不匹配。如果exp(r*t)的表达式正确,则f的表达式中的exp(-r*t)一词应为f1。 因此f应定义为

f <- s0*pnorm(d1)-E*exp(-r*t)*pnorm(d2)-c

然后输出

[1] 0.1000000 0.1877024 0.1876218 0.1876218

最后使用c作为变量名称; c是内置函数。 使用类似C或更好Cxx的内容。