R中的三个功能

时间:2018-05-28 20:19:42

标签: r

 IS <- function(N,K,sigma,t,r,S_0,a,b,tol){

funct_1 <- function(x){
return((S_0*(exp(-0.5*(sigma^2)*t+sigma*sqrt(t)*x))*(sigma*sqrt(t)-x))+ 
(exp(-r*t))*K*x)
}

bisection_method <- function(a, b, tol, f = funct_1){
if (f(a)*f(b) > 0){
  print("No root found.")
} else
  while ((b - a)/2.0 > tol){
    midpt= (a + b)/2.0
    if (f(midpt) == 0){
      return(midpt) 
    } else if (f(a)*f(midpt) < 0){ 
      b = midpt
    } else
      a = midpt
  }
return(midpt)
}

}

以上功能不会为您带来任何好处。我的目标是输入&#34; N,K,sigma,t,r,S_0,a,b&#34;并以某种方式返回&#34; midpt&#34;为了我。我搜索了很多,但无法想出任何有意义的东西。我有很多问题,假设我输入了所有内容,然后是函数&#34; funct_1&#34;将输出表达式,此表达式需要被调用到下一个函数&#34; bisection_method}以及a和b的值,然后最终获得&#34; midpt&#34;值。任何建议都非常感谢。如果您有什么不清楚的地方,请告诉我。

1 个答案:

答案 0 :(得分:3)

您的主要功能不会返回任何内容。它只是创建辅助功能,然后什么都不做。这就是为什么你没有输出。

尝试在主函数中使用适当的参数返回二分法。我也进行了编辑,因此在找不到根时会得到NULL输出。

IS <- function(N,K,sigma,t,r,S_0,a,b,tol){

  funct_1 <- function(x){
    return((S_0*(exp(-0.5*(sigma^2)*t+sigma*sqrt(t)*x))*(sigma*sqrt(t)-x))+ 
             (exp(-r*t))*K*x)
  }

  bisection_method <- function(a, b, tol, f = funct_1){
    if (f(a)*f(b) > 0){
      print("No root found."); return(NULL)
    } else
      while ((b - a)/2.0 > tol){
        midpt= (a + b)/2.0
        if (f(midpt) == 0){
          return(midpt) 
        } else if (f(a)*f(midpt) < 0){ 
          b = midpt
        } else
          a = midpt
      }
    return(midpt)
  }
  return(bisection_method(a,b,tol,funct_1))
}

找出一些有意义的参数组合:

IS(1,1,1,4,5,1,.1,9,10^-4)
[1] 2.000023