Решение уравнений с одной переменной: 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)