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


import numpy as np

# Данные для 7 варианта
x = np.array([
    0.1, 0.2, 0.3, 0.4, 0.5,
    0.6, 0.7, 0.8, 0.9, 1.0,
    1.1, 1.2, 1.3, 1.4, 1.5,
    1.6, 1.7, 1.8, 1.9, 2.0
])

y = np.array([
    -0.10, -0.21,  0.01,  0.05, -0.13,
    -0.23, -0.21, -0.43, -0.57, -0.44,
    -0.44, -0.83, -0.78, -0.81, -1.06,
    -1.41, -1.40, -1.70, -1.96, -1.91
])


def least_squares_poly(x, y, degree):
    coeffs = np.polyfit(x, y, degree)
    poly = np.poly1d(coeffs)
    y_fit = poly(x)
    sse = np.sum((y - y_fit) ** 2)
    return coeffs, poly, sse


def print_polynomial(coeffs):
    degree = len(coeffs) - 1
    parts = []

    for i, coef in enumerate(coeffs):
        power = degree - i

        if abs(coef) < 1e-12:
            continue

        if power > 1:
            parts.append(f"{coef:.6f}x^{power}")
        elif power == 1:
            parts.append(f"{coef:.6f}x")
        else:
            parts.append(f"{coef:.6f}")

    return " + ".join(parts).replace("+ -", "- ")


degrees = [1, 2, 3]
results = {}

print("Аппроксимация функции методом наименьших квадратов")
print("Вариант 7\n")

for deg in degrees:
    coeffs, poly, sse = least_squares_poly(x, y, deg)
    results[deg] = {
        "coeffs": coeffs,
        "poly": poly,
        "sse": sse
    }

    print(f"Полином степени {deg}:")
    print("y =", print_polynomial(coeffs))
    print(f"Сумма квадратов невязок S = {sse:.6f}")
    print()

best_degree = min(results, key=lambda d: results[d]["sse"])

print(f"Лучшая аппроксимация: полином степени {best_degree}")
print("Уравнение:")
print("y =", print_polynomial(results[best_degree]["coeffs"]))
print(f"Минимальная сумма квадратов невязок: {results[best_degree]['sse']:.6f}")