我需要使用约束和权重进行曲线拟合。读书,大多数在这里,我创建了一个函数
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测试了函数本身,它运行正常。
答案 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/)很有帮助。