Решить уравнение методом Дихотомии
Решить уравнение с диапазоном (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 шт):
У вас 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, ещё ближе к нулю будет, я проверял.
А разве дихотомия - это не вот такое:
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)