【发布时间】:2015-07-29 17:57:43
【问题描述】:
我正在尝试编写适合具有相同参数的多个 (>100) 数据集的代码。
举个简单的例子:
假设我有 4 个不同的数据集,它们应该近似地遵循函数 y(x)=A*Sin(bx+c)+dx。它们都具有相同的参数 a、b 和 d。唯一不同的参数是 c(相位),但对于每个数据集,我确切地知道 c 应该是什么。
现在我想同时拟合所有 4 个函数,并得到一组拟合参数 a、b 和 d。
这里我写了一个代码,分别适合每个函数,并给了我 4 组不同的参数,这不是我想要的。
提前感谢您的帮助。
from scipy import optimize
import matplotlib
from matplotlib import pyplot as plt
from scipy import *
Mat_ydata=[]
Mat_angle=[]
Mat_xdata=[]
定义拟合函数
def sin_func(x,a,b,c,d):
return a*sin(b*x+c)+d*x
生成一些数据:4 个正弦函数,具有相同的幅度、频率和线性偏移,但每个都有不同的相位,我们已经知道了。此外,每个都定义在不同的范围内。函数的 x 和 y 坐标存储在列表 Mat_ydata 和 Mat_xdata 的列表中。相位存储在列表 Mat_phase 中
for phase in range(0,181,60):
angle=float(phase)/180*pi
num_points=phase+50
xdata=linspace(num_points/10,num_points/5, num_points)
ydata=2.11*sin(pi/2*xdata+angle)+3.16*xdata+2*((0.5-rand(num_points))*exp(2*rand(num_points)**2))
Mat_angle.append(angle)
Mat_ydata.append(ydata)
Mat_xdata.append(xdata)
这里很合适。我现在分别拟合每个函数,因此为每个函数获得不同的相位、幅度和线性偏移值。我想把它们放在一起。最后,我还绘制了数据和拟合。
for i in range(0,len(Mat_angle)):
fitfunc = lambda p, x: sin_func(x,p[0],p[1],Mat_angle[i],p[2])
errfunc = lambda p, x, y: fitfunc(p, x) - y
p0 = [2,1.5,3]
p1, success = optimize.leastsq(errfunc, p0[:], args=(Mat_xdata[i], Mat_ydata[i]))
print p1
plt.plot(Mat_xdata[i],Mat_ydata[i],'o',Mat_xdata[i],fitfunc(p1,Mat_xdata[i]),'-')
plt.show()
【问题讨论】:
-
你能把4个数据集合并成一个大的,然后拟合吗?
标签: python