就是找個破多項式,讓每個點和真實資料的差值的平方最小,原理就是這麼簡單。
1.寫正則方程組(法方程組)
2.寫結果向量
3.解方程組
丟**:
1import
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
(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 ...