麻省理工学院的“二分搜索”

时间:2012-10-17 00:52:08

标签: python bisection

我碰巧找到了这段代码,似乎运行良好。令人惊讶的是,(通过检查,麻省理工学院课程)它只有在年利率为0.15时才会失败,对其他情况来说是可以的。我是一个新手,所以我今天没有任何希望解决它,但如果有人能就这个问题给我一些启示,我将非常感激!

balance=294272
annualInterestRate=0.15

payment=(balance * (1 + annualInterestRate/12)**12) / 12
count=0
total=0
inicialbalance=balance
while balance>0:
    for month in range(1,13):
        interest=(balance-payment)*(annualInterestRate/12)
        balance=(balance-payment)*(1+(annualInterestRate/12))
        total=total+payment
        finalbalance=balance-total
        if balance <=0:
            print('Balance Paid Off @ '+str(round(payment,2)) + ' Total Paid is:       '+str(round(total,2))+ ' ending balance: ' +str(round(balance,2))) 
            print('Lowest Payment: ' + str(round(payment,2)))
            break
    if balance <-0.01 or balance >0.01:
        print('Payment at ' + str(payment) + ' ending balance : ' + str(balance))
        print('Payment will adjust to: ' + str(payment + 10))
        payment=payment+(balance/12)
        count=count+1
        balance=inicialbalance
    total=0
    #if count >200:
        #print('count is > ' +str(count)+ ' aborting')
        #break
    #if balance <=0:
        #print('balance paid off at ' + str(payment) + ' after ' + str(mth))
print('Lowest Payment: ' + str(round(payment,2)))`

结果:

{Balance Paid Off @ 42279.71 Total Paid is: 465076.8 ending balance: -359.78
Lowest Payment: 42279.71
Payment at 42279.7094717 ending balance : -359.781977705
Payment will adjust to: 42289.7094717
Balance Paid Off @ 42249.73 Total Paid is: 464747.0 ending balance: -4.19
Lowest Payment: 42249.73
Payment at 42249.7276402 ending balance : -4.18662043777
Payment will adjust to: 42259.7276402
Balance Paid Off @ 42249.38 Total Paid is: 464743.17 ending balance: -0.05
Lowest Payment: 42249.38
Payment at 42249.3787552 ending balance : -0.0487178117574
Payment will adjust to: 42259.3787552
Balance Paid Off @ 42249.37 Total Paid is: 464743.12 ending balance: -0.0
Lowest Payment: 42249.37
balance paid off at 42249.3746954 after 11
Lowest Payment: 42249.37}

1 个答案:

答案 0 :(得分:1)

我认为条件

if balance <=0:
    break
for month in range(1,13):内的

是错误的。 如果付款太大以至于11次付款而非12次付款后余额变为负值,则循环会过早中断。我认为这是42249.37的过度支付所发生的事情。

balance = 437092
annualInterestRate = 0.15
payment=(balance * (1 + annualInterestRate/12)**12) / 12
count=0
total=0
inicialbalance=balance
while balance>0:
    for month in range(1,13):
        interest=(balance-payment)*(annualInterestRate/12)
        balance = (balance-payment) + interest
        total += payment
        finalbalance = balance-total
    if balance <-0.01 or balance>0.01:
        print('Payment at ' + str(payment) + ' ending balance : ' + str(balance))
        payment=payment+(balance/12)
        print('Payment will adjust to: ' + str(payment))
        count=count+1
        balance=inicialbalance
    else:
        break
    total=0
print('Lowest Payment: ' + str(round(payment,2)))

产量

Payment at 42279.7094717 ending balance : -43172.4850925
Payment will adjust to: 38682.0023807
Payment at 38682.0023807 ending balance : 3673.67604215
Payment will adjust to: 38988.1420508
Payment at 38988.1420508 ending balance : -312.604095728
Payment will adjust to: 38962.0917095
Payment at 38962.0917095 ending balance : 26.6004186392
Payment will adjust to: 38964.3084111
Payment at 38964.3084111 ending balance : -2.26350928031
Payment will adjust to: 38964.1197853
Payment at 38964.1197853 ending balance : 0.192608783082
Payment will adjust to: 38964.1358361
Payment at 38964.1358361 ending balance : -0.0163896580426
Payment will adjust to: 38964.1344702
Lowest Payment: 38964.13