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


# ======================================================================
# 2. Метод Ньютона (адаптирован для новой системы)
# Система:
#   1) 2^x1 - x2 - 1.5 = 0
#   2) ln(x1+1.5) + x2 - 0.2 = 0
# ======================================================================

import numpy as np

# Определение системы уравнений
def F(x):
    """Вектор функций: [F1, F2]"""
    x1, x2 = x[0], x[1]
    f1 = 2**x1 - x2 - 1.5
    f2 = np.log(x1 + 1.5) + x2 - 0.2
    return np.array([f1, f2], dtype=float)

# Матрица Якоби
def Jacobian(x):
    """Матрица Якоби 2x2"""
    x1, x2 = x[0], x[1]
    J = np.zeros((2, 2))
    # ∂F1/∂x1 = 2^x1 * ln(2)
    J[0, 0] = (2**x1) * np.log(2)
    # ∂F1/∂x2 = -1
    J[0, 1] = -1.0
    # ∂F2/∂x1 = 1/(x1+1.5)
    J[1, 0] = 1.0 / (x1 + 1.5)
    # ∂F2/∂x2 = 1
    J[1, 1] = 1.0
    return J

# Метод Ньютона по блок-схеме
def newton_system(x0, eps=1e-4, max_iter=100):
    x = np.array(x0, dtype=float)
    ndx = 2.0 * eps
    it = 0

    print("Итерация |       x1        x2      |       F1        F2      |  ||dx||")
    print("-" * 70)

    while ndx > eps and it < max_iter:
        fx = F(x)
        print(f"{it:5d}    | {x[0]:10.6f} {x[1]:10.6f} | {fx[0]:10.6f} {fx[1]:10.6f} | {ndx:10.6f}")

        J = Jacobian(x)
        invJ = np.linalg.inv(J)
        dx = invJ @ fx
        ndx = np.linalg.norm(dx)

        x = x - dx
        it += 1

    fx_final = F(x)
    print(f"{it:5d}    | {x[0]:10.6f} {x[1]:10.6f} | {fx_final[0]:10.6f} {fx_final[1]:10.6f} | {ndx:10.6f}")
    print("\nРешение найдено за", it, "итераций")
    print(f"x1 = {x[0]:.6f}, x2 = {x[1]:.6f}")
    print(f"Невязки: F1 = {fx_final[0]:.2e}, F2 = {fx_final[1]:.2e}")
    return x

if __name__ == "__main__":
    x0 = [0.3, 0.3]
    eps = 0.0001
    solution = newton_system(x0, eps)