爱吃姜烩葱


私信TA

用户名:dotcpp0712243

访问量:166

签 名:

等  级
排  名 505
经  验 4577
参赛次数 0
文章发表 4
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

TA的其他文章

数列(2进制)
浏览:15
纪念品分组
浏览:20
阶乘(常规)
浏览:19

解题思路:

    由题目可知IRR大于-1,设x=IRR+1,x>0。对NPV关于x进行求导可知,NPV关于x的函数是个单调递减函数。

    又因为当x—>0时,NPV—>正无穷,x—>正无穷时,NPV—>负无穷。所以IRR有且仅有一解使NPV=0。

    由此可以想到利用二分法逼近求IRR。

参考代码:

def f(x,lst):             #定义一个函数求NPV

    tot=lst[0]

    for i in range(1,len(lst)):

        tot+=lst[i]/(1+x)**i

    return tot

while True:

    T=int(input())

    if T==0:            #当T输入为0时,退出循环

        break

    CF_list=list(map(int,input().split()))

    ans_min=-0.99         #IRR取值的下限和上限

    ans_max=10000.00

    while ans_max-ans_min>1e-4:            #确定精度范围,否则容易时间超限或一直处于循环中

        if f((ans_min+ans_max)/2,CF_list)>0:

            ans_min=(ans_min+ans_max)/2          #通过判断NPV的值与0的关系,更新上限或下限

        else:

            ans_max=(ans_min+ans_max)/2

    print("{:.2f}".format((ans_min+ans_max)/2))

 

0.0分

3 人评分

  评论区

  • «
  • »