【发布时间】:2021-10-02 08:10:01
【问题描述】:
我正在尝试熟悉非线性拟合过程:双重退火。为此,我生成了一些合成数据,并尝试为它们拟合一个基本的 Furth 公式,请参见下面的代码:
import numpy as np
from numpy import savetxt
from numpy import genfromtxt
import random
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from lmfit import Minimizer, Parameters, report_fit
from scipy.optimize import dual_annealing
def Furth(A,B, a, x):
model = A*x + B * (np.exp(-a*x)-1)
return model
生成合成数据:
x = np.arange(200)*0.5
x = x[1:]
A =1.88
B = 2.35
a = 5602
y = Furth(A,B,a,x) + np.random.randn(x.size)
定义要拟合的函数:
def fit_msd2(params, x, data):
A = params['A']
B = params['B']
c = params['c']
model = A*x + B * (np.exp(-c*x)-1)
return model - data
params = Parameters()
params.add('A', min=0, max = 100000)
params.add('B', min=-100, max = 100000)
params.add('c', min=0,max = 100000)
from scipy.optimize import dual_annealing
# do fit, here with the default leastsq algorithm
minner = Minimizer(fit_msd2, params, fcn_args=(x, y))
print(minner)
result = minner.minimize(method="dual_annealing")
print(result)
# calculate final result
final = x + result.residual
#print(final)
# write error report
report_fit(result)
fig, ax = plt.subplots(figsize = (10,10))
ax.grid()
ax.set_ylabel('$\Delta_{msd}$(t) [$\mu$m]', fontsize=18)
ax.set_xlabel('Time Lag $\Delta t$ [s]', fontsize=18)
ax.loglog(x, y, label = 'Synthetic data')
ax.loglog(x, final, 'r-', linewidth=3,label='Fit')
ax.legend(loc='best', fontsize = 12)
我认为配合不正常,我不明白是什么原因。我可以使用任何库或检查路由来评估它吗? 如果没有,有人可以建议另一种方法来执行这种模拟退火拟合吗?
提前致谢
【问题讨论】:
-
你有解释Furth公式的链接吗?试穿后
A, B, c得到什么? -
对于Furth公式,您可以查看Eq。 2:pagines.uab.cat/vmendez/sites/pagines.uab.cat.vmendez/files/…,
-
关于我的拟合参数:A=1.87, B=2.25, c=78977
-
你能添加
(x,y)的图吗?如果您在没有正常噪音的情况下适合会发生什么?英石。y = Furth(A,B,a,x) -
没有噪音,拟合结果仍然与它应该捕获的结果相去甚远。我无法插入评论图片,我会在下面评论帖子
标签: python scipy data-fitting simulated-annealing