本文实例为大家分享了Python曲线拟合的最小二乘法,供大家参考,具体内容如下
模块导入
1
2
|
import numpy as np
import gaosi as gs
|
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
"""
本函数通过创建增广矩阵,并调用高斯列主元消去法模块进行求解。
"""
import numpy as np
import gaosi as gs
shape = int ( input ( '请输入拟合函数的次数:' ))
x = np.array([ 0.6 , 1.3 , 1.64 , 1.8 , 2.1 , 2.3 , 2.44 ])
y = np.array([ 7.05 , 12.2 , 14.4 , 15.2 , 17.4 , 19.6 , 20.2 ])
data = []
for i in range (shape * 2 + 1 ):
if i ! = 0 :
data.append(np. sum (x * * i))
else :
data.append( len (x))
b = []
for i in range (shape + 1 ):
if i ! = 0 :
b.append(np. sum (y * x * * i))
else :
b.append(np. sum (y))
b = np.array(b).reshape(shape + 1 , 1 )
n = np.zeros([shape + 1 ,shape + 1 ])
for i in range (shape + 1 ):
for j in range (shape + 1 ):
n[i][j] = data[i + j]
result = gs.Handle(n,b)
if not result:
print ( '增广矩阵求解失败!' )
exit()
fun = 'f(x) = '
for i in range ( len (result)):
if type (result[i]) = = type (''):
print ( '存在*变量!' )
fun = fun + str (result[i])
elif i = = 0 :
fun = fun + '{:.3f}' . format (result[i])
else :
fun = fun + '+{0:.3f}*x^{1}' . format (result[i],i)
print ( '求得{0}次拟合函数为:' . format (shape))
print (fun)
|
高斯模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
# 导入 numpy 模块
import numpy as np
# 行交换
def swap_row(matrix, i, j):
m, n = matrix.shape
if i > = m or j > = m:
print ( '错误! : 行交换超出范围 ...' )
else :
matrix[i],matrix[j] = matrix[j].copy(),matrix[i].copy()
return matrix
# 变成阶梯矩阵
def matrix_change(matrix):
m, n = matrix.shape
main_factor = []
main_col = main_row = 0
while main_row < m and main_col < n:
# 选择进行下一次主元查找的列
main_row = len (main_factor)
# 寻找列中非零的元素
not_zeros = np.where( abs (matrix[main_row:,main_col]) > 0 )[ 0 ]
# 如果该列向下全部数据为零,则直接跳过列
if len (not_zeros) = = 0 :
main_col + = 1
continue
else :
# 将主元列号保存在列表中
main_factor.append(main_col)
# 将第一个非零行交换至最前
if not_zeros[ 0 ] ! = [ 0 ]:
matrix = swap_row(matrix,main_row,main_row + not_zeros[ 0 ])
# 将该列主元下方所有元素变为零
if main_row < m - 1 :
for k in range (main_row + 1 ,m):
a = float (matrix[k, main_col] / matrix[main_row, main_col])
matrix[k] = matrix[k] - matrix[main_row] * matrix[k, main_col] / matrix[main_row, main_col]
main_col + = 1
return matrix,main_factor
# 回代求解
def back_solve(matrix, main_factor):
# 判断是否有解
if len (main_factor) = = 0 :
print ( '主元错误,无主元! ...' )
return None
m, n = matrix.shape
if main_factor[ - 1 ] = = n - 1 :
print ( '无解! ...' )
return None
# 把所有的主元元素上方的元素变成0
for i in range ( len (main_factor) - 1 , - 1 , - 1 ):
factor = matrix[i, main_factor[i]]
matrix[i] = matrix[i] / float (factor)
for j in range (i):
times = matrix[j, main_factor[i]]
matrix[j] = matrix[j] - float (times) * matrix[i]
# 先看看结果对不对
return matrix
# 结果打印
def print_result(matrix, main_factor):
if matrix is None :
print ( '阶梯矩阵为空! ...' )
return None
m, n = matrix.shape
result = [''] * (n - 1 )
main_factor = list (main_factor)
for i in range (n - 1 ):
# 如果不是主元列,则为*变量
if i not in main_factor:
result[i] = '(free var)'
# 否则是主元变量,从对应的行,将主元变量表示成非主元变量的线性组合
else :
# row_of_main表示该主元所在的行
row_of_main = main_factor.index(i)
result[i] = matrix[row_of_main, - 1 ]
return result
# 得到简化的阶梯矩阵和主元列
def Handle(matrix_a, matrix_b):
# 拼接成增广矩阵
matrix_01 = np.hstack([matrix_a, matrix_b])
matrix_01, main_factor = matrix_change(matrix_01)
matrix_01 = back_solve(matrix_01, main_factor)
result = print_result(matrix_01, main_factor)
return result
if __name__ = = '__main__' :
a = np.array([[ 2 , 1 , 1 ], [ 3 , 1 , 2 ], [ 1 , 2 , 2 ]],dtype = float )
b = np.array([[ 4 ],[ 6 ],[ 5 ]],dtype = float )
a = Handle(a, b)
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/weixin_45779228/article/details/109318170