Решить уравнение методом Дихотомии

Решить уравнение с диапазоном (e^x)+(x^2)-2=0 [-4, -1,2] методом дихотомии

После написания программы Python не выдает ошибок и ответа соответственно. Что не так в моей программе? Буду благодарен если кто-то поможет мне ее править.

from math import *
from decimal import *


def f(value):
    return exp(value) + value**2 - 2


a, b, eps, x = -4, -1.2, float(input()), -4
f1 = f(a)
f2 = f(x)
while eps <= 0:
    print("Введите положительное значение точности", end=" ")
    eps = float(input())
if eps > 1:
    eps = 1/eps
dx = (b - a) * eps
while x <= b:
    x += dx
    if f1 * f2 < 0:
        print(Decimal(x - 0.5*dx), '\n')
        break
    f1 = f2

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

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

У вас f2 не пересчитывается внутри цикла, оно вычисляется только один раз до начала цикла. В результате цикл просто доходит до конца отрезка, не находя нужного результата. Если я правильно понял, нужно вычислять f2 внутри цикла после изменения x:

while x <= b:
    x += dx
    f2 = f(x) # <-- ПЕРЕСЧИТЫВАЕМ f2
    if f1 * f2 < 0:
        print(Decimal(x - 0.5*dx), '\n')
        break
    f1 = f2

В этом случае получается такой результат, если ввести 100000:

-1.3159620000079581547680618314188905060291290283203125

Проверим ответ (e берётся из уже импортированного модуля math):

x = -1.3159620000079581547680618314188905060291290283203125
print((e**x)+(x**2)-2)

Вывод:

-2.7839407759522317e-05

Близко к нулю, с погрешностью именно на заданную точность. Если ещё уменьшить eps, ещё ближе к нулю будет, я проверял.

→ Ссылка
Автор решения: Zhihar

А разве дихотомия - это не вот такое:

import math

def sign(x):
    return bool(x > 0) - bool(x < 0)

def f(value):
    return math.exp(value) + value**2 - 2

old = -4
new = -1.2

f_old = f(old)
f_new = f(new)

while True:
    tmp = (old + new) / 2
    f_tmp = f(tmp)

    if abs(tmp - old) < 0.0000001:
        break

    if sign(f_tmp) == sign(f_old):
        old, f_old = tmp, f_tmp
    else:
        new, f_new = tmp, f_tmp

print("x = ", (old + new) / 2)
→ Ссылка