解决累计金额未知的利率

时间:2020-03-15 09:13:00

标签: python iteration sympy solver

嗨,我正在寻找一种迭代未知值的方法。 有18个现金流量(cf_1至cf_18)及其对应的累积期间(t1至t18),存储在2个列表中。我希望将累计金额的总和(用未知利率i表示)等于500000,并解决这个问题。

公式为:500000 =累积值= cf1 *(1 + i)^ t1 + ... + cf_18 *(1 + i)^ t18。我可以考虑使用sympy求解器:

solve(cf1 * (1+i)**t1 +...+ cf_18 * (1+i)**t18 - 500000, i) 

解决我。但是显然for循环不能接受这个未知的i。那么除了输入全部18个表达式外,我还能做什么?

这是数据以及我尝试过的内容:

from sympy.solvers import solve
from sympy import Symbol

i = Symbol('i')

cashflow = [13000,
12500,
12000,
11500,
11000,
10500,
10000,
9500,
9000,
8500,
8000,
7500,
7000,
6500,
6000,
5500,
5000,
4500,]

years_accum = [22.75,
22.5,
20.5,
20,
19.25,
19,
18.75,
12,
10.25,
10,
9.75,
9,
8.5,
8,
7.5,
5,
3.5,
3.25,]

for cf in cashflow:
    for yr in years_accum:
        S_t = sum(cf* (1+i)^yr)
        print(S_t)
solve(S_t - 500000, i)

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

您的双循环不正确,因为对于每个现金流,它都会累加所有年份。我会做的

[-1,1]

但要循环查看,可能是

>>> eq = sum([cf*(1+i)**yr for cf,yr in zip(cashflow, years_accum)]) - 500000

如果我们希望得到一个简单的答案(来自一个相对简单的方程式),那么现在解决... >>> S_t = 0 >>> for cf, yr in zip(cashflow, years_accum): ... S_t = S_t + cf*(1+i)**yr >>> eq = S_t - 500000 会很好。由于这是高度非线性的solve(对于数值解),因此是更好的选择:

nsolve