使用curve_fit适合python

时间:2018-09-06 20:43:39

标签: python numpy matplotlib scipy

我必须使用curve_fit进行拟合。我的问题是,我没有一条连续的曲线,而是得到了一条虚线,如图所示。这是我的代码:

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np  
from scipy.optimize import curve_fit

N=np.array([66851,200522,401272,801832,1200951])
e=np.array([2.88,1.75,1.17,0.80,0.71])

def er_func(x,A,c):
   return A/np.sqrt(x)+c
from scipy.optimize import curve_fit
popt, pcov=curve_fit(er_func,N,e,p0=[10,1000])
plt.plot(N,er_func(N,*popt),"b")
plt.plot(N,e,"xr")
plt.xlabel("Number of events")
plt.ylabel("Error [Chn]")

[https://i.stack.imgur.com/BZtnN.png][1]

我认为发生这种情况是因为我正在绘制根据我的点的对应关系求值的拟合函数,然后它将五个点用一条直线连接起来。如何获得正确的身材? 感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

我只显示代码的相关部分。您需要定义一个精细的网格(下面的N_mesh)来绘制连续拟合曲线。我强调了注释添加/修改的行

N=np.array([66851,200522,401272,801832,1200951])
N_mesh = np.linspace(N[0], N[-1], 100)  # Added (A mesh of 100 x-points)
e=np.array([2.88,1.75,1.17,0.80,0.71])

def er_func(x,A,c):
    return A/np.sqrt(x)+c
from scipy.optimize import curve_fit
popt, pcov=curve_fit(er_func,N,e,p0=[10,1000])
plt.plot(N_mesh,er_func(N_mesh,*popt),"b", label='Fit') # Modified
plt.plot(N,e,"xr", label='Actual data') # Modified
plt.legend(fontsize=14) # Added

输出

enter image description here

相关问题