Загрузка данных


import math

# функция

def f(x):

    return 0.85*x**2 - 4.148*x + 7.71

# --- 1. Метод дихотомии ---

def dichotomy(a, b, eps):

    delta = eps / 2

    while (b - a) > eps:

        x0 = (a + b) / 2

        x1 = x0 - delta

        x2 = x0 + delta

        if f(x1) < f(x2):

            b = x2

        else:

            a = x1

    x_min = (a + b) / 2

    return x_min, f(x_min)

# --- 2. Метод золотого сечения ---

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)

    while (b - a) > eps:

        if f1 > f2:

            a = x1

            x1 = x2

            f1 = f2

            x2 = a + tau * (b - a)

            f2 = f(x2)

        else:

            b = x2

            x2 = x1

            f2 = f1

            x1 = a + (1 - tau) * (b - a)

            f1 = f(x1)

    x_min = (a + b) / 2

    return x_min, f(x_min)

# --- 3. Метод Фибоначчи ---

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)

    for k in range(1, n-1):

        if f1 > f2:

            a = x1

            x1 = x2

            f1 = f2

            x2 = a + (fib[n-k-1] / fib[n-k]) * (b - a)

            f2 = f(x2)

        else:

            b = x2

            x2 = x1

            f2 = f1

            x1 = a + (fib[n-k-2] / fib[n-k]) * (b - a)

            f1 = f(x1)

    x_min = (a + b) / 2

    return x_min, f(x_min)

# --- запуск ---

a, b = 1, 6

eps = 0.01

print("Дихотомия:", dichotomy(a, b, eps))

print("Золотое сечение:", golden_section(a, b, eps))

print("Фибоначчи:", fibonacci_method(a, b, eps))