Метод Деления Пополам Бесконечные Цифры С Плавающей Запятой

#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, поэтому эпсилон не имеет никакого отношения к результату вычисленной функции.