【发布时间】:2020-06-02 19:51:36
【问题描述】:
我正在尝试使用 lmfit 模块围绕以下数据进行高斯拟合:
x = np.array([-1.36534351e-09, -1.29984067e-09, -1.23433782e-09, -1.16883498e-09,
-1.10333214e-09, -1.03782929e-09, -9.72326447e-10, -9.06823602e-10,
-8.41320758e-10, -7.75817913e-10, -7.10315069e-10, -6.44812224e-10,
-5.79309380e-10, -5.13806535e-10, -4.48303691e-10, -3.82800846e-10,
-3.17298002e-10, -2.51795157e-10, -1.86292313e-10, -1.20789468e-10,
-5.52866238e-11, 1.02162207e-11, 7.57190652e-11, 1.41221910e-10,
2.06724754e-10, 2.72227599e-10, 3.37730443e-10, 4.03233288e-10,
4.68736132e-10, 5.34238977e-10, 5.99741821e-10, 6.65244666e-10,
7.30747510e-10, 7.96250355e-10, 8.61753199e-10, 9.27256043e-10,
9.92758888e-10, 1.05826173e-09, 1.12376458e-09, 1.18926742e-09,
1.25477027e-09, 1.32027311e-09, 1.38577595e-09, 1.45127880e-09,
1.51678164e-09, 1.58228449e-09, 1.64778733e-09, 1.71329018e-09,
1.77879302e-09, 1.84429587e-09])
y = np.array([ 2, 0, 0, 0, 1, 0, 0, 1, 0, 1, 2, 4, 7, 8, 17, 13, 45,
77, 182, 346, 494, 512, 443, 327, 192, 115, 62, 28, 20, 16, 13, 5, 6, 2, 1, 0,
0, 2, 4, 1, 2, 2, 1, 2, 2, 1, 2, 2, 0, 1])
有趣的是,如果我将 x 数据数组乘以 100,拟合似乎可以正常工作:
我怀疑这可能是由于最初的猜测不准确,但我仍然不太确定为什么会发生这种情况以及如何解决这个问题。我在下面包含了整个代码:
import matplotlib.pyplot as plt
from lmfit.models import GaussianModel
import numpy as np
x = np.array([-1.36534351e-09, -1.29984067e-09, -1.23433782e-09, -1.16883498e-09,
-1.10333214e-09, -1.03782929e-09, -9.72326447e-10, -9.06823602e-10,
-8.41320758e-10, -7.75817913e-10, -7.10315069e-10, -6.44812224e-10,
-5.79309380e-10, -5.13806535e-10, -4.48303691e-10, -3.82800846e-10,
-3.17298002e-10, -2.51795157e-10, -1.86292313e-10, -1.20789468e-10,
-5.52866238e-11, 1.02162207e-11, 7.57190652e-11, 1.41221910e-10,
2.06724754e-10, 2.72227599e-10, 3.37730443e-10, 4.03233288e-10,
4.68736132e-10, 5.34238977e-10, 5.99741821e-10, 6.65244666e-10,
7.30747510e-10, 7.96250355e-10, 8.61753199e-10, 9.27256043e-10,
9.92758888e-10, 1.05826173e-09, 1.12376458e-09, 1.18926742e-09,
1.25477027e-09, 1.32027311e-09, 1.38577595e-09, 1.45127880e-09,
1.51678164e-09, 1.58228449e-09, 1.64778733e-09, 1.71329018e-09,
1.77879302e-09, 1.84429587e-09])
y = np.array([ 2, 0, 0, 0, 1, 0, 0, 1, 0, 1, 2, 4, 7, 8, 17, 13, 45,
77, 182, 346, 494, 512, 443, 327, 192, 115, 62, 28, 20, 16, 13, 5, 6, 2, 1, 0, 0, 2,
4, 1, 2, 2, 1, 2, 2, 1, 2, 2, 0, 1])
mod = GaussianModel()
pars = mod.guess(y, x=x)
final_fit = mod.fit(y, pars, x=x)
plt.plot(x, final_fit.init_fit, label='Initial fit')
plt.plot(x, final_fit.best_fit, label='Gaussian fit')
plt.scatter(x, y, label='data points')
plt.show()
更新: 我在另一台计算机上测试了完全相同的程序,结果证明它在那里完美运行。现在,我不太确定。
【问题讨论】:
-
我可以重现这个。这可能是一个数值精度问题,因此按比例放大 x 轴可以解决问题。这样做也绝对没有问题。您只需在拟合后将结果缩放回原始缩放。
-
您好,感谢您的帮助。情况可能是这样,尽管我觉得它在我的旧电脑上工作很奇怪,但在新电脑上却不行。我只是缩放我的结果。
标签: python curve-fitting lmfit