如何在Python中进行带约束的加权曲线拟合?
我需要做一个带约束和权重的曲线拟合。经过一番查阅,主要是在这里,我创建了一个函数。
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 这个包可能会对你有帮助,你可以在这里找到它。