import math
# Функция варианта 7
def f(x):
return 0.85 * x**2 - 4.148 * x + 7.71
# ---------------- ДИХОТОМИЯ ----------------
def dichotomy(a, b, eps):
delta = eps / 2
iterations = 0
while (b - a) > eps:
x0 = (a + b) / 2
x1 = x0 - delta
x2 = x0 + delta
if f(x1) < f(x2):
b = x2
else:
a = x1
iterations += 1
xmin = (a + b) / 2
return xmin, f(xmin), iterations
# ------------- ЗОЛОТОЕ СЕЧЕНИЕ -------------
def golden_section(a, b, eps):
tau = (math.sqrt(5) - 1) / 2
x1 = a + (1 - tau) * (b - a)
x2 = a + tau * (b - a)
f1 = f(x1)
f2 = f(x2)
iterations = 0
while (b - a) > eps:
if f1 < f2:
b = x2
x2 = x1
f2 = f1
x1 = a + (1 - tau) * (b - a)
f1 = f(x1)
else:
a = x1
x1 = x2
f1 = f2
x2 = a + tau * (b - a)
f2 = f(x2)
iterations += 1
xmin = (a + b) / 2
return xmin, f(xmin), iterations
# ---------------- ФИБОНАЧЧИ ----------------
def fibonacci_method(a, b, eps):
# Создаем числа Фибоначчи
fib = [1, 1]
while fib[-1] < (b - a) / eps:
fib.append(fib[-1] + fib[-2])
n = len(fib) - 1
x1 = a + (fib[n - 2] / fib[n]) * (b - a)
x2 = a + (fib[n - 1] / fib[n]) * (b - a)
f1 = f(x1)
f2 = f(x2)
iterations = 0
for i in range(1, n - 1):
if f1 < f2:
b = x2
x2 = x1
f2 = f1
x1 = a + (fib[n - i - 2] / fib[n - i]) * (b - a)
f1 = f(x1)
else:
a = x1
x1 = x2
f1 = f2
x2 = a + (fib[n - i - 1] / fib[n - i]) * (b - a)
f2 = f(x2)
iterations += 1
xmin = (a + b) / 2
return xmin, f(xmin), iterations
# ---------------- ЗАПУСК ----------------
a = 1
b = 6
eps = 0.01
x, y, n = dichotomy(a, b, eps)
print("Метод дихотомии")
print("xmin =", round(x, 5))
print("f(xmin) =", round(y, 5))
print("итераций =", n)
print()
x, y, n = golden_section(a, b, eps)
print("Метод золотого сечения")
print("xmin =", round(x, 5))
print("f(xmin) =", round(y, 5))
print("итераций =", n)
print()
x, y, n = fibonacci_method(a, b, eps)
print("Метод Фибоначчи")
print("xmin =", round(x, 5))
print("f(xmin) =", round(y, 5))
print("итераций =", n)