Python中的二分搜索 - 查找一年内的最低付款

时间:2014-09-10 18:50:06

标签: python bisection

我已经坚持了几个小时这个问题了,我一遍又一遍地重做它!在这一点上,我想我实际上看到数字飞来飞去。

无论如何,我应该编写一个程序,找出每月支付一年的正确金额,以偿还信用卡上的债务。因此,通过此计划,必须满足一些条件。

  • 必须使用二分搜索((低+高)/ 2)
  • 有一套设定余额
  • 有年利率。

此处是我的代码,而我所能得到的只是无限循环。我在这里做错了什么?

balance = 320000
annualInterestRate = 0.2

monthly_interest = float(annualInterestRate) / 12.0
lower_bound = float(balance / 12)
upper_bound = (balance * (1 + monthly_interest)**12) / 12.0
epsilon = 0.01
ans = float(lower_bound + upper_bound) / 2

while abs((balance * (1 + monthly_interest)**12) / 12.0) >= epsilon:

    ans = float(lower_bound + upper_bound) / 2
    total = float(ans * 12)
    new_balance = 0
    interest = 0

    for month in range(0, 12):
        interest += ans + (1 + monthly_interest)
        new_balance += ans + interest

    if new_balance > balance:
        upper_bound = ans
        print "low" + str(new_balance)
    elif new_balance < balance:
        lower_bound = ans
        print "high" + str(new_balance)
    else:
        print "What's going on here?"

print "Lowest payment: %r" % ans

1 个答案:

答案 0 :(得分:1)

我相信这里有一些错误,所以首先,你的while是无限循环,因为你使用的条件永远不会收敛到一个解决方案(变量值永远不会在循环内改变)。最重要的是,这种问题似乎是错误的。(

这是我认为你想要做的,你试图找到“每月付款”的上限和下限,并且收敛条件是这些界限之间的差异应该小于一个常数epsilon (换句话说,错误应该小于epsilon)。

在你的循环中你正确地计算中点,这个中点已经考虑了兴趣,但又在计算它。改变上限和下限的条件没有考虑到兴趣所以这部分代码有点乱。

因此,修改这些条件,您的程序实际上会收敛到解决方案:

balance = 320000
annualInterestRate = 0.2

monthly_interest = float(annualInterestRate) / 12.0
lower_bound = float(balance / 12)
upper_bound = (balance * (2 + monthly_interest)**12) / 12.0
epsilon = 0.001
ans = float(lower_bound + upper_bound) / 2
total_debt=balance * (1 + annualInterestRate)
print total_debt
while (upper_bound - lower_bound) >= epsilon:

    ans = float(lower_bound + upper_bound) / 2
    total = float(ans * 12)

    if total > total_debt:
        upper_bound = ans
        print "low " + str(total)
    elif total < total_debt:
        lower_bound = ans
        print "high " + str(total)
    else:
        print "Solution found"
    break


print "Lowest payment: %r" % ans

希望它有所帮助!