import numpy as np
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([
2.09, 2.05, 2.19, 2.18, 2.17,
2.27, 2.58, 2.73, 2.82, 3.04,
3.03, 3.45, 3.62, 3.85, 4.19,
4.45, 4.89, 5.06, 5.63, 5.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}")