Python实现曲线拟合的最小二乘法
本文实例为大家分享了Python曲线拟合的最小二乘法,供大家参考,具体内容如下
模块导入
importnumpyasnp importgaosiasgs
代码
"""
本函数通过创建增广矩阵,并调用高斯列主元消去法模块进行求解。
"""
importnumpyasnp
importgaosiasgs
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=[]
foriinrange(shape*2+1):
ifi!=0:
data.append(np.sum(x**i))
else:
data.append(len(x))
b=[]
foriinrange(shape+1):
ifi!=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])
foriinrange(shape+1):
forjinrange(shape+1):
n[i][j]=data[i+j]
result=gs.Handle(n,b)
ifnotresult:
print('增广矩阵求解失败!')
exit()
fun='f(x)='
foriinrange(len(result)):
iftype(result[i])==type(''):
print('存在自由变量!')
fun=fun+str(result[i])
elifi==0:
fun=fun+'{:.3f}'.format(result[i])
else:
fun=fun+'+{0:.3f}*x^{1}'.format(result[i],i)
print('求得{0}次拟合函数为:'.format(shape))
print(fun)
高斯模块
#导入numpy模块
importnumpyasnp
#行交换
defswap_row(matrix,i,j):
m,n=matrix.shape
ifi>=morj>=m:
print('错误!:行交换超出范围...')
else:
matrix[i],matrix[j]=matrix[j].copy(),matrix[i].copy()
returnmatrix
#变成阶梯矩阵
defmatrix_change(matrix):
m,n=matrix.shape
main_factor=[]
main_col=main_row=0
whilemain_row0)[0]
#如果该列向下全部数据为零,则直接跳过列
iflen(not_zeros)==0:
main_col+=1
continue
else:
#将主元列号保存在列表中
main_factor.append(main_col)
#将第一个非零行交换至最前
ifnot_zeros[0]!=[0]:
matrix=swap_row(matrix,main_row,main_row+not_zeros[0])
#将该列主元下方所有元素变为零
ifmain_row
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。