如何在python下使用约束进行加权曲线拟合?

时间:2014-05-08 15:08:41

标签: python scipy curve-fitting least-squares

我需要使用约束和权重进行曲线拟合。读书,大多数在这里,我创建了一个函数

 def residuals_ga(self,p,h,n,err,kkind=None):

        # checking if to use the minimum or maximum value of kappa
        if kkind == "min":
            kappa = self.k0[0] - self.k0[1]
        elif kkind == "max":
            kappa = self.k0[0] + self.k0[1]
        # checking if kappa is in bounds
        elif p[0] > self.k0[0] + self.k0[1]:
            return float("inf")
        elif p[0] < self.k0[0] - self.k0[1]: 
            return float("inf")
        else:
            kappa = p[0]
        ag = float(p[1])
        hq = lambda n,kappa,ag: self.hq_func(n,1,kappa,ag)
        return (hq(n,kappa,ag) - h)/err**2

从我收集的内容来看,这应该有效。然而,结果非常糟糕。这种方法对吗?我错过了什么吗?

我应该提一下,我使用xmgrace测试了函数本身,它运行正常。

1 个答案:

答案 0 :(得分:0)

看看你如何调用这个例程可能会有所帮助,就像self.k0和self.hq_func的定义一样。

的目的是什么?
    hq = lambda n,kappa,ag: self.hq_func(n,1,kappa,ag)
    return (hq(n,kappa,ag) - h)/err**2

而不是

    return (self.hq_func(n, 1, kappa, ag) - h)/err**2

通常,有许多潜在的情况,p [0]的值的变化将改变残差。这使得很难确定衍生物,这可能会导致不稳定的结果。返回Inf肯定会带来麻烦。

如果想要在参数可能采用的值上加上上限和/或下限,您可能会发现lmfit包(http://lmfit.github.io/lmfit-py/)很有帮助。