用积分函数拟合数据

11 python integral scipy data-fitting

当使用curve_fitfrom scipy.optimize来拟合python中的某些数据时,首先定义拟合函数(例如二阶多项式),如下所示:

  1. def f(x, a, b): return a*x**2+b*x
  2. 然后进行拟合 popt, pcov = curve_fit(f,x,y)

但现在的问题是,如果函数包含一个整数(或一个离散的和),如何在第1点定义函数,例如:

在此输入图像描述

实验数据仍然给出了x和f(x),所以第2点就像我想象的一样,我可以在python中定义f(x).顺便说一下,我忘了说假设g(t)在这里有一个众所周知的形式,并且包含拟合参数,即在多项式例子中给出的像a和b这样的参数.任何帮助深表感谢.问题实际上应该是通用的,而帖子中使用的函数只是随机的例子.

Jay*_*nek 7

这是一个拟合用积分定义的曲线的例子.的曲线是的积分sin(t*w)/t+p超过t从0到P1.我们的x数据点对应于w,我们正在调整p参数以使数据适合.

import math, numpy, scipy.optimize, scipy.integrate

def integrand(t, args):
    w, p = args
    return math.sin(t * w)/t + p

def curve(w, p):
    res = scipy.integrate.quad(integrand, 0.0, math.pi, [w, p])
    return res[0]

vcurve = numpy.vectorize(curve, excluded=set([1]))

truexdata = numpy.asarray([0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0])
trueydata = vcurve(truexdata, 1.0)

xdata = truexdata + 0.1 * numpy.random.randn(8)
ydata = trueydata + 0.1 * numpy.random.randn(8)

popt, pcov = scipy.optimize.curve_fit(vcurve,
                                      xdata, ydata,
                                      p0=[2.0])
print popt
Run Code Online (Sandbox Code Playgroud)

这将打印出非常接近1.0的东西,这就是p我们创建时所使用的东西trueydata.

请注意,我们numpy.vectorize在曲线函数上使用以生成与之兼容的矢量化版本scipy.optimize.curve_fit.

  • 这很有趣,很有用,而且我认为足够通用,但我们可以做得更好一点,知道这是不可或缺的吗?在你的解决方案中,`curve`可以是任何东西,并且不会从它是不可或缺的事实中受益.也许问题应该改为"用非向量化函数拟合数据"? (2认同)