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