如何在条形图上拟合曲线?
我有一个方程,即扩散方程,它有一些未知参数,这些参数使曲线更大、更高等。另一方面,我有一个来自模拟的条形图。我想在条形图上拟合曲线,并找到曲线的最佳参数,我该怎么做?
这是我通过“手动拟合”获得的,所以基本上我手动更改了几个小时的所有参数。但是有没有办法用python做到这一点?
为简单起见,假设我有以下代码:
import matplotlib.pyplot as plt
list1 = []
for i in range(-5,6):
list1.append(i)
width = 1/1.5
list2 = [0,0.2,0.6,3.5,8,10,8,3.5,0.6,0.2,0]
plt.bar(list1,list2,width)
plt.show()
T = 0.13
xx = np.arange(-6,6,0.01)
yy = 5*np.sqrt(np.pi)*np.exp(-((xx)**2)/(4*T))*scipy.special.erfc((xx)/(2*np.sqrt(T))) + np.exp(-((xx)**2)/(4*T))
plt.plot(xx,yy)
plt.show()
显然,这里的拟合会非常困难,但无论如何,是否有任何函数或类似函数可以让我找到方程的最佳系数:(其中 T 已知)
y = A*np.sqrt(np.pi*D)*np.exp(-((x-E)**2)/(4*D*T))*scipy.special.erfc((x-E)/(2*np.sqrt(D*T))) + 300*np.exp(-((x-E)**2)/(4*D*T))
编辑:这与已经提出的问题和 scipy 文档示例不同。在后者中,“xdata”是相同的,而在我的情况下,它可能是也可能不是。此外,我还可以绘制此曲线拟合,文档中未显示。条的高度不是 x 的函数!所以我的 xdata 不是我的 ydata 的函数,这与文档中的不同。要了解我的意思,请尝试稍微更改文档中的代码,以符合我的示例,请尝试以下操作:
def func(x,a,b,c):
return a * np.exp(-b * x) + c
xdata = np.linspace(0,4,50)
y = func(xdata, 2.5, 1.3, 0.5)
ydata = [1,6,3,4,6,7,8,5,7,0,9,8,2,3,4,5]
popt, pcov = curve_fit(func,xdata,ydata)
如果你运行它,它就不起作用。原因是 ydata 有 16 个元素,函数有 50 个元素。发生这种情况是因为 y 从 xdata 中获取值,而 ydata 从另一组 x 值中获取值,这在此处是未知的。
谢谢