曲線擬合(Python實現)

曲線擬合

  • 最小二乘法多項式
"""
【問題描述】根據N個數據點構造最小二乘多項式擬合。
【輸入形式】在屏幕上依次輸入數據點的個數N,和N對數據點的x和y座標。
【輸出形式】輸出最小二乘多項式和誤差。
"""
import numpy as np


def ls_poly(x, y):
    n = len(x)
    f = np.zeros((n, 3), dtype=np.float)
    for i in range(3):
        f[:, i] = x**i  # 初始化f
    a = np.transpose(f)@f
    b = np.transpose(f)@y
    c = np.linalg.inv(a)@b
    c = np.flipud(c)
    return c


def main():
    n = int(input())
    x = np.zeros(n, dtype=np.float)  # 初始化x, y
    y = np.zeros(n, dtype=np.float)
    for i in range(n):  # 輸入x, y
        p, q = map(float, input().split())
        x[i] = p
        y[i] = q
    c = ls_poly(x, y)
    print(c)
    sumz = 0
    z = 0
    for i in range(3):
        z += c[i]*x**(2-i)
    for i in range(n):
        sumz += (z[i]-y[i])**2
    sum1 = np.sqrt(sumz)  # 求誤差
    print('%.7f' % sum1)
   

if __name__ == '__main__':
    main()
  • 最小二乘法
"""
【問題描述】根據N個數據點構造最小二乘擬合直線y=ax+b。
【輸入形式】在屏幕上依次輸入數據點的個數N,和N對數據點的x和y座標。
【輸出形式】輸出最小二乘擬合直線y=ax+b和誤差。
"""
import numpy as np


def ls_line(x, y):
    xm = np.mean(x)  # 求x,y均根
    ym = np.mean(y)
    sum_x = (x - xm) @ (x - xm)
    sum_xy = (y - ym) @ (x - xm)  # 解方程
    a = sum_xy / sum_x  # 求出a
    b = ym - a * xm  # 根據y=a*x+b;求出b
    return a, b


def main():
    n = int(input())
    x = np.zeros(n, dtype=np.int)  # 初始化x, y
    y = np.zeros(n, dtype=np.int)
    for i in range(n):  # 輸入x, y
        p, q = map(int, input().split())
        x[i] = p
        y[i] = q
    a, b = ls_line(x, y)
    print('y=', end='')
    print('%.7f' % a, end='')
    print('x+', end='')
    print('%.7f' % b)
    sumz = 0
    z = x * a + b - y
    for i in range(n):
        sumz += z[i] ** 2
    sum1 = np.sqrt(sumz)  # 求誤差
    print('%.7f' % sum1)


if __name__ == '__main__':
    main()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章