繁体   English   中英

用curvefit拟合双曲函数和谐波函数

[英]fitting hyperbolic and harmonic functions with curvefit

我在使用Curvefit函数时遇到问题。 在这里,我有一个具有两个功能的代码。 第一个是双曲函数。 第二个是相同的,但其中一个参数=1。我的问题是,使用Curvefit拟合第一个函数的结果很好,而第二个则不然。 我有一个商业程序,分别为这两个程序生成正确的解决方案。 因此,有可能找到第二种功能的解决方案(如上所述,第一种功能的特殊情况)是否有人可以让我知道我在做什么错? 谢谢 !

这是要运行的代码:

def hypRegress(ptp,pir):

    xData = np.arange(len(ptp))
    yData = pir

    xData = np.array(xData, dtype=float)
    yData = np.array(yData, dtype= float)

    def funcHyp(x, qi, exp, di):
        return qi*(1+exp*di*x)**(-1/exp)

    def errfuncHyp(p):
        return funcHyp(xData, p[0], p[1], p[2]) - yData

    #print(xData.min(), xData.max())
    #print(yData.min(), yData.max())

    trialX = np.linspace(xData[0], xData[-1], 1000)



    # Fit an hyperbolic
    popt, pcov = optimize.curve_fit(funcHyp, xData, yData)
    print 'popt'
    #print(popt)
    yHYP = funcHyp(trialX, *popt)

    #optimization

    # initial values
    p1, success = optimize.leastsq(errfuncHyp, popt,maxfev=10000)
    print p1

    aaaa = funcHyp(trialX, *p1)

    plt.figure()
    plt.plot(xData, yData, 'r+', label='Data', marker='o')
    plt.plot(trialX, yHYP, 'r-',ls='--', label="Hyp Fit")
    plt.plot(trialX, aaaa, 'y', label = 'Optimized')
    plt.legend()
    plt.show(block=False)
    return p1


def harRegress(ptp,pir):

    xData = np.arange(len(ptp))
    yData = pir

    xData = np.array(xData, dtype=float)
    yData = np.array(yData, dtype=float)

    def funcHar(x, qi, di):
        return qi*(1+di*x)**(-1)

    def errfuncHar(p):
        return funcHar(xData, p[0], p[1]) - yData

    #print(xData.min(), xData.max())
    #print(yData.min(), yData.max())

    trialX = np.linspace(xData[0], xData[-1], 1000)



    # Fit an harmonic
    popt, pcov = optimize.curve_fit(funcHar, xData, yData)
    print 'popt'
    print(popt)
    yHAR = funcHar(trialX, *popt)

    #optimization

    # initial values
    p1, success = optimize.leastsq(errfuncHar, popt,maxfev=1000)
    print p1

    aaaa = funcHar(trialX, *p1)

    plt.figure()
    plt.plot(xData, yData, 'r+', label='Data', marker='o')
    plt.plot(trialX, yHAR, 'r-',ls='--', label="Har Fit")
    plt.plot(trialX, aaaa, 'y', label = 'Optimized')
    plt.legend()
    plt.show(block=False)
    return p1


ptp = ([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14])
pir = ([150,85,90,50,45,60,60,40,40,30,28,30,38,30,26])

hypRegress(ptp,pir)
harRegress(ptp,pir)

input('pause')

这是一个经典的问题。 curve_fit算法从对要优化的参数的初始猜测开始,如果未提供,则全部为全。

就是说,当你打电话

popt, pcov = optimize.curve_fit(funcHar, xData, yData)

拟合程序的第一次尝试是假设

funcHar(xData, qi=1, di=1)

如果您未指定任何其他选项,则拟合将很差,如参数估计值的大差异所证明(检查pcov的对角线并将其与popt返回的实际值进行比较)。

在许多情况下,情况可以通过提供智能的猜测来解决。 从您的HAR模型中,我得出x==0周围的值与qi大小相同。 因此,您可以提供p0 = (pir[0], 1)的初始猜测,这已经可以得出令人满意的解。 您也可以用

popt, pcov = optimize.curve_fit(funcHar, ptp, pir, p0=(0, 1))

导致相同的结果。 因此问题就在于该算法找到了局部最小值。

另一种选择是提供一个不同的factor ,即“确定初始步阶界限的参数”:

popt, pcov = optimize.curve_fit(funcHar, ptp, pir, p0=(1, 1), factor=1)

在这种情况下,即使使用(默认)初始猜测值p0=(1,1) ,它也会产生相同的结果拟合度。

请记住:装修是一门艺术,而不是一门科学。 通常,通过分析您要拟合的模型,您可能已经提供了很好的初始猜测。

我不能说商业程序中使用的算法。 如果它是开源的(不太可能),您可以看看它们的作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM