2014-06-13 83 views
0

我是iPython的新手,需要解决一个特定的曲线拟合问题,我有这个概念,但是我的编程知识还有限。我有实验数据(x, y)拟合到一个具有四个系数(a,b,c,d)的方程(曲线拟合),我想将这些系数(例如a)中的一个固定到一个特定值并重新设计我的实验数据(非线性最小二乘)。系数b,c和d并不相互独立,这意味着它们通过方程组相关。带约束方程的ipython非线性最小二乘法

更适合使用curve_fitlmfit

我curve_fit开始这样:

def fitfunc(x,a,b,c,d): 
    return a+b*x+c/x+log10(x)*d 
popt, fitcov = curve_fit(fitfunc, x, y) 

或像这样的代码lmfit

import scipy as sp 
from lmfit import minimize, Parameters, Parameter, report_fit 

def fctmin(params, x, y): 
    a = params['a'].value 
    b = params['b'].value 
    c = params['c'].value 
    d = params['d'].value 

    model = a+b*x+c/x+d*np.log10(x) 

    return model - y 

#create parameters 
params = Parameters() 
params.add('a', value = -89) 
params.add('b', value =b) 
params.add('c', value = c) 
params.add('d', value = d) 

#fit leastsq model 
result = minimize(fctmin, params, args=(x, y)) 

#calculate results 
final = y + result.residual 
report_fit(params) 
+0

这里的关键似乎是你的系数不是独立的。如果他们是,'curve_fit'应该很好地完成这项工作。但是,您似乎无法处理上述任一解决方案中的依赖关系,因此不能保证'curve_fit'或'lmfit'的输出将保持该依赖关系。你能解决一个或多个自变量的相关方程吗? – Jsl

回答

0

我承认到被偏置。 curve_fit()被设计为通过假设您将y(x)数据拟合到y(x,参数)的模型来简化scipy.optimize.leastsq(),所以传递给curve_fit()的函数是一个将计算适合值的模型。 lmfit有点更一般和更灵活,因为你的目标函数必须返回最小二乘意义上的数组,但是你的目标函数必须返回“模型数据”而不是“模型”

但是,lmfit具有的功能看起来完全符合您的需求:修复模型中的一个参数,而无需重新编写目标函数。
也就是说,你可以说

params.add('a', value = -89, vary=False) 

和参数 'A' 将保持固定。要用curve_fit()来做到这一点,你必须重写你的模型函数。

另外,你说b,c和d通过方程相关,但是不提供细节。使用lmfit,您可能可以将这些方程作为约束。你有

params.add('b', value =b) 
params.add('c', value = c) 
params.add('d', value = d) 

虽然我没有看到b值。即使假设有一个值,也会创建三个具有相同起始值的独立变量。你可能意思是“改变b,强制c和d得到相同的值”。 lmfit可以做到这一点:

params.add('b', value = 10) 
params.add('c', expr = 'b') 
params.add('d', expr = 'c') 

这将有一个独立变量,并且对于C的值将被强制为a〜b的(和d至c)的值。您可以使用(大约)任何有效的Python语句作为约束约束表达式,比如:

params.add('b', value = 10) 
params.add('c', expr = 'sqrt(b/10)') 
params.add('d', expr = '1-c') 

我认为这可能是诸如此类的事情,你要寻找的。

+0

谢谢!它正是我所寻找的。我还发现,如果我想在后面的公式中使用如此计算的系数,我需要使用:a = params ['a']。值 b = params ['b']。值 c = params ['c']。值 d = params ['d']。value –

相关问题