Homework
- 用周期模型 拟合以下数据:
- 分别使用法线方程和 QR 分解求解方程的最小二乘解, 并求出二范数误差
- 编程: 令 为区间 上间隔均匀的点, 并设 . 使用法线方程和 QR 分解找出拟合 的最小二乘多项式
解得: , 误差:
解得 二范数误差:

运行结果
APPENDIX
import math
import numpy as np
def poly_matr(x):
y = [[1, x_i, math.pow(x_i, 2), math.pow(x_i, 3), math.pow(x_i, 4), math.pow(x_i, 5), math.pow(x_i, 6), math.pow(x_i, 7), math.pow(x_i, 8), math.pow(x_i, 9), math.pow(x_i, 10)] for x_i in x] # noqa: E501
return y
def QRDecomposition(A):
m, n = A.shape
Q = np.zeros((m, n))
R = np.zeros((n, n))
for j in range(n):
v = A[:, j]
for i in range(j):
R[i, j] = np.dot(Q[:, i].T, A[:, j])
v = v - R[i, j] * Q[:, i]
R[j, j] = np.linalg.norm(v)
Q[:, j] = v / R[j, j]
return Q, R
def least_squares_polynomial():
x = np.linspace(2,4,num=20,endpoint=True)
y = [sum(math.pow(x_i, i) for i in range(11)) for x_i in x]
poly_matrix = poly_matr(x)
poly_matrix_transpose = np.transpose(poly_matrix)
poly_matrix_transpose_poly_matrix = np.dot(poly_matrix_transpose, poly_matrix)
poly_matrix_transpose_poly_matrix_inv = np.linalg.inv(poly_matrix_transpose_poly_matrix)
poly_matrix_transpose_y = np.dot(poly_matrix_transpose, y)
a = np.dot(poly_matrix_transpose_poly_matrix_inv, poly_matrix_transpose_y)
return a
def QR_least_squares_polynomial():
x = np.linspace(2,4,num=20,endpoint=True)
y = [sum(math.pow(x_i, i) for i in range(11)) for x_i in x]
poly_matrix = poly_matr(x)
poly_matrix_transpose = np.transpose(poly_matrix)
Q, R = QRDecomposition(poly_matrix_transpose)
R_inv = np.linalg.inv(R)
Q_transpose = np.transpose(Q)
a = np.dot(np.transpose(np.dot(R_inv, Q_transpose)), y)
return a
if __name__ == "__main__":
print(least_squares_polynomial())
print("______________________")
print(QR_least_squares_polynomial())