【发布时间】:2021-10-08 14:39:59
【问题描述】:
我正在尝试使用双重退火算法执行全局优化拟合例程。在通过合成数据测试代码(它可以工作)之后,我现在正在尝试分析实验代码。不幸的是,拟合返回了相当线性的行为,无法捕捉数据的真实趋势。我假设这里的问题是我给参数的初始值。老实说,我不知道应该为他们分配哪个价值。有人可以给我一个小提示吗? 我可以做任何额外的评估来分配值或检查拟合的正确性吗? 代码下方。
def fit_msd3(params,t,data):
A = params['A']
B = params['B']
a = params['a']
C = params['C']
b = params['b']
model = A*t + B * (1 - np.exp(-a*t))+ C * (1 - np.exp(-b*t))
return np.log(model) - np.log(data)
# create a set of Parameters
params = Parameters()
params.add('B', value = 0, min=0, max = 1000000)
params.add('A', min=0.0001, max = 1000000)
params.add('a', value=0.25, min=0.0001, max = 1000000)
params.add('C', min=0, max = 1000000)
params.add('b', value = 0.16, min=0.0001, max = 1000000)
x =[ 4., 6., 8., 10., 14., 18., 22., 28., 36., 44., 54., 66., 82., 102.,126., 154., 190., 234., 286., 350., 428., 524., 642., 786.]
y = [1.15665197, 2.54089084, 4.39305993, 6.65139545, 12.16321355, 18.71986828, 26.05988679, 38.11383458, 55.45630159, 73.4806873, 95.87748006, 122.00380449, 155.64913134, 195.18638036, 236.78299798, 275.1298213, 315.73083698, 363.20054857, 410.54976453, 449.63215925, 476.15782442, 513.45335548, 589.47002132, 609.59510735]
plt.plot(np.log(x),np.log(y))
opt_args = {'initial_temp': 1050000, 'accept': -2.}
minner = Minimizer(fit_msd3, params, fcn_args=(x, y), max_nfev = 20000000)
result = minner.minimize(method="dual_annealing", **opt_args)
# show results
report_fit(result)
fig, ax = plt.subplots(figsize = (15,15))
ax.grid()
ax.set_ylabel('$\Delta_{msd}$(t) [$\mu$m]', fontsize=18)
ax.set_xlabel('Time Lag $\Delta t$ [s]', fontsize=18)
ax.plot(np.log(x), np.log(y), 'ko', lw=2)
ax.plot(np.log(x), np.log(y)+result.residual, 'r-', lw=2)
plt.legend(['data', 'dual anneal'], loc='upper left')
【问题讨论】:
标签: python optimization curve-fitting simulated-annealing