如何为scipy.optimize.curve_fit调用的分段拟合函数传入额外参数a
如何为scipy.optimize.curve_fit调用的分段拟合函数传入额外参数a
当然可以!而且完全不用大改现有代码,给你两个最省事的方案:
方案1:利用curve_fit的args参数(改动最小)
这个方法只需要给你的fit_jt函数加一个带默认值的参数,然后在调用curve_fit时用args传递a的值就行,几乎是零侵入式修改:
首先修改fit_jt的定义,把a作为最后一个参数(保留默认值,这样原来的调用逻辑也不会崩):
def fit_jt(x, e1, e2, n1, E1, E2, N1, N2, a=1.3): return np.piecewise(x, [x <= a, x > a], [ lambda x: 1 / e1 + (1 - np.float128(np.exp(-e2 * x / n1))) / e2, lambda x: 1 / E1 + (1 - np.float128(np.exp(-E2 * x / N1))) / E2 + x / N2 ])
然后在main里调用curve_fit时,只需要多传一个args参数,把你想设置的a值传进去就行:
# 比如你想设置a=1.5 popt_jt, pcov_jt = optimize.curve_fit(fit_jt, time.values, jt.values, method='trf', args=(1.5,))
这里的args是一个元组,里面的参数会作为固定值传递给fit_jt,不会被curve_fit当作待优化的参数,完美符合你的需求。
方案2:用functools.partial包装函数(不用改fit_jt的参数默认值)
如果你连给fit_jt加默认参数都不想做,那可以用functools.partial来包装函数,把a值提前绑定进去:
首先调整fit_jt的参数顺序,把a放在最前面:
def fit_jt(a, x, e1, e2, n1, E1, E2, N1, N2): return np.piecewise(x, [x <= a, x > a], [ lambda x: 1 / e1 + (1 - np.float128(np.exp(-e2 * x / n1))) / e2, lambda x: 1 / E1 + (1 - np.float128(np.exp(-E2 * x / N1))) / E2 + x / N2 ])
然后在main里用partial把a值绑定进去,生成一个新的函数给curve_fit调用:
from functools import partial # 设置你要的a值 target_a = 1.5 # 包装函数,把a值提前绑定 wrapped_fit_jt = partial(fit_jt, target_a) # 之后直接用包装后的函数调用curve_fit就行 popt_jt, pcov_jt = optimize.curve_fit(wrapped_fit_jt, time.values, jt.values, method='trf')
这个方案的好处是,fit_jt里不需要保留a的默认值,完全由外部传入。
两种方案改动都极小,你可以根据自己的习惯选就行。
备注:内容来源于stack exchange,提问作者BaRud
相关产品推荐
相关产品推荐

