python - 用积分函数拟合数据

标签 python scipy integral data-fitting

使用 curve_fit 时来自 scipy.optimize为了在 python 中拟合一些数据,首先定义拟合函数(例如二阶多项式)如下:

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

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

enter image description here

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

最佳答案

下面是一个根据积分定义的曲线拟合示例。该曲线是 sin(t*w)/t+pt 从 0 到 Pi 的积分。我们的 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

这将打印出非常接近 1.0 的值,这是我们在创建 truedata 时用作 p 的值。

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

关于python - 用积分函数拟合数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30331984/

相关文章:

Scipy 和 CX_freeze - 导入 scipy : you cannot import scipy while being in scipy source directory 时出错

r - 对 R 中的积分进行积分

python - BS4 错误消息 "no attribute ' renderContents'"

python - 在 Django 中,通过搜索框和类别一次性搜索和过滤?

python - __init__ 类中的 TypeVar 类型提示

scipy - 将混淆矩阵打印到文件会产生非法字符

python - 使用边界时 scipy.optimize.curvefit 失败

java - 在 Java 中计算输入函数的积分/导数的最有效方法?

matlab - 执行逐步积分

python - CherryPy 无法正确处理 Jinja2 模板中的非 ASCII 字符