You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 11:50:30