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


import numpy as np

def broyden(f, x, eps=1e-5):
    """
    Метод Бройдена для решения системы нелинейных уравнений.
    f: функция, возвращающая вектор невязок
    x: начальное приближение (list или array)
    eps: точность по норме невязки
    """
    it = 0
    n = len(x)
    x = np.array(x, dtype=float).reshape(n, 1)

    # Начальная аппроксимация матрицы Якоби (центральные разности)
    e_vec = np.eye(n) * eps
    J = np.zeros((n, n))
    for i in range(n):
        x_plus = x.copy()
        x_minus = x.copy()
        x_plus[i] += eps
        x_minus[i] -= eps
        J[:, i] = (f(x_plus.flatten()) - f(x_minus.flatten())) / (2 * eps)

    fx = f(x.flatten()).reshape(n, 1)

    while np.linalg.norm(fx) >= eps:
        # Шаг метода Ньютона с текущим якобианом
        dx = -np.linalg.inv(J) @ fx
        x = x + dx
        fx_new = f(x.flatten()).reshape(n, 1)

        # Обновление матрицы Якоби по формуле Бройдена
        dy = fx_new - fx
        J = J + (dy @ dx.T) / (dx.T @ dx)

        fx = fx_new
        it += 1

    return x.flatten(), fx.flatten(), it

# Определение системы уравнений:
# 1) cos(x1) + x2 - 0.5 = 0
# 2) 1/(x1+1.5) - x2 - 1 = 0
def f(x):
    x1, x2 = x[0], x[1]
    f1 = np.cos(x1) + x2 - 0.5
    f2 = 1.0 / (x1 + 1.5) - x2 - 1.0
    return np.array([f1, f2])

# Запуск с начальным приближением [0.3, 0.3]
x_sol, residual, iterations = broyden(f, [0.3, 0.3])

print("Решение методом Бройдена:")
print(f"x1 = {x_sol[0]:.6f}, x2 = {x_sol[1]:.6f}")
print(f"Количество итераций: {iterations}")
print(f"Невязка: ||F|| = {np.linalg.norm(residual):.2e}")