Ошибка 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, где функция не существует.

→ Ссылка