Я думаю, что этот вопрос определенно был бы улучшен на более конкретном примере (то есть с реальным кодом).Если я правильно понимаю, у вас есть общая модель
def model_func(x, a, b, c, d):
gresult = G(x, a, b, d)
return F(x, b, c, gresult)
, но вы также хотите контролировать, действительно ли d
и b
являются переменными, и передается ли c
в F
.Это правильно?
Если это правильно (или, по крайней мере, захватывает дух), то я думаю, что вы можете сделать это с помощью lmfit
(отказ от ответственности: я ведущий автор) с комбинацией добавления ключевого словаАргументы функции модели и установка некоторых значений параметров как фиксированных.
Например, вы можете выполнить некоторую перестановку следующим образом:
def G(x, a, b=None, d=None):
if b is not None and d is None:
return calc_g_without_d(x, a, b)
return calc_g_with_d(x, a, d)
def F(x, gresult, b, c=None):
if c is None:
return calc_f_without_c(x, gresult, b)
return calc_f_with_c(x, gresult, b, c)
def model_func(x, a, b, c, d, g_with_d=True, f_with_c=True):
if g_with_d:
gresult = G(x, a, d)
else:
gresult = G(x, a, b)
if f_with_c:
return F(x, gresult, b, c=c)
else:
return F(x, gresult, b)
Теперь, когда вы создаете свою модель, вы можете переопределитьзначения по умолчанию f_with_c
и / или g_with_d
:
import lmfit
mymodel = lmfit.Model(model_func, f_with_c=False)
params = mymodel.make_params(a=100, b=0.2201, c=2.110, d=0)
, а затем оценка модели с помощью mymodel.eval()
или выполнение подбора с помощью mymodel.fit()
и передача явных значений для аргументов ключевого слова f_with_c
и / или g_with_d
, например
test = mymodel.eval(params, x=np.linspace(-1, 1, 41),
f_with_c=False, g_with_d=False)
или
result = mymodel.fit(ydata, params, x=xdata, g_with_d=False)
Я думаю, как вы это указали, вы бы хотели убедиться, что d
не былпеременная в соответствии, когда g_with_d=False
, и есть случаи, когда вы бы хотели, чтобы b
не изменялось в соответствии.Вы можете сделать это с
params['b'].vary = False
params['d'].vary = False
по мере необходимости.Я могу себе представить, что ваша настоящая проблема немного больше, чем эта, но я надеюсь, что это поможет вам начать в правильном направлении.