这称为曲线拟合。最好的方法是找到一个可以为你做这件事的数字库。这是一个显示如何使用 scipy 执行此操作的页面。该页面上的图片显示了代码的作用:
显示两个嘈杂数据集和两个最佳拟合正弦曲线的图表 http://www.scipy.org/Cookbook/FittingData?action=AttachFile&do=get&target=datafit.png
现在只有4行代码,但作者根本没有解释。我将尝试在这里简要解释一下。
首先,你必须决定你想要的答案是什么形式。在这个例子中,作者想要一个形式的曲线
f(x) = p 0 cos (2π/ p 1 x + p 2 ) + p 3 x
您可能需要几条曲线的总和。没关系; 该公式是求解器的输入。
因此,该示例的目标是找到常数p 0到p 3以完成公式。scipy 可以找到这个由四个常量组成的数组。您所需要的只是一个错误函数,scipy 可以使用它来查看其猜测与实际采样数据点的接近程度。
fitfunc = lambda p, x: p[0]*cos(2*pi/p[1]*x+p[2]) + p[3]*x # Target function
errfunc = lambda p: fitfunc(p, Tx) - tX # Distance to the target function
errfunc
只接受一个参数:长度为 4 的数组。它将这些常数代入公式并计算候选曲线上的值数组,然后减去采样数据点数组 tX。结果是一个错误值数组;大概 scipy 将取这些值的平方和。
然后只需输入一些初始猜测并scipy.optimize.leastsq
计算数字,试图找到一组参数p使误差最小化。
p0 = [-15., 0.8, 0., -1.] # Initial guess for the parameters
p1, success = optimize.leastsq(errfunc, p0[:])
结果p1
是一个包含四个常量的数组。success
是 1、2、3 或 4,如果求解器实际找到了解决方案。(如果 errfunc 足够疯狂,求解器可能会失败。)