1 最小二乘拟合
import numpy as np
from scipy.optimize import leastsq
import matplotlib.pyplot as plt
def func(x,p):
#数据拟合所用函数A*sin(2*pi*k*x+theta)
A,k,theta=p
return A*np.sin(2*np.pi*k*x+theta)
def residuals(p,x,y):
#实验数据x,y 和拟合函数之间的差,p为拟合需要的找到的系数
return y-func(x, p)
x=np.linspace(0,-2*np.pi,100)
A,k,theta=10,0.34,np.pi/6#真实数据的函数参数
y0=func(x,[A,k,theta])#真实数据
y1=y0+2*np.random.randn(len(x))#加入噪声得到实验数据
p0=[7,0.2,0]#第一次猜测的函数拟合参数
#调用leastsq进行数据拟合
#residuals为计算误差的函数
#p0为拟合参数的初始值
#args为需要拟合的实验数据
plsq=leastsq(residuals,p0,args=(x,y1))
print("真实参数:",[A,k,theta])
print("拟合参数:",plsq[0])#实验数据拟合后的参数
plt.plot(x,y0,label='真实数据')
plt.plot(x,y1,label='带噪声的实验数据')
plt.plot(x,func(x,plsq[0]),label='拟合数据')
plt.legend()
plt.show()
真实参数: [10, 0.34, 0.5235987755982988]
拟合参数: [-9.7440893 0.34310722 3.73484561]
2 数据文件操作
2.1 写入数据文件
import time
with open("log.txt",'a+',encoding="utf-8") as fw:
tmp = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
fw.write(tmp+"\t"+data_json+"\n")