已知PV、FV及期数n时如何求解折现率r(附R代码示例)
已知现值、终值、期数求解利率的R实现
你现有实现的复利终值计算函数逻辑正确,对应反求利率有两种常用实现方案:
方案1:公式直接计算(解析解)
根据复利终值公式 FV = PV*(1 + r/100)^n,直接变形就能得到利率的解析表达式,计算零误差、速度最快:
推导结果:
r = ((FV / PV)^(1/n) - 1) * 100
注:返回的r为百分比单位,和你现有fv函数的r参数单位完全匹配,可直接传入使用。
对应R代码实现:
# 反求利率的解析解函数 calc_r <- function(pv, fv, n) { ((fv / pv) ^ (1/n) - 1) * 100 } # 测试匹配你给出的示例:PV=100,FV=133.1,r=10时对应期数为3 calc_r(pv = 100, fv = 133.1, n = 3) #> [1] 10
说明:你题干里写的n=2、r=10的参数组合不匹配FV=133.1的结果——n=2、r=10时计算得到的终值为
fv(100, 2, 10) = 121;如果固定PV=100、FV=133.1、n=2,计算得到的利率约为15.37%。
方案2:数值求根(通用场景适配)
如果后续遇到无法直接推导解析解的复杂计息场景(比如有不规则现金流、分段计息等),可以用R内置的uniroot函数做一元方程求根,自动找到让终值计算结果等于目标FV的利率值,不需要手动推导公式:
# 基于uniroot的数值法求利率 calc_r_num <- function(pv, fv, n, lower = 0, upper = 100) { # 定义目标函数:找到r使得计算出的fv和目标fv差值为0 target_fun <- function(r) fv(pv, n, r) - fv # 区间搜索求根 uniroot(target_fun, lower = lower, upper = upper)$root } # 测试示例 calc_r_num(pv = 100, fv = 133.1, n = 3) #> [1] 10
使用数值法时注意:默认搜索的利率区间是0%~100%,如果你的业务场景可能出现负利率、或者利率超过100%,调整lower和upper参数即可。
内容的提问来源于stack exchange,提问作者Ramakrishna S
相关产品推荐
相关产品推荐

