我想编写一个曲线拟合脚本,使我可以修复以下形式的函数的参数:
def func(x, *p):
assert len(p) % 2 == 0
fval = 0
for j in xrange(0, len(p), 2):
fval += p[j]*np.exp(-p[j+1]*t)
return fval
例如,假设我要p = [p1,p2,p3,p4],并且我希望p2和p3为常数A和B(从4参数拟合变为2参数拟合)。我知道functools.partial不允许我这样做,这就是为什么我要编写自己的包装器。但是我这样做有点麻烦。这是我到目前为止的内容:
def fix_params(f, t, pars, fix_pars):
# fix_pars = ((ind1, A), (ind2, B))
new_pars = [None]*(len(pars) + len(fix_pars))
for ind, fix in fix_pars:
new_pars[ind] = fix
for par in pars:
for j, npar in enumerate(new_pars):
if npar == None:
new_pars[j] = par
break
assert None not in new_pars
return f(t, *new_pars)
我认为与此有关的问题是,scipy.optimize.curve_fit不能与通过此类包装程序传递的函数一起很好地工作。我应该如何解决?
答案 0 :(得分:0)
听起来像是您想做的事吗?在Python中,您可以使用内部函数来执行此操作。
示例:
// app.component.html
<textarea id="ta"></textarea>
// app.component.ts
mymethod() {
// $('#ta').append("this text was appended");
// But I need to do the above without jQuery
}
通过这种方式,我们可以将x固定在函数x + y中。您也可以将其放入装饰器中。
这是某人为此写的博客文章: https://mtomassoli.wordpress.com/2012/03/18/currying-in-python/
关于什么将与外部库配合使用,此处的函数foo将返回一个函数。在Python中,函数是一流的对象。因此,您赋予返回的函数的任何内容都只会将其视为函数。
答案 1 :(得分:0)
所以我认为我有一些可行的方法。也许有办法对此进行改进。
这是我的代码(没有所有异常处理):
def func(x, *p):
fval = 0
for j in xrange(0, len(p), 2):
fval += p[j]*np.exp(-p[j+1]*x)
return fval
def fix_params(f, fix_pars):
# fix_pars = ((1, A), (2, B))
def new_func(x, *pars):
new_pars = [None]*(len(pars) + len(fix_pars))
for j, fp in fix_pars:
new_pars[j] = fp
for par in pars:
for j, npar in enumerate(new_pars):
if npar is None:
new_pars[j] = par
break
return f(x, *new_pars)
return new_func
p1 = [1, 0.5, 0.1, 1.2]
pfix = ((1, 0.5), (2, 0.1))
p2 = [1, 1.2]
new_func = fix_params(func, pfix)
x = np.arange(10)
dat1 = func(x, *p1)
dat2 = new_func(x, *p2)
if (dat1==dat2).all()
print "ALL GOOD"