python用最小二乘法拟合正弦函数

#载入库
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()

结果如下:

发布了72 篇原创文章 · 获赞 37 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/xspyzm/article/details/89810980