You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言IS函数无返回结果:如何输入参数获取midpt值?

问题分析与解决方案

我来帮你搞定这个问题——你的IS函数目前只是定义了内部的目标函数和二分法逻辑,但没有触发二分法的执行,也没有返回计算结果,所以调用后没有输出。另外,我们可以利用R的词法作用域特性,让内部函数轻松捕获外部参数,不需要额外传递。

修改后的可运行代码

这里是调整后的完整IS函数,直接调用就能返回midpt值:

IS <- function(N, K, sigma, t, r, S_0, a, b, tol){
  # 定义目标函数,自动捕获外部函数的参数(S_0, sigma等)
  funct_1 <- function(x){
    (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){
    # 检查初始区间是否存在根,用stop抛出明确错误
    if (f(a) * f(b) > 0){
      stop("No root found in the given interval [a, b].")
    }
    
    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)
  }
  
  # 核心:调用二分法函数,传入funct_1,并返回结果
  result <- bisection_method(a, b, tol, f = funct_1)
  return(result)
}

关键调整说明

  • 添加执行与返回逻辑:原函数最大的问题是没有调用bisection_method并返回结果。现在我们在函数末尾调用了二分法,把funct_1作为参数传给它,然后返回计算出的midpt。
  • 参数传递的原理:funct_1定义在IS函数内部,R的词法作用域会让它自动访问IS的所有参数(比如S_0、sigma),不需要额外把这些参数传给funct_1。当我们把funct_1传给bisection_method的f参数后,二分法内部调用f(x)时,就会执行funct_1的逻辑,并且能正确获取所有外部参数。
  • 错误处理优化:把原有的print改成stop,这样在区间内没有根的情况下会抛出明确的错误,方便调试,更符合R的编码习惯。
  • 代码可读性优化:调整了funct_1的换行,修复了变量赋值的空格(比如midpt= 改成midpt <- ),让代码更易读。

使用示例

你可以用下面的示例参数测试函数:

# 示例输入参数
N <- 1000
K <- 100
sigma <- 0.2
t <- 1
r <- 0.05
S_0 <- 100
a <- -5
b <- 5
tol <- 1e-6

# 调用函数并获取结果
root_value <- IS(N, K, sigma, t, r, S_0, a, b, tol)
print(root_value)

内容的提问来源于stack exchange,提问作者Smith Pay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:43:15