Метод деления пополам, чтобы найти норму сбережений - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь решить эту проблему:

Первоначальный взнос имущества составляет $ 2500000. Я собираюсь накопить на эту сумму через 36 месяцев. Программа должна запросить у пользователя стартовую годовую зарплату. Ежемесячно зарплата будет повышаться каждые 6 месяцев. Сберегательный счет обеспечивает возврат 4% от текущей суммы на счете.

Мне придется использовать метод деления пополам, чтобы приблизить норму сбережений (часть месячной зарплаты), которая будет зачислена на сберегательный счет. abs (account - down_payment) <= 100 будет в порядке. </p>

Моя идея заключается в том, что программе необходимо выяснить общее количество месяцев, взятых с учетом нормы сбережений, которую она выбирает на каждом шаге деления пополам, принимая во внимание полугодовое повышение, затем сравните его с 36 и улучшите диапазон.

Я действительно запутался в последовательности вычислений, а также в структуре метода деления пополам. Пока что мое понимание этого вопроса таково: общее время l oop выполняет серию делений пополам, чтобы определить точную норму сбережений; ближе к концу оператор if-else используется для фиксации нормы сбережений слишком высокой или низкой; В середине мне нужно рассчитать количество месяцев, чтобы сбережения были достаточно близки к первоначальному взносу.

portion_down_payment = .25
current_savings = 0
number_of_months = 0
semi_annual_raise = .07
total_cost = 100000000
epsilon = 100

annual_salary = float(input('Enter your starting annual salary:'))

down_payment = total_cost*portion_down_payment
monthly_salary = annual_salary/12

steps = 0
low=0
high=10000

while abs(current_savings - down_payment) >= epsilon: 
    saving_rate = (low+high)/(2*10000)
    while current_savings <= down_payment: 
        while number_of_months % 6 == 0 and number_of_months > 0:      # find out timings when salary raise is applied
            monthly_salary += monthly_salary * semi_annual_raise
            break                           
        current_savings += (monthly_salary * saving_rate + current_savings*0.04/12)
        number_of_months += 1
    if number_of_months < 36:
        high = saving_rate
    else:
        low = saving_rate
    steps += 1


print('best saving rate:', saving_rate)
print('steps in bisection search:', steps)

Любая помощь приветствуется!

...