Я не уверен, как учесть 36-месячный период в моем поиске пополам - PullRequest
0 голосов
/ 12 апреля 2019

Предупреждение, я только начал изучать Python, поэтому, пожалуйста, помните о моем коде для начинающих.

Итак, в курсе MIT6_0001 по питону.Вы столкнулись с проблемой, когда вы должны найти «оптимальную месячную норму сбережений» для первоначального взноса 25% на дом за 1 миллион долларов в течение 36 месяцев, используя алгоритм поиска по разделению пополам, где ваша начальная зарплата составляет 150 000 иполугодовой рост 7%.Вы также должны учитывать ежегодную рентабельность инвестиций 4% на ваши сбережения.

Я работаю над этим уже неделю.сначала я попробовал это без цикла for, и это в значительной степени вернуло наилучшую норму сбережений как 100%, в чем заключается моя главная проблема, я не могу обойти тот факт, что каждый раз, когда я делю пополам значение, оно всегда будет низким, поэтомуон просто пытается приблизиться и приблизиться к 1, пока значение epsilon не будет достигнуто в цикле while.Я серьезно теряю сон из-за этого, пожалуйста помогите

total_cost = 1000000
annual_salary =150000
current_savings = 0
epsilon = 100
low = 0
high = 10000
savings_rate= (low + high)/2
down_payment = .25 * total_cost 
raise_rate = .07
month_count = 0
r = .04/12
step_count = 0 


while current_savings-down_payment <= epsilon :
    for i in range(36):
        if month_count != 0 and month_count % 6 == 0:
            annual_salary += annual_salary * raise_rate 
        current_savings += current_savings * r + (annual_salary/12) * (savings_rate/10000)         

        if  current_savings < down_payment:
            low = savings_rate
            print("low =",low)    
        else:
            high = savings_rate
            print("high =",high)

        month_count += 1
        savings_rate= (low + high)/2
step_count += 1
print("Best savings rate:​ ",savings_rate/10000)
print("Steps in bisection sear: ",step_count)  

ожидаемый результат Лучшая норма сбережений: 0,4411
Шаги в поиске деления пополам: 12

фактическая Лучшая норма сбережений: 0,5
Шаги по поиску пополам: 1

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

Я разобрался с решением.

total_cost = 1000000
annual_salary = 150000
current_savings = 0
epsilon = 100
low = 0
high = 10000
down_payment = .25 * total_cost
raise_rate = .07
r = .04/12
step_count = 0



while abs(current_savings - down_payment) >= epsilon:
    savings_rate = float(low + high) / 2.0  #take care of integer division
    current_savings = 0 # reset for next itteration
    annual_salary = 150000 #reset for next itteration

#    print("savings_rate = %f " % (savings_rate/10000)) #4debugging
#    print("current_savings= ", current_savings) #4debugging

    for i in range(1,36): #initiate range at 1, easier to handle 6 month raise 
        if i != 1 and i % 6 == 0:
            annual_salary += annual_salary * raise_rate
        current_savings += current_savings * r + (annual_salary/12) * (savings_rate/10000)
#        print("count =",i) #4debugging
#        print("annual_salary: ", annual_salary) #4debugging

    print ("current_savings=%f, down_payment=%f" % (current_savings, down_payment) )
    print ("diff = %f " % abs(current_savings - down_payment) )

    if (step_count > 20): 
        print('**********ERROR**********: inf loop') 
        break # exit infinite loop         

    elif current_savings < down_payment:
        low = savings_rate #update range low if less than down payment
        print("new range: %f -> %f" % (low, high) )

    elif current_savings > down_payment:
        high = savings_rate #update range high if greater than down payment
        print("new range: %f -> %f" % (low, high) )

    print("")
    step_count += 1 

print ("current_savings=%f, down_payment=%f" % (current_savings, down_payment) )
print ("diff = %f " % abs(current_savings - down_payment) )
print("best savings rate: ",savings_rate/10000)
print("number of bisection steps: ",step_count)
0 голосов
/ 12 апреля 2019

Помните, что наша цель - взять непрерывную функцию и найти приблизительные точки, где она равна нулю на нашем графике.Наша функция в этом случае - abs(current_savings-down_payment)-epsilon = 0. Я думаю, что проблема в том, что у вас есть то, что абсолютное значение текущих сбережений за вычетом авансового платежа должно быть меньше, чем эпсилон, и вы проверяете, больше ли оно, чем эпсилон.

...