Для этой и других задач подбора кривой может оказаться полезным lmfit (https://lmfit.github.io/lmfit-py)). Он обеспечивает более высокий уровень интерфейса для подбора кривой, чем curve_fit
, и имеет много удобных и расширенных опций для построения модели иработа с параметрами и статистикой подгонки.
С lmfit я бы предложил следующий подход:
import numpy as np
from scipy.optimize import curve_fit
from lmfit import Model
valY_list = [yyy1,yyy2,yyy3,yyy4]
valX_list = [xxx1,xxx2,xxx3,xxx4]
val_Y = np.array(valY_list)
val_X = np.array(valX_list)
def fit_func(x, a, b, c):
return (a*x)+(b*x)**c
mymodel = Model(fit_func)
params = mymodel.make_params(a=10, b=1, c=100.0)
params['a'].min = 2.0
params['a'].max = 200.
params['b'].min = 0.002
params['b'].max = 1.e8
params['c'].min = 10.0
params['c'].max = 10000.0
result = mymodel.fit(val_Y, params, x=val_X)
print(result.fit_report())
for par_name, param in result.params.items():
print(par_name, param.value, param.stderr)
Обратите внимание, что я немного изменил функцию вашей модели, чтобы использовать 1 / PARAM, и скорректировал границысоответственно (я думаю!). Напечатанный отчет о подгонке будет включать в себя статистику подбора, значения наилучшего подбора и стандартные ошибки для каждой из переменных. Также обратите внимание, что в lmfit эти параметры именуются в соответствии с именами аргументов вашей функции подбора, ичто мин / макс границы идут с объектом Parameter. Хотя в приведенном выше примере устанавливаются границы, вы также можете исправить любой из параметров, например (*):
params['c'].vary = False
И, если вы действительно хотите, чтобы вашA, B и C, вы можете сделать параметры для них как выражения с ограничениями:
params.add('A', expr='1/a')
params.add('B', expr='1/b')
params.add('C', expr='1/c')
Tон не будет меняться в соответствии, но их значения и стандартные ошибки будут сообщены.По сути, можно использовать любое допустимое выражение Python, использующее другие имена параметров и основные математические функции.
Существует множество других функций и достойной документации и примеров, но с этого следует начать.