我正在编写一个“未来到期年金价值”计算器,它允许用户在公式中找到未知数。公式是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('')
在您的函数值实现中,您似乎缺少(放置良好的)括号对。您的脚本的第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包中实现(参见here),以及其他根查找方法。
对于年金到期公式的未来价值,上述公式都缺少最后的定期付款(pp)。以下是正负利率。
newton_raphson_i = i - ((1+i)*pp*((1+i)**n - 1) - fv*i) / ((n+1)*pp*(1+i)**n - fv - pp)