Загрузка данных
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
def f(x):
"""Исходная функция: f(x) = 1/arctan(e^x) - 3"""
return 1 / np.arctan(np.exp(x)) - 3
def chord_method(a, b, eps=1e-6, max_iter=100):
"""
Метод хорд (метод ложного положения)
"""
if f(a) * f(b) >= 0:
print(f"ВНИМАНИЕ: f(a)*f(b) = {f(a) * f(b)}")
print("Функция может не иметь корней на этом интервале")
iterations = []
x_prev = a
fa = f(a)
for i in range(max_iter):
fb = f(b)
# Формула метода хорд
x = a - fa * (b - a) / (fb - fa)
fx = f(x)
# Сохраняем данные для визуализации
iterations.append({
'iter': i + 1,
'a': a,
'b': b,
'x': x,
'f(x)': fx,
'error': abs(x - x_prev) if i > 0 else abs(b - a)
})
# Проверка на сходимость
if abs(fx) < eps or abs(x - x_prev) < eps:
break
# Выбор нового интервала
if fa * fx < 0:
b = x
else:
a = x
fa = fx
x_prev = x
return x, iterations
# ==================== ПАРАМЕТРЫ ====================
a, b = -1, 1 # интервал из задания
eps = 1e-6
print("=" * 80)
print("РЕШЕНИЕ УРАВНЕНИЯ МЕТОДОМ ХОРД - ВАРИАНТ 7")
print("=" * 80)
print(f"Уравнение: f(x) = 1/arctan(e^x) - 3 = 0")
print(f"Интервал: [{a}, {b}]")
print(f"Точность: {eps}")
print("=" * 80)
# ==================== РЕШЕНИЕ ====================
try:
root, iterations = chord_method(a, b, eps)
print("\nИТЕРАЦИИ:")
print("-" * 80)
print(f"{'№':<4} {'a':<12} {'b':<12} {'x':<12} {'f(x)':<15} {'|Δx|':<12}")
print("-" * 80)
for it in iterations:
print(f"{it['iter']:<4} {it['a']:<12.6f} {it['b']:<12.6f} "
f"{it['x']:<12.6f} {it['f(x)']:<15.6e} {it['error']:<12.6e}")
print("-" * 80)
print(f"\n✓ КОРЕНЬ УРАВНЕНИЯ: x = {root:.10f}")
print(f"✓ f(x) = {f(root):.2e}")
print(f"✓ Число итераций: {len(iterations)}")
except Exception as e:
print(f"✗ Ошибка: {e}")
exit(1)
# ==================== ВИЗУАЛИЗАЦИЯ ====================
plt.style.use('seaborn-v0_8-whitegrid')
fig = plt.figure(figsize=(16, 12))
gs = GridSpec(3, 2, figure=fig, hspace=0.3, wspace=0.3)
# График 1: Процесс метода хорд (увеличенный вид)
ax2 = fig.add_subplot(gs[1, 0])
x_zoom = np.linspace(a, b, 500)
y_zoom = f(x_zoom)
ax2.plot(x_zoom, y_zoom, 'b-', linewidth=2, alpha=0.7)
ax2.axhline(y=0, color='k', linestyle='-', linewidth=0.8, alpha=0.5)
# Показываем первые 4 итерации
colors = plt.cm.Set1(np.linspace(0, 1, min(4, len(iterations))))
for i, it in enumerate(iterations[:4]):
a_i, b_i = it['a'], it['b']
x_i = it['x']
# Рисуем хорду
ax2.plot([a_i, b_i], [f(a_i), f(b_i)], '--', color=colors[i],
linewidth=2, alpha=0.8, label=f'Итерация {i + 1}')
ax2.plot(x_i, f(x_i), 'o', color=colors[i], markersize=8,
markerfacecolor='white', markeredgewidth=2)
ax2.annotate(f'x{i + 1}', (x_i, f(x_i)), xytext=(5, 5),
textcoords='offset points', fontsize=9)
ax2.set_xlabel('x', fontsize=11, fontweight='bold')
ax2.set_ylabel('f(x)', fontsize=11, fontweight='bold')
ax2.set_title('Метод хорд: первые итерации', fontsize=13, fontweight='bold')
ax2.legend(fontsize=9)
ax2.grid(True, alpha=0.3)
# Общий заголовок
plt.suptitle('ВАРИАНТ 7: Решение уравнения методом хорд\nf(x) = 1/arctan(e^x) - 3',
fontsize=16, fontweight='bold', y=0.995)
plt.show()
# ==================== ИТОГОВАЯ ТАБЛИЦА ====================
print("\n" + "=" * 80)
print("СВОДНАЯ ТАБЛИЦА РЕЗУЛЬТАТОВ")
print("=" * 80)
print(f"{'Параметр':<40} {'Значение':<25}")
print("-" * 80)
print(f"{'Начальный интервал [a, b]':<40} [{a}, {b}]")
print(f"{'Требуемая точность ε':<40} {eps:.0e}")
print(f"{'Найденный корень x*':<40} {root:.10f}")
print(f"{'Значение f(x*)':<40} {f(root):.2e}")
print(f"{'Число итераций':<40} {len(iterations)}")
print(f"{'Последняя погрешность |Δx|':<40} {iterations[-1]['error']:.2e}")
print(f"{'Последнее |f(x)|':<40} {abs(iterations[-1]['f(x)']):.2e}")
print("=" * 80)
print("\n✓ Решение найдено успешно!")
print("=" * 80)