Поиск бисекции
Возможный дубликат:
Использование поиска по разделению пополам
Я разместил другую ветку, но она не получила ответов, поэтому я пытаюсь представить некоторые из моих работ, чтобы сделать их более понятными.
Мне нужно использовать метод деления пополам, чтобы определить ежемесячный платеж, чтобы погасить долг точно через год.
Вот некоторый код:
originalBalance = 320000
annualInterestRate = 0.2
monthly_interest = annualInterestRate / 12
low = originalBalance/12
high = (originalBalance*(1 + monthly_interest)**12)/12
epsilon = 0.01
min_payment = (high + low)/2.0
while min_payment*12 - originalBalance >= epsilon:
for month in range(0, 12):
balance = (originalBalance - min_payment) * (1+monthly_interest)
if balance < 0:
low = min_payment
elif balance > 0:
high = min_payment
min_payment = (high + low)/2.0
print "lowest payment: " + str(balance)
Тем не менее, я получаю очень далеко ответ: 298222.173851
Мой друг сказал мне, что правильный ответ: 29157.09
Который намного ниже моего... Я думаю, проблема в округлении (которое я еще не делал) и сохранении баланса после каждого цикла и сбросе его, если баланс больше 0. Я не могу понять, как решить эту проблему и, пожалуйста, помогите кому-нибудь:)
2 ответа
Это правильный.
originalBalance = 320000
annualInterestRate = 0.2
monthly_interest = annualInterestRate / 12
low = originalBalance/12
high = (originalBalance*(1 + monthly_interest)**12)/12
epsilon = 0.01
min_payment = (high + low)/2.0
while min_payment*12 - originalBalance >= epsilon:
for month in range(0, 12):
balance = (originalBalance - min_payment)/10 * (1+monthly_interest)
if balance < 0:
low = min_payment
elif balance > 0:
high = min_payment
min_payment = (high + low)/2.0
print "lowest payment: " + str(balance)
Это то, что вам нужно
while abs(x) > epsilon:
x = balance
for month in range(0, 12):
x = (x - ans) * (1+monthly_interest)