我一直在尝试使用curve_fit来用我提供的线性拟合函数拟合我的数据。下面是一个简化版本:
from scipy.optimize import curve_fit
import numpy as np
def line(x,m,c):
return x*m + c
x = [10.55977951, 11.45686089, 12.35423473, 13.30408861, 14.3528772, 15.45035217,
16.64817782, 17.99661252, 19.49184541, 21.18832373, 23.08427703, 25.27645953,
27.91555605, 31.14343828, 35.16744841, 40.31943045, 47.22644384, 57.23413423, 73.51606363]
y = [ 4.50873148e-04, 2.29554869e-04, 4.62602769e-04, 1.57525181e-04,
1.16334543e-04, 9.42105291e-05, 2.86606379e-04, 2.40194287e-04,
4.74193673e-04, 6.83848270e-04, 6.73286482e-04, 2.03506304e-04,
3.58126867e-04, 1.88155439e-04, 5.14133854e-04, 2.39990293e-04,
-3.60391884e-05, -1.17866329e-04, 2.68954649e-05]
y_err = [8.23397676e-05, 7.54222285e-05, 7.05355053e-05, 6.30493368e-05,
5.73241555e-05, 5.56298862e-05, 5.00181328e-05, 4.76554758e-05,
4.45081313e-05, 4.23716792e-05, 4.10516842e-05, 3.87066834e-05,
3.67639901e-05, 3.51162489e-05, 3.39993704e-05, 3.29275562e-05,
3.24743967e-05, 3.15296789e-05, 3.09144126e-05]
x = np.array(x)
y = np.array(y)
y_err = np.array(y_err)
popt, cov = curve_fit(line, x, y, sigma=y_err)
m = popt[0]
c = popt[1]
print(m,c, cov)
line1 = m*np.array(x) + c
import matplotlib.pyplot as plt
plt.plot(x, line1, color="red", )
plt.plot(x, [0] * len(x), color="black")
plt.errorbar(x , y, label="g1", fmt="s", markersize=5, color="red")
plt.xscale("log")
plt.xlabel("dummy x ")
plt.ylabel("dummy y")
plt.legend()
plt.tight_layout()
plt.show()
字符串
基本上,配件仅正确地工作(即,进行线拟合),并且在其它情况下,如在上面的代码块中,将给予一些多项式拟合。我已经尝试输入p0的不同初始猜测值,但它实际上并没有解决这个问题--只是稍微改变了参数。理想情况下,我不希望给予p0,因为我想传递一堆不同的数据数组。我很乐意解决这个问题!我也愿意接受提供协方差的替代拟合建议。谢谢大家
1条答案
按热度按时间oalqel3c1#
“一些多项式拟合”也许你认为这是一个2阶或更高阶的多项式,因为你的输出是弯曲的,但这实际上只是因为你有对数尺度。从输出中删除对数刻度。加上雅可比矩阵因为它很简单。在你的
errorbar
里你没有传递错误。为什么?为什么?字符串
的数据