Scipy 带约束方程的ipython非线性最小二乘法

Scipy 带约束方程的ipython非线性最小二乘法,scipy,least-squares,Scipy,Least Squares,我是iPython的新手,需要解决一个特定的曲线拟合问题,我有这个概念,但我的编程知识还太有限。我有实验数据x,y来拟合四个系数a,b,c,d的方程曲线拟合,我想将其中一个系数(例如a)固定到特定值,并用非线性最小二乘法重新拟合我的实验数据。系数b、c和d不是相互独立的,这意味着它们由一个方程组关联 使用曲线拟合还是lmfit更合适 我从曲线拟合开始: 或者使用lmfit编写如下代码: 我承认我有偏见。curve_fit旨在简化scipy.optimize.leastsq,假设您正在将yx数据拟

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

使用曲线拟合还是lmfit更合适

我从曲线拟合开始:

或者使用lmfit编写如下代码:


我承认我有偏见。curve_fit旨在简化scipy.optimize.leastsq,假设您正在将yx数据拟合到yx参数的模型,因此传递给curve_fit的函数将计算模型中要拟合的值。lmfit更为通用和灵活,因为目标函数必须返回在最小二乘意义下最小化的数组,但目标函数必须返回模型数据而不是模型

但是,lmfit的功能似乎完全符合您的要求:修复模型中的一个参数,而无需重写目标函数。 也就是说,你可以说

params.add('a', value = -89, vary=False)
参数“a”将保持不变。要使用曲线拟合实现这一点,必须重写模型函数

另外,你说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的值将被强制为b的值,d到c的值。您可以使用几乎任何有效的python语句作为约束表达式,例如:

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

我想这可能就是你要找的那种东西。

这里的关键似乎是你的系数不是独立的。如果是,曲线拟合应该可以很好地完成这项工作。但是您似乎没有处理上述两种解决方案中的依赖关系,因此无法保证curve_fit或lmfit的输出将保持这种依赖关系。你能解一个或多个自变量的依赖方程吗?谢谢!!!这正是我要找的。我还发现,如果我想在后面的方程中使用这样计算的系数,我需要使用:a=params['a'].value b=params['b'].value c=params['c'].value d=params['d'].value
params.add('b', value = 10)
params.add('c', expr = 'b')
params.add('d', expr = 'c')
params.add('b', value = 10)
params.add('c', expr = 'sqrt(b/10)')
params.add('d', expr = '1-c')