У меня есть некоторые экспериментальные данные (для y, x, t_exp, m_exp), и я хочу найти "оптимальные" параметры модели (A, B, C, D, E) для этих данных с использованием многомерного метода BFGS с ограничениями . Параметр E должен быть больше 0, остальные не ограничены.
def func(x, A, B, C, D, E, *args):
return A * (x ** E) * numpy.cos(t_exp) * (1 - numpy.exp((-2 * B * x) / numpy.cos(t_exp))) + numpy.exp((-2 * B * x) / numpy.cos(t_exp)) * C + (D * m_exp)
initial_values = numpy.array([-10, 2, -20, 0.3, 0.25])
mybounds = [(None,None), (None,None), (None,None), (None,None), (0, None)]
x,f,d = scipy.optimize.fmin_l_bfgs_b(func, x0=initial_values, args=(m_exp, t_exp), bounds=mybounds)
Несколько вопросов:
func
включать мою независимую переменную x
или она должна быть предоставлена из экспериментальных данных x_exp
как часть of * args
? func () принимает не менее 6 аргументов (3 задано)
, которые, как я полагаю, равны x, и мои два * аргумента ... Как мне определить func
? РЕДАКТИРОВАТЬ: Благодаря ответу @zephyr я теперь понимаю, что цель состоит в том, чтобы минимизировать сумму квадратов остатков, а не фактическую функцию. Я получил следующий рабочий код:
def func(params, *args):
l_exp = args[0]
s_exp = args[1]
m_exp = args[2]
t_exp = args[3]
A, B, C, D, E = params
s_model = A * (l_exp ** E) * numpy.cos(t_exp) * (1 - numpy.exp((-2 * B * l_exp) / numpy.cos(t_exp))) + numpy.exp((-2 * B * l_exp) / numpy.cos(theta_exp)) * C + (D * m_exp)
residual = s_exp - s_model
return numpy.sum(residual ** 2)
initial_values = numpy.array([-10, 2, -20, 0.3, 0.25])
mybounds = [(None,None), (None,None), (None,None), (None,None), (0,None)]
x, f, d = scipy.optimize.fmin_l_bfgs_b(func, x0=initial_values, args=(l_exp, s_exp, m_exp, t_exp), bounds=mybounds, approx_grad=True)
Я не уверен, что границы работают правильно. Когда я указываю (0, Нет) для E, я получаю флаг выполнения 2, аварийное завершение. Если я установил для него значение (1e-6, None), он будет работать нормально, но выберет 1e-6 как E. Правильно ли я указываю границы?