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
相关产品推荐
相关产品推荐

