import numpy as np

# Вектор функций F(x, y, z)
def F(X):
    x, y, z = X
    return np.array([
        x**2 + x - y*z - 0.1,
        -3*y + y**2 - x*z + 0.2,
        2*z + z**2 + x*y - 0.3
    ], dtype=float)

# Базовое отображение φ0 (без релаксации)
def phi0(X):
    x, y, z = X
    return np.array([
        -x**2 + y*z + 0.1,
        (y**2 - x*z + 0.2) / 3.0,
        (-z**2 - x*y + 0.3) / 2.0
    ], dtype=float)

# Релаксированное отображение φ = X + λ(φ0(X) - X)
def phi(X, lam=0.24):
    return X + lam * (phi0(X) - X)

def simple_iterations(x0, eps=1e-6, lam=0.24, max_iter=100):
    X = np.array(x0, dtype=float)

    print("Метод простых итераций (λ = %.2f)" % lam)
    print("k\t     x_k\t\t     y_k\t\t     z_k\t\tmax|F_i(x_k)|")

    for k in range(1, max_iter + 1):
        X_new = phi(X, lam)
        r = F(X_new)
        r_max = np.max(np.abs(r))

        print(f"{k:2d}\t{X_new[0]: .8f}\t{X_new[1]: .8f}\t"
              f"{X_new[2]: .8f}\t{r_max: .2e}")

        if r_max < eps:
            print("Достигнута точность ε =", eps)
            break

        X = X_new

    return X_new

# Старт из аналитического приближения
x0 = [0.10, 0.07, 0.15]
root_iter = simple_iterations(x0)

print("\nИтог (метод простых итераций):")
print("x =", root_iter[0])
print("y =", root_iter[1])
print("z =", root_iter[2])
print("Невязки F(x):", F(root_iter))
