如何在Python中进行带约束的加权曲线拟合?

2 投票
1 回答
656 浏览
提问于 2025-04-18 05:50

我需要做一个带约束和权重的曲线拟合。经过一番查阅,主要是在这里,我创建了一个函数。

 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

看看你是怎么调用这个例程的,可能会有帮助,还有 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 这个包可能会对你有帮助,你可以在这里找到它

撰写回答