Gorka Sillero
Gorka Sillero

Reputation: 25

"bisection search" for MIT

I happened to find this code, which seems to run fine. Surprisingly, (passing the checkings, for the MIT course) it fails only when the annual interest rate is 0.15, being OK for the other cases. I'm quite a newbie, so I don't have any hope to solve it for today, but if someone could give me some light on the issue, I'd be truly grateful!

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)))`

Results:

{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}

Upvotes: 0

Views: 5495

Answers (1)

unutbu
unutbu

Reputation: 879231

I think the condition

if balance <=0:
    break

inside the for month in range(1,13): is wrong. If payment is so large that the balance goes negative after 11 payments instead of 12 payments, then the loop breaks prematurely. I think that is what is happening with excessively large payment of 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)))

yields

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

Upvotes: 1

Related Questions