Решение уравнений с одной переменной: Python предупреждает о делении на ноль

Написал код, который методом дихотомии решает уравнение, локализуя и уточняя корни. Ошибки нет, но вместо решения получаю предупреждение: RuntimeWarning: divide by zero encountered in log ("деление на ноль, встречающееся в журнале"). Что это может означать?

import numpy as np

def f(x):
    return 1.2-np.log(x)-4*np.cos(2*x)

# Функция метода дихотомии:
def dyhotomy(a,b, ε):
    args=np.arange(a,b,0.001) # 0.001 – шаг; задаем сетку значений на отрезке
    root = 0
    # для совершенствования метода половинного деления (бисекции), который учитывает лишь изменение знака функции,
    # совместим его с методом хорд, учитывающим также отклонение (абсолютную величину). Это ускоряет приближение к корню
    # (ведь чем меньше (по абсолютной величине) значение функции, тем ближе мы находимся к корню)
    while abs(f(b)-f(a)) >= ε:  # пока отрезок больше заданной погрешности, выполняем нижестоящие операции:
        mid = (a+b)/2
        if f(mid) == 0 or f(mid)< ε:
            root = mid
            break
        elif (f(mid) * f(a)) < 0:
            b = mid
        else: a = mid
    root = (a+b)/2
    print(f'Корень функции согласно методу дихотомии находится в точке x = {root}')
    plot(args, root)

# Рисуем график:
def plot(args, root):
    plt.figure(figsize = (10,5)) # Создание новой фигуры с заданным размером

    # Визуальная настройка
    plt.title('Задание 1: ')
    plt.xlabel(r'$x$, Аргумент') # Подпись оси x
    plt.ylabel(r'$Y(x)$, Функция') # Подпись оси y

    plt.plot(args, f(args), label='Function')

    Root_mask = f(args) == f(root)
    plt.scatter(root, f(root), label = 'Корень функции', color='black', marker='x')

    plt.legend(loc = 'upper center') # Расположение легенды на графике
    plt.grid() # Отображение сетки

    plt.show()


dyhotomy(0,200, 0.0009)


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

Автор решения: MBo

Вы вызываете функцию для интервала с a=0

Для нахождения F(0) вычисляется логарифм нуля - вот и недопустимая операция, которая обозначена как divide by zero

→ Ссылка
Автор решения: Alexandr1234567890
  import numpy as np
#print(np.log(0))
def f(x):
    return 1.2-np.log(x)-4*np.cos(2*x)

# Функция метода дихотомии:
def dyhotomy(a,b, ε):
    assert a!=0,  'a равно 0'
    assert b!=0, 'b равно 0'
    args=np.arange(a,b,0.001) # 0.001 – шаг; задаем сетку 
   значений на отрезке
        root = 0
    # для совершенствования метода половинного 
деления (бисекции), который учитывает лишь 
изменение знака функции,
    # совместим его с методом хорд, учитывающим также 
отклонение (абсолютную величину). Это ускоряет 
приближение к корню
   # (ведь чем меньше (по абсолютной величине) 
значение функции, тем ближе мы находимся к корню)
    print('b',b,)
    print('  f(b) ',f(b))
    print('f(a)',f(a))
    while abs(f(b)-f(a)) >= ε:  # пока отрезок больше 
заданной погрешности, выполняем нижестоящие 
операции:
        #print( abs(f(b)-f(a))  )
        mid = (a+b)/2
        #print('mid',mid)
     #   print(f(mid))
        if f(mid) == 0 or f(mid)< ε:
            root = mid
         elif (f(mid) * f(a)) < 0:
            print('<0')
            b = mid
        else: a = mid
    root = (a+b)/2
    print(f'Корень функции согласно методу дихотомии 
находится в точке x = {root}')
dyhotomy(1000,1000, 0.0009)
→ Ссылка