【发布时间】:2021-07-13 18:10:34
【问题描述】:
我目前正在对来自 DMA 测试(流变学)的多个数据进行非线性拟合。 对于我目前正在使用的数据,该程序可以工作,但我希望程序能够灵活地使曲线拟合的起始参数取决于我的数据输入。有没有办法确定这一点?
也许是蒙特卡洛方法,但我不知道从哪里开始。
这是我的代码,在此先感谢! :
def calc_gmm(dframe):
array_omega = np.array(dframe['Angular Frequency']).flatten()
array_G_storage = np.array(dframe['Storage Modulus']).flatten()
array_G_loss = np.array(dframe['Loss Modulus']).flatten()
chisqr = 99999999999;
j=1
fig, (ax1,ax2) = plt.subplots(nrows=2, ncols=1)
while j <= 10:
params = lmfit.Parameters()
# Adding amount n of parameters and G0, start values were determined by trial and error
params.add('n', value=j, vary=False, min=1, max=10)
params.add('G0', value=0.4, min=0)
for i in range(params['n'].value):
params.add(f't_{i}', value=0.5, min=0)
params.add(f'g_{i}', value=17, min=0)
# Minimization function
res = lmfit.minimize(min_function, params, args=(array_omega, array_G_storage, array_G_loss))
# Determining the smallest chi-squared in order to develop a criterium to stop iterating over different orders
if res.chisqr < chisqr*0.5:
chisqr = res.chisqr
ax1.plot(array_omega, array_G_storage + res.residual, label='n: '+ (str)(j))
ax2.plot(array_omega, array_G_loss + res.residual, label='n: '+ (str)(j))
j += 1
else:
params = lmfit.Parameters()
j -= 1
# Adding amount n of parameters and G0, start values were determined by trial and error
params.add('n', value=j, vary=False, min=1, max=10)
params.add('G0', value=0.4, min=0)
for i in range(params['n'].value):
params.add(f't_{i}', value=0.5, min=0)
params.add(f'g_{i}', value=17, min=0)
# Minimization function
res = lmfit.minimize(min_function, params, args=(array_omega, array_G_storage, array_G_loss))
j = 11
【问题讨论】:
标签: python curve-fitting model-fitting