仅使用Python中的一个gaussian-side绘制Python和matpy

2024-06-16 11:07:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我在第一个象限中有一组点看起来像高斯分布,我试图用python中的高斯函数拟合它,我的代码如下:

import pylab as plb
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy import asarray as ar,exp
import math


x=ar([37,69,157,238,274,319,391,495,533,626,1366,1855,2821,3615,4130,4374,6453,6863,7021,
    7951,8646,9656,10464,11400])
y=ar([1.77,1.67,1.65,1.17,1.34,1.46,0.75,1,0.8,1.02,0.65,0.69,0.44,0.44,0.55,0.43,0.75,0.27,0.26,
    0.44,0.04,0.44,0.26,0.04])



n = 24                          #the number of data
mean = sum(x*y)/n                   #note this correction
sigma = math.sqrt(sum(y*(x-mean)**2)/n)        #note this correction

def gaus(x,a,x0,sigma):
    return a*exp(-(x-x0)**2/(2*sigma**2))

popt,pcov = curve_fit(gaus,x,y,p0=None, sigma=None)  #'''p0=[1,mean,sigma]'''

plt.plot(x,y,'b+:',label='data')
plt.plot(x,gaus(x,*popt),'ro:',label='fit')
plt.legend()
plt.title('Fig. 3 - Fit for Time Constant')
plt.xlabel('Time (s)')
plt.ylabel('Voltage (V)')
plt.show()

结果是:这个数字: http://s2.postimg.org/wevggkc95/Workspace_1_022.png

为什么所有的红点都在下面,还请注意,我对半高斯的数据感兴趣,因为我的数据是这样的,所以我的y值一开始很大,然后像高斯钟形的一侧一样减小。有谁能告诉我如何在python中拟合这条曲线(万一它不能拟合高斯曲线)。或者换句话说,我希望代码适合我的点的一半(左侧)高斯分布(仅在第一象限)。请注意,我的点不能像我之前尝试的那样拟合成指数递减曲线,并且它在较低的“x”值下拟合得不好。在


Tags: 代码fromimportaspltmathscipymean
1条回答
网友
1楼 · 发布于 2024-06-16 11:07:18

显然,你的数据不适合或不容易符合高斯函数。您使用p0 = [1,1,1]的默认初始猜测,这与curve_fit在开始之前放弃的任何一种最佳选择相差甚远(请检查popt=[1,1,1]和{}的值)。您可以尝试更好的猜测(例如p0 = [2,0, 2000]),但在我的系统中,它不会收敛:Optimal parameters not found: Number of calls to function has reached maxfev = 800.

要拟合“半高斯”,请不要使中心位置x0浮动(只需使其等于0):

def gaus(x,a,sigma):
    return a*exp(-(x)**2/(2*sigma**2))

p0 = [1.2, 4000]
popt,pcov = curve_fit(gaus,x,y,p0=p0) 

enter image description here

除非您有特殊的理由想要拟合高斯函数,为什么不将更稳健的线性最小二乘法拟合到多项式上,例如:

^{pr2}$

相关问题 更多 >