Вычисление корня методом бисекции
Не выдает корень из функции. Вычислял методом бисекции (дихотомии) на 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 шт):
Под "точностью вычисления корня" обычно понимают
abs(a-b)>eps, а неabs(f(a)-f(b))>eps, поскольку корень - это именно значение x, в котором целевая функция достигает нуля, а не значение функции.Из-за конечной точности операций с плавающей точкой цикл:
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/
- Ввод чисел обычно делается так:
eps=float(input('e'))
, тогда не будет лишних None в выводе программы.
- Выдаче программы, лучше приводить текстом а не картинкой. (Из окна консоли тоже можно копировать!)
