Ошибка ZeroDivisionError: division by zero в matplotlib.pyplot
Вот сама ошибка:
Алгоритм квадратичної апроксімації
Traceback (most recent call last):
File "main.py", line 42, in <module>
f1 = f(x1)
File "main.py", line 6, in f
return 3 * x ** 2 + (12 / x ** 3) - 5
ZeroDivisionError: division by zero
Ошибка происходить в 42 строке f1 = f(x1), но я не могу понять причину.
Вот сам код:
import numpy as n
import matplotlib.pyplot as pl
def f(x):
return 3 * x ** 2 + (12 / x ** 3) - 5
x4=n.linspace(0.1,5,100)
F1 = f(x4)
pl.plot(x4,F1,'g--',label='Fun')
pl.grid()
pl.legend()
pl.show()
x1 = 0
d = 1
e1 = 1e-3
e2 = 1e-3
n = 0
import math
print('Алгоритм квадратичної апроксімації')
def opt(w, a, b, c, d):
if w < a:
c = b
while a > w:
a -= d
elif w > c:
a = b
while c < w:
c += d
elif w < b:
c = b
elif w > b:
a = b
else:
w = b
return a, w, c
x2 = x1 + d
f1 = f(x1)
f2 = f(x2)
if f1 > f2:
x3 = x1 + 2 * d
_x = x2
else:
x3 = x1 - d
_x = x1
f3 = f(x3)
fmin = min(f1, f2, f3)
f_x = max(f1, f2, f3)
tmp = sorted([(f1, x1), (f2, x2), (f3, x3)])
fmin, xmin = tmp[0]
x1, x2, x3 = sorted([x1, x2, x3])
while abs(xmin - _x) > e1 or abs(fmin - f_x) > e2:
n += 1
x1, x2, x3 = opt(_x, x1, x2, x3, d)
f1 = f(x1)
f2 = f(x2)
f3 = f(x3)
# нахождение минимума из трех функций
tmp = sorted([(f1, x1), (f2, x2), (f3, x3)])
fmin, xmin = tmp[0]
# определение коэф. для квадратичной аппроксимации
a0 = f1
a1 = (f2 - f1) / (x2 - x1)
a2 = (1 / (x3 - x2)) * (((f3 - f1) / (x3 - x1)) - ((f2 - f1) / (x2 - x1)))
# определение _x и значения f(_x)
_x = (x2 + x1) / 2 - a1 / (2 * a2)
f_x = f(_x)
print('fmin =', fmin, 'xmin =', xmin)
print('N =', n)
print('f_x =', f_x, '_x =', _x)
print('Знайти мінімум заданої функції за допомогою "minimize_scalar"')
from scipy.optimize import minimize_scalar
res = minimize_scalar(f)
print(res)
Ответы (2 шт):
Автор решения: MaxU
→ Ссылка
Сделайте функцию "вычислительно устойчивой", добавив "эпсилон" к знаменателю - это позволит избежать ошибки "деления на ноль":
def f(x):
return 3 * x ** 2 + (12 / (x ** 3 + 1e-7) ) - 5
# NOTE: ------------------------> ^^^^^^
Автор решения: Shamus Rezol
→ Ссылка
3 * x ** 2 + (12 / x ** 3) - 5
В этом выражении часть 12 / x ** 3 при x = 0 может преобразоваться как 12 / 0 ** 3 или 12 / 0. Следствие: ZeroDivisionError.
Это и есть причина возникновения ошибки. Вызов f(x) в точке x, где функция не существует.