【发布时间】:2020-12-22 00:14:01
【问题描述】:
我似乎在为我的数据拟合函数时遇到问题。也许有人可以帮助我。
数据:
xValues = [65.2, 65.4, 65.1, 65.2, 65.4, 65.6, 65.5, 65.4, 65.5, 65.7, 65.6, 65.9, 65.7, 66.0, 66.1, 66.0, 66.3, 66.4, 66.4, 66.3, 66.3, 66.5, 66.6, 66.6, 66.6, 66.7, 66.8, 66.9, 66.8, 67.1, 67.0, 67.1, 67.1, 67.1, 67.2, 67.3, 67.5, 67.6, 67.6, 67.6, 67.8, 67.8, 67.9, 68.0, 68.1, 68.1, 67.9, 68.1, 68.2, 68.3, 68.4, 68.4, 68.6, 68.7, 68.7, 68.9, 68.8, 68.7, 68.9, 68.8, 69.0, 69.2, 69.3, 69.0, 69.2, 69.4, 69.6, 69.6, 69.7, 69.8, 69.7, 69.7, 69.6, 69.9, 69.7, 69.8, 70.0, 70.1, 70.2, 70.2, 70.2, 70.2, 70.5, 70.6, 70.6, 70.8, 71.0, 71.0, 71.0, 70.8, 71.0, 71.0, 71.2, 71.2, 71.1, 71.2, 71.4, 71.5, 71.7, 71.8, 71.8, 71.7, 71.7, 72.0, 72.0, 72.0, 72.1, 72.1, 72.0, 72.1, 72.3, 72.5, 72.4, 72.3, 72.4, 72.6, 72.6, 72.7, 72.9, 73.1, 73.0, 73.0, 73.3, 73.3, 73.2, 73.2, 73.4, 73.5, 73.5, 73.6, 73.6, 73.7, 73.8, 74.0, 73.9, 73.8, 73.9, 74.1, 74.2, 74.3, 74.4, 74.5, 74.6, 74.5, 74.4, 74.5, 74.7, 74.9, 74.9]
yValues = [57.4, 57.5, 53.2, 56.4, 47.3, 54.3, 60.4, 59.6, 59.2, 51.6, 53.1, 49.5, 54.9, 54.5, 56.0, 57.8, 54.7, 48.8, 55.7, 59.3, 54.6, 51.5, 43.6, 50.2, 55.3, 55.1, 59.9, 57.2, 60.0, 65.6, 64.0, 59.8, 59.9, 63.1, 67.4, 64.4, 58.7, 60.0, 55.6, 60.6, 58.7, 63.3, 67.3, 63.0, 60.5, 57.4, 60.1, 61.9, 62.8, 65.5, 62.0, 62.0, 69.7, 70.3, 72.0, 69.8, 67.1, 70.4, 63.3, 65.1, 65.1, 62.0, 64.9, 75.2, 69.6, 66.5, 63.9, 62.1, 66.2, 66.7, 66.5, 67.4, 69.6, 72.2, 73.1, 77.5, 73.5, 65.0, 74.0, 77.4, 74.8, 79.8, 84.2, 74.7, 69.5, 70.3, 70.1, 70.7, 74.4, 74.3, 73.3, 77.1, 73.8, 76.2, 71.3, 74.5, 74.5, 75.6, 75.5, 75.8, 73.5, 72.4, 75.3, 73.3, 74.9, 73.1, 78.9, 81.5, 80.6, 82.9, 79.1, 84.4, 79.8, 79.7, 79.8, 76.4, 80.5, 81.2, 88.0, 80.4, 81.2, 85.3, 79.3, 79.5, 82.4, 80.8, 80.1, 74.3, 76.3, 77.5, 78.9, 83.3, 82.9, 78.4, 80.8, 80.6, 84.8, 87.3, 86.4, 86.7, 85.5, 78.8, 81.1, 87.2, 87.1, 88.4, 85.6, 86.5, 88.8]
功能:#也称为Worm-Like-Chain模型,感兴趣的朋友可以参考一下...
def func(x,L,P):
return (((1.381*10**(-2)) * 295.15)/P) * (1/(4*((1-x/L)**2)) +x/L -1/4)
#Fitting function to data:
#CurveFittingBlackMagic
initialGuess = [50,1.0]
popt, pcov = curve_fit(func,xRange,yRange, initialGuess ,maxfev=1000000000)
print(popt)
print(pcov)
xFit = np.arange(0.0, 200, 0.01)
plt.plot(xFit, func(xFit,*popt),'r', label = 'fit params: L=%5.3f, P=%5.3f'%tuple(popt))
plt.ylim(-20, 150) plt.xlim(-20, 200)
#Plotting Data plt.plot(xValues,yValues)
plt.show()
这会产生图片中显示的结果,这显然是无稽之谈,但我不知道为什么。如果有人能指出我的错误,那就太棒了;)
【问题讨论】:
-
考虑格式化您的问题,使其实际上清晰易读
-
我会说你最初的猜测是错误的。 L 定义了分歧点。查看数据的形状,我会说它必须在右侧。你把它放在左边。 chi^2 最小化永远不会把它推到另一边。 (200, 1) 应该可以工作。
-
@Johan.Thanks 但遗憾的是更改 np.arange 不起作用
-
@mikuszefski:是的,最初的猜测并不精确,因为我不知道参数。数据应位于背离的左侧,因此 (200,1) 也不起作用。但无论如何,谢谢。我会尝试定制该死的函数,看看我是否可以通过这种方式得到一个相当好的近似值。
-
嗨,我没有得到“因此”。我在这里做了合身,看起来还不错。最终,我得到类似 (107, 0.14) 的结果。这几乎与最初的猜测无关,只要 L 稍大 90
标签: python matplotlib scipy curve-fitting data-fitting