首页 > 解决方案 > Newton-Raphson 不工作 - 未来价值年金到期公式

问题描述

我正在编写一个“年金到期的未来价值”计算器,它允许用户在公式中找到未知数。公式是fv = (1 + i) * pp * ((1 + i)**n - 1) / i; 其中fv是未来价值,pp是定期付款,i是利率,n是周期数。例如,假设pp = 100,i = .2735 (27.35%)n = 11, 得到fv = 6187.56. 在不知道的情况下i,我可以将比率内插为 25%,并希望使用 Newton-Raphson 迭代来获得更准确的答案。然而,我下面的代码是关闭的,因为它是发散的(它似乎适用于较小的值i,即 5%)。

fv = 11807.795
pp = 1000
n = 10
i = .03

def newton_raphson_method(fv,pp,i,n):
    newton_raphson_i = i
    for num in range(1,20):
        newton_raphson_i = i - (1+i)*(pp*(1+i)**n - pp-fv*i) / ((n +1)*pp*(1+i)**n - fv)
        i = newton_raphson_i
        print(i)
    i = round(i,11)
    print('')
    print ('The newton interest rate is ' + str("%.9f" % (i * 100)) + '%')
    print('')

标签: pythonfinancenewtons-method

解决方案


看起来您在函数值的实现中缺少一个(放置良好的)括号对。脚本的第 9 行可能应该是

newton_raphson_i = i - ((1+i)*(pp*(1+i)**n - pp) - fv*i) / ((n +1)*pp*(1+i)**n - fv)

或者,等效地,

newton_raphson_i = i - ((1+i)*pp*((1+i)**n - 1) - fv*i) / ((n +1)*pp*(1+i)**n - fv)

更一般地说,我建议您future_value(pp, i, n)在脚本中实现一个函数并对其进行测试。然后,您还可以实现要查找其根的函数,即(future_value - fv) * i及其导数,测试它们,并在 Newton-Raphson 方法中使用这些测试的函数。

顺便说一句,Newton-Raphson 方法本身已经在 scipy 包中实现(参见此处),以及其他寻根方法。


推荐阅读