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


import numpy as np
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec


# ==================== ВАРИАНТ 7 (ЛБ6) ====================
# Уравнение: x = ln(x + 7) / 5
# phi(x) = ln(x + 7) / 5

def phi(x):
    """Функция итерации: φ(x) = ln(x+7)/5"""
    return np.log(x + 7) / 5


def dphi(x):
    """Производная: φ'(x) = 1 / (5 * (x + 7))"""
    return 1 / (5 * (x + 7))


def f_original(x):
    """Исходное уравнение f(x) = x - phi(x) = 0"""
    return x - np.log(x + 7) / 5


def simple_iteration(x0, eps=1e-6, max_iter=100):
    """
    Метод простых итераций
    """
    iterations = []
    x_prev = x0

    for i in range(max_iter):
        x_new = phi(x_prev)
        error = abs(x_new - x_prev)

        iterations.append({
            'iter': i + 1,
            'x_prev': x_prev,
            'x_new': x_new,
            'error': error
        })

        if error < eps:
            break

        x_prev = x_new

    return x_new, iterations


# ==================== НАСТРОЙКИ ====================
a, b = -2, 2  # Интервал поиска
x0 = 0.0  # Начальное приближение
eps = 1e-6  # Точность

print("=" * 70)
print("МЕТОД ПРОСТЫХ ИТЕРАЦИЙ - ВАРИАНТ 7")
print("=" * 70)
print(f"Уравнение: x = ln(x + 7) / 5")
print(f"Интервал поиска: [{a}, {b}]")
print(f"Начальное приближение x0: {x0}")

# 1. Проверка условия сходимости |phi'(x)| < q < 1
x_check = np.linspace(a, b, 100)
q_values = np.abs(dphi(x_check))
q_max = np.max(q_values)

print(f"\n1. ПРОВЕРКА СХОДИМОСТИ:")
print(f"   Максимальное значение |φ'(x)| на интервале: {q_max:.5f}")
if q_max < 1:
    print(f"   ✓ Условие сходимости ВЫПОЛНЯЕТСЯ (q = {q_max:.5f} < 1)")
else:
    print(f"   ✗ Условие сходимости НЕ выполняется")

# 2. Решение
print(f"\n2. РЕШЕНИЕ (точность {eps}):")
print("-" * 70)
print(f"{'№':<5} {'x_n':<15} {'x_{n+1}':<15} {'|x_{n+1}-x_n|':<15}")
print("-" * 70)

root, iterations = simple_iteration(x0, eps)

for it in iterations:
    print(f"{it['iter']:<5} {it['x_prev']:<15.8f} {it['x_new']:<15.8f} {it['error']:<15.8e}")

print("-" * 70)
print(f"Корень найден: x = {root:.10f}")
print(f"Количество итераций: {len(iterations)}")

# ==================== ВИЗУАЛИЗАЦИЯ ====================
plt.style.use('seaborn-v0_8-whitegrid')
fig = plt.figure(figsize=(15, 10))
gs = GridSpec(2, 2, figure=fig, hspace=0.3, wspace=0.3)

# --- График 1: График функции и корень ---
ax1 = fig.add_subplot(gs[0, 0])
x_plot = np.linspace(a, b, 500)
y_plot = f_original(x_plot)

ax1.plot(x_plot, y_plot, 'b-', linewidth=2, label='f(x) = x - ln(x+7)/5')
ax1.axhline(0, color='black', linestyle='--', linewidth=1)
ax1.plot(root, 0, 'ro', markersize=10, label=f'Корень: {root:.6f}')
ax1.set_title('График функции f(x)', fontsize=14)
ax1.set_xlabel('x')
ax1.set_ylabel('f(x)')
ax1.legend()
ax1.grid(True, alpha=0.3)

# --- График 2: Диаграмма сходимости (Паутина / Cobweb) ---
ax2 = fig.add_subplot(gs[0, 1])
x_range = np.linspace(a, b, 500)
y_phi = phi(x_range)

# Линии y=x и y=phi(x)
ax2.plot(x_range, x_range, 'k--', linewidth=1.5, label='y = x', alpha=0.5)
ax2.plot(x_range, y_phi, 'g-', linewidth=2, label='y = φ(x)')

# Построение "паутины" итераций
# Берем первые несколько итераций для наглядности, чтобы не перегружать график
iter_count_cobweb = min(10, len(iterations))
x_cobweb = [x0]
y_cobweb = [0]

for i in range(iter_count_cobweb):
    curr_x = x_cobweb[-1]
    curr_y = phi(curr_x)

    # Вертикальная линия (к графику phi)
    x_cobweb.append(curr_x)
    y_cobweb.append(curr_y)

    # Горизонтальная линия (к диагонали y=x)
    x_cobweb.append(curr_y)
    y_cobweb.append(curr_y)

ax2.plot(x_cobweb, y_cobweb, 'r-', linewidth=1.5, alpha=0.8, label='Итерации')
ax2.plot(x0, phi(x0), 'mo', markersize=8, label='x0')
ax2.plot(root, root, 'ro', markersize=8, label='Корень')

ax2.set_title('Диаграмма сходимости (Cobweb Plot)', fontsize=14)
ax2.set_xlabel('x')
ax2.set_ylabel('y')
ax2.legend()
ax2.grid(True, alpha=0.3)
ax2.set_xlim(a, b)
ax2.set_ylim(a, b)




plt.suptitle('Лабораторная работа №6: Метод простых итераций (Вариант 7)', fontsize=16, fontweight='bold')
plt.show()