計算方法 曲線擬合的最小二乘法

2022-06-09 04:03:10 字數 3293 閱讀 5015

就是找個破多項式,讓每個點和真實資料的差值的平方最小,原理就是這麼簡單。

1.寫正則方程組(法方程組)

2.寫結果向量

3.解方程組

丟**:

1

import

numpy as np

2import

math3#

data = eval(input("請輸入資料:"))

4 data = [(0.6,7.05),(1.3,12.2),(1.64,14.4),(1.8,15.2),(2.1,17.4),(2.3,19.6),(2.44,20.2)]

5 n = 2

6 m =len(data)

7 fa_mat = [[0 for j in range(n)] for i in

range(n)]

8for i in

range(len(fa_mat)):

9for j in

range(len(fa_mat[0])):

10 _sum =0

11for k in

range(m):

12 _sum += data[k][0] ** (i+j)

13 fa_mat[i][j] =_sum

14print("

法方程組如下:")

15print

(np.array(fa_mat))16#

計算結果向量

17 b = [[0] for i in

range(n)]

18for i in

range(n):

19 _sum =0

20for k in

range(m):

21 _sum += ((data[k][0] ** i) * data[k][1])22#

print("_sum += (({} ** {}) * {})".format(data[k][0],i,data[k][1]))

23 b[i][0] =_sum

24print("

結果向量如下:")

25print

(np.array(b))

26print("

下面是解方程組:\n\n")

27#解線性方程組 使用三角分解法 ***********************************===

28 mat =fa_mat[:]

29 b =b[:]

30 height =len(mat)

31 width =len(mat[0])

3233

#1 直接分解矩陣34#

初始化lu

35 u = [[0 for i in range(width)] for j in

range(height)]

36 l = [[0 if i!=j else 1 for i in range(width) ] for j in

range(height)]

3738

print

(l,u)

3940

#從u第一行開始,對於l來說是從第一列開始

41for i in

range(height):42#

依次計算lu的行、列

43for j in

range(i, width):

44 _sum =0

45for k in

range(i):

46 _sum += l[i][k] *u[k][j]

47print("

u{}{}_sum += l[{}][{}] * u[{}][{}] = {} * {} = {}

".format(i,j,i,k,k,j,l[i][k],u[k][j],l[i][k] *u[k][j]))

48 u[i][j] = mat[i][j] -_sum49#

l的i.j是反著的

50for j in

range(i, width):

51 _sum =0

52if j >i:

53for k in

range(i):

54 _sum += l[j][k] *u[k][i]

55print("

l{}{}_sum += l[{}][{}] * u[{}][{}] = {} * {} = {}

".format(j,i,j,k,k,i,l[j][k],u[k][i],l[j][k] *u[k][i]))

56 l[j][i] = (mat[j][i] - _sum) /u[i][i]

57print("

l = \n{}

".format(np.array(l)))

58print("

u = \n{}

".format(np.array(u)))

5960

print("

分解完畢,開始計算ly=b")

61#分解完畢 解ly =b

62 y = [[0] for i in

range(height)]63#

print(y)

64for i in

range(height):

65 _sum =0

66for k in

range(i):

67 _sum += l[i][k] *y[k][0]

68 y[i][0] = (b[i][0] - _sum) #

這裡不用除以係數因為對角線為1

69print

(y)70

print("

計算完畢,開始計算ux=y")

71 x = [[0] for i in

range(height)]

72for i in range(height-1,-1,-1):

73 _sum =0

74for k in range(height-1,i,-1):

75 _sum += u[i][k] *x[k][0]

76 x[i][0] = (y[i][0] - _sum) /u[i][i]

77print

(x)78

print("

最終結果x: \n{}

".format(np.array(x)))

over.

最小二乘法曲線擬合

設有如下實驗資料x1 2345 6789 1011 1213 141516y 46.4 88.8 9.22 9.59.7 9.86 1010.2 10.32 10.42 10.5 10.55 10.58 10.60 試用最小二乘法多次 1到5次 多項式曲線擬合以上資料。import numpy as...

最小二乘法曲線擬合

在實際工程中,我們常會遇到這種問題 已知一組點的橫縱座標,需要繪製出一條盡可能逼近這些點的曲線 或直線 以進行進一步進行加工或者分析兩個變數之間的相互關係。而獲取這個曲線方程的過程就是曲線擬合。首先,我們從曲線擬合的最簡單情況 直線擬合來引入問題。如果待擬合點集近似排列在一條直線上時,我們可以設直線...

最小二乘法的曲線擬合

最小二乘法的曲線擬合 bool cdatadistillview leastdoublemultiplication long px,long py,long m,long n,double result,double warp for i 0 i m i z 0 b 0 1 d1 n p 0 c ...