我有一些实验数据(y,x,t_exp,m_exp),想使用约束多元BFGS方法找到适合这些数据的“最佳”模型参数(A,B,C,D,E)。参数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)
一些问题:
- 我的模型公式中,应该包含自变量x,还是应该从实验数据x_exp中作为*args的一部分提供?
- 当我运行上面的代码时,我收到一个错误消息"func()至少需要6个参数(已提供3个)",我认为这些参数是x和我的两个*args... 我应该如何定义func?
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)
我不确定边界是否正常工作。当我为E指定(0, None)时,我得到了运行标志2,异常终止。如果我将其设置为(1e-6, None),它可以正常运行,但选择了1e-6作为E。我是否正确指定了边界?