#载入库
import numpy as np
from scipy.optimize import leastsq
import pylab as pl
#定义函数形式和误差
def func(x,p):
A,k,theta=p
return A*np.sin(2*np.pi*k*x+theta)
def residuals(p,y,x):
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))
#trian the para
p0=[7,0.2,0]#在非线性拟合中,初始参数对结果的好坏有很大的影响
Para=leastsq(residuals,p0,args=(y1,x))
a1,a2,a3=Para[0]
#plot
import matplotlib.pyplot as plt
plt.figure(figsize=(8,6))
plt.scatter(x,y1,color="red",label="Sample Point",linewidth=3) #画样本点
y=a1*np.sin(2*np.pi*a2*x+a3)
plt.plot(x,y,color="orange",label="Fitting Line",linewidth=2) #画拟合直线
plt.legend()
plt.show()
结果如下: