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


import numpy as np
import matplotlib.pyplot as plt

def f(x):
    return x**3 + 0.205*x**2 - 10.880*x - 1.469

# === Ваш метод золотого сечения (максимум) ===
def golden_max(a, b, eps=1e-6):
    gr = (np.sqrt(5) - 1) / 2
    x1 = b - gr * (b - a)
    x2 = a + gr * (b - a)
    f1 = f(x1)
    f2 = f(x2)
    while (b - a) > eps:
        if f1 >= f2:
            b = x2
            x2 = x1
            f2 = f1
            x1 = b - gr * (b - a)
            f1 = f(x1)
        else:
            a = x1
            x1 = x2
            f1 = f2
            x2 = a + gr * (b - a)
            f2 = f(x2)
    return (a + b) / 2

# Поиск максимума
x_max = golden_max(-2.2, -1.7)
y_max = f(x_max)

# === ПРОСТОЕ ДОБАВЛЕНИЕ: второй экстремум (минимум) ===
# Производная: 3x^2 + 0.41x - 10.88 = 0
d = 0.41**2 - 4*3*(-10.88)
x_min = (-0.41 + np.sqrt(d)) / (2*3)   # больший корень — минимум
y_min = f(x_min)

# === КОРНИ (просто через numpy) ===
coeff = [1, 0.205, -10.880, -1.469]
roots = np.roots(coeff)
real_roots = [r.real for r in roots if abs(r.imag) < 1e-10]

# Печать
print("Метод золотого сечения (максимум):")
print(f"x_max = {x_max:.8f}, f = {y_max:.8f}")
print("\nМинимум (аналитически):")
print(f"x_min = {x_min:.8f}, f = {y_min:.8f}")
print("\nКорни:")
for i, r in enumerate(real_roots, 1):
    print(f"  x{i} = {r:.8f}, f = {f(r):.2e}")

# === График с отметками ===
xs = np.linspace(-5, 5, 500)
plt.plot(xs, f(xs), 'b-', label='f(x)')
plt.plot(x_max, y_max, 'ro', markersize=8, label='Максимум')
plt.plot(x_min, y_min, 'bo', markersize=8, label='Минимум')
for r in real_roots:
    plt.plot(r, 0, 'gx', markersize=10, label='Корень' if r == real_roots[0] else "")

plt.grid(True)
plt.title("Кубическая функция: экстремумы и корни")
plt.xlabel('x')
plt.ylabel('f(x)')
plt.legend()
plt.show()