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


import numpy as np
import matplotlib.pyplot as plt

# ------------------- Функция для варианта 16 -------------------
def f(x):
    return x**3 + 0.205*x**2 - 10.880*x - 1.469

# ------------------- Метод деления пополам для минимума -------------------
def bisection_min(f, a, b, eps=1e-6):
    """Поиск минимума методом деления пополам (дихотомии)"""
    delta = 1e-5  # малое смещение
    while (b - a) > eps:
        mid = (a + b) / 2
        x1 = mid - delta
        x2 = mid + delta
        if f(x1) < f(x2):
            b = x2
        else:
            a = x1
    return (a + b) / 2

# ------------------- Метод золотого сечения для максимума -------------------
def golden_max(f, a, b, eps=1e-6):
    """Поиск максимума методом золотого сечения"""
    gr = (np.sqrt(5) - 1) / 2  # ~0.618
    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

# ------------------- Метод половинного деления для корня -------------------
def bisection_root(f, a, b, eps=1e-6):
    """Поиск корня методом половинного деления"""
    if f(a) * f(b) >= 0:
        raise ValueError(f"На отрезке [{a},{b}] нет корня или чётное число корней")
    while (b - a) > eps:
        c = (a + b) / 2
        if abs(f(c)) < eps:
            return c
        if f(a) * f(c) < 0:
            b = c
        else:
            a = c
    return (a + b) / 2

# ------------------- Вычисления -------------------
print("=" * 50)
print("Вариант 16: f(x) = x³ + 0.205x² - 10.880x - 1.469")
print("=" * 50)

# Минимум (метод деления пополам)
x_min = bisection_min(f, 1.5, 2.2)
y_min = f(x_min)
print(f"\n1. Локальный минимум (метод деления пополам):")
print(f"   x_min = {x_min:.8f},  f(x_min) = {y_min:.8f}")

# Максимум (метод золотого сечения)
x_max = golden_max(f, -2.2, -1.7)
y_max = f(x_max)
print(f"\n2. Локальный максимум (метод золотого сечения):")
print(f"   x_max = {x_max:.8f},  f(x_max) = {y_max:.8f}")

# Корни (метод половинного деления)
try:
    r1 = bisection_root(f, -3.5, -3.2)
    r2 = bisection_root(f, -0.2, -0.1)
    r3 = bisection_root(f, 3.2, 3.3)
    print(f"\n3. Корни уравнения (метод половинного деления):")
    print(f"   x1 = {r1:.8f},  f(x1) = {f(r1):.2e}")
    print(f"   x2 = {r2:.8f},  f(x2) = {f(r2):.2e}")
    print(f"   x3 = {r3:.8f},  f(x3) = {f(r3):.2e}")
except ValueError as e:
    print(f"Ошибка при поиске корня: {e}")

# ------------------- Построение графика -------------------
x_plot = np.linspace(-5, 5, 500)
y_plot = f(x_plot)

plt.figure(figsize=(10, 6))
plt.plot(x_plot, y_plot, 'b-', linewidth=1.5, label='f(x)')
plt.axhline(0, color='black', linewidth=0.8, linestyle='-')
plt.axvline(0, color='black', linewidth=0.8, linestyle='-')
plt.grid(True, linestyle='--', alpha=0.6)

# Отмечаем корни
plt.plot(r1, f(r1), 'ro', markersize=8, label='Корни')
plt.plot(r2, f(r2), 'ro', markersize=8)
plt.plot(r3, f(r3), 'ro', markersize=8)

# Отмечаем экстремумы
plt.plot(x_min, y_min, 'g^', markersize=10, label='Минимум')
plt.plot(x_max, y_max, 'mv', markersize=10, label='Максимум')

# Оформление
plt.title('Функция f(x) = x³ + 0.205x² - 10.880x - 1.469', fontsize=14)
plt.xlabel('x', fontsize=12)
plt.ylabel('f(x)', fontsize=12)
plt.legend(fontsize=11)
plt.tight_layout()

# Сохраняем график в файл (на случай, если окно не откроется)
plt.savefig('plot_variant16.png', dpi=150)
print("\n4. График сохранён в файл 'plot_variant16.png'")

# Показываем график на экране
plt.show()

print("\nПрограмма завершена.")
input("Нажмите Enter для выхода...")