Вычисление корня методом бисекции

Не выдает корень из функции. Вычислял методом бисекции (дихотомии) на python

#const
#точность корня (10е-20)

eps=float(input(print('e')))  

Kw=10**(-14)
Ka=1.75*10**(-5)

#границы а и b на оси абсцисс

a=float(input(print('a')))  
b=float(input(print('b')))

c0=float(input(print('конц-ция')))


f=lambda x: (10**(-2*x)-Kw)/Ka + 10**(-x) + Kw/(10**(-x)) - c0  
 
while abs(f(a)-f(b))>eps:
      q=(a+b)/2
      if f(a)*f(q)<0:
            b=q
      else:
            a=q

print(q)

данные, которые ввожу. далее ничего не выдает:

данные, которые ввожу. далее ничего не выдает


Ответы (1 шт):

Автор решения: Chorkov
  1. Под "точностью вычисления корня" обычно понимают abs(a-b)>eps, а не abs(f(a)-f(b))>eps, поскольку корень - это именно значение x, в котором целевая функция достигает нуля, а не значение функции.

  2. Из-за конечной точности операций с плавающей точкой цикл:

while a!=b:
      a=(a+b)/2

может отказаться как конечным, так и бесконечным. Т.е. a!=b, но (a+b)/2==a, из-за потери последнего бита мантиссы в операции сложения.

Поэтому, рекомендую модифицировать цикл:

while abs(f(a)-f(b))>eps:
      q=(a+b)/2
      if (q==a) or (q==b):
            break # мы не достигли намеченной точности, но точнее посчитать невозможно
      if f(a)*f(q)<0:
            b=q
      else:
            a=q

см. например,: https://docs-python.ru/tutorial/operatsii-chislami-python/problemy-chisel-plavajuschej-zapjatoj/ , https://habr.com/ru/companies/skillfactory/articles/658277/

  1. Ввод чисел обычно делается так:
eps=float(input('e'))  

, тогда не будет лишних None в выводе программы.

  1. Выдаче программы, лучше приводить текстом а не картинкой. (Из окна консоли тоже можно копировать!)
→ Ссылка