#python #algorithm #bisection
Вопрос:
Я пытаюсь создать программу, использующую метод деления пополам (существует довольно много неиспользуемых переменных и запутанных комментариев, поэтому просто игнорируйте их). Выводимое значение в порядке, за исключением того, что оно застревает в бесконечном цикле и печатает бесконечное количество цифр с плавающей запятой. Разве эпсилон не должен предотвратить это? Вот мой код:
total_cost = 1000000 downpayment = 0.25 amount_needed = total_cost * downpayment annual_salary = int(input("Enter the starting salary: ")) monthly_salary = annual_salary / 12 num_of_months = 36 #needs changing epsilon = .01 num_of_guesses = 0 low = 0 high = 100 ans = (high low) / 2.0 ans = round(ans, 2) #might need changing while (num_of_months * (monthly_salary * (ans / 100)))**2 - amount_needed gt;= epsilon: print("Low:", low, "High:", high, "Answer:", ans) num_of_guesses = num_of_guesses 1 if num_of_months * (monthly_salary * (ans / 100)) lt; amount_needed: low = ans elif num_of_months * (monthly_salary * (ans / 100)) gt; amount_needed: high = ans ans = (high low) / 2.0 ans = round(ans, 2) print("Number Of Guesses: ", num_of_guesses)
Наверное, это что-то действительно глупое, но я, честно говоря, не знаю, что происходит XD
Комментарии:
1. Вместо того, чтобы просить нас игнорировать неиспользуемые переменные и сбивающие с толку комментарии, вы могли бы просто удалить их, чтобы нам было легче читать ваш код.
2. Что
ans**2 - 100
должно представлять собой? Вы тестируете это, чтобы определить, когда следует завершить цикл, но вы абсолютно ничего не делаете для настройкиans
, чтобы свести это выражение к минимуму. Вместо этого вы приспосабливаетесьans
, чтобы попытаться удовлетворить уравнениюnum_of_months * (monthly_salary * (ans / 100)) == amount_needed
— так что ошибка в этом уравнении-это то, с чем вы должны сравниватьepsilon
.3. Если я правильно понимаю, вы ищете решения y = f(x), где y равно 0, и вы хотите разделить интервалы пополам по оси x и проверить эпсилон на x. Поэтому вам, возможно, будет проще написать эту функцию отдельно, а не встраивать ее в свой разделенный пополам код, чтобы вы могли четко понимать, что к чему. Вам не должно быть важно, что такое y, просто больше или меньше 0, поэтому эпсилон не имеет никакого отношения к результату вычисленной функции.