这被称为
曲线拟合。最好的方法是找到一个可以帮你完成此操作的数值库。这里有一个页面展示了如何使用scipy进行曲线拟合
(点击此处)。该页面上的图片展示了代码的功能:
![graph showing two noisy data sets and two best-fit sine curves](https://istack.dev59.com/FMFW1.webp)
(来源:scipy.org)
现在只需要4行代码,但作者并没有解释它。我会在这里简要解释一下。
首先,您必须决定您想要的答案形式。在这个例子中,作者想要一个形式为
"f(x) = p0 cos (2π/p1 x + p2) + p3 x" 是一个数学公式,其中p0、p1、p2和p3是常数。它可以用于描述一个曲线。通过使用scipy库中的求解器,可以找到这个曲线的四个常数。需要提供一个误差函数,以便scipy可以根据样本数据点来检查其猜测值与实际值的接近程度。
fitfunc = lambda p, x: p[0]*cos(2*pi/p[1]*x+p[2]) + p[3]*x
errfunc = lambda p: fitfunc(p, Tx) - tX
"errfunc"函数只需要一个参数:长度为4的数组。它将这些常量插入公式中,计算候选曲线上的一组值,然后减去采样数据点tX的数组。结果是一组误差值的数组;很可能scipy将对这些值的平方和进行求和。
然后,只需放入一些初始猜测值,
scipy.optimize.leastsq
就会计算,试图找到一组使误差最小化的参数
p。
p0 = [-15., 0.8, 0., -1.]
p1, success = optimize.leastsq(errfunc, p0[:])
结果
p1
是一个包含四个常量的数组。
success
如果求解器实际找到了解,则为1、2、3或4。(如果errfunc足够疯狂,求解器可能会失败。)