Python

Как запустить метод перебора для уравнения

Есть код:

def brute_force(f, a, b, step=0.1):
x_min = a
y_min_abs = abs(f(a))
x = a + step
while x < b:
y = abs(f(x))
if y < y_min_abs:
x_min = x
y_min_abs = y
x += step
return x_min

Уравнение: x^3 −x^2 + 30 = 0
Итервал: x приндлежит [-6:0]
Если уж выбирать такой неэффективный численный метод, то я хотя бы сделала уменьшаемый шаг:
 def f(x): return x * x * (x - 1) + 30 
a, b, h, errmin, ε = -6.0, 0.0, 0.1, 1e303, float(input('ε: '))
while True:
n = (b - a) / h
for i in range(1 + int((b - a) / h)):
x = a + i * h; err = abs(f(x))
if err < errmin: errmin, X = err, x
if errmin < ε: break
else: a, b = X - h, X + h; h /= 10
print(X)
А это для проверки найденного корня с корнем, найденным методом касательных (их, эти два кода, в принципе можно объединить в одну программу), в котором начальное значение х находится посерёдке промежутка [-6;0]:
 h, d, x, X = 1e-4, 2e-4, -3, [-3] 
while True:
x -= f(x) * d / (f(x + h) - f(x - h))
if x in X: print(x); break
else: X.append(x)

Вводим точность вычислений (например,
ε=1e-14) и получаются одинаковые результаты для обеих программ. А при полном переборе для получения корня с такой точностью шаг должен быть очень мелким и сколько будет работать такая программа - одному Богу известно, а так как бога нет, то никому неизвестно...
Роман Савватеев
Роман Савватеев
66 572
Лучший ответ