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}")
A