Загрузка данных
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()