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())