15

宇宙線検出器からのエネルギー スペクトルがあります。スペクトルは指数曲線に従いますが、広い (そしておそらく非常にわずかな) 塊が含まれます。データには、明らかにノイズの要素が含まれています。

データを滑らかにしてから、その勾配をプロットしようとしています。これまでのところ、scipy sline 関数を使用して滑らかにし、次に np.gradient() を使用してきました。

写真からわかるように、グラデーション関数の方法は各ポイント間の違いを見つけることであり、塊をはっきりと示していません。

基本的に滑らかなグラデーショングラフが必要です。どんな助けでも素晴らしいでしょう!

私は2つのスプライン法を試しました:

def smooth_data(y,x,factor):
    print "smoothing data by interpolation..."
    xnew=np.linspace(min(x),max(x),factor*len(x))
    smoothy=spline(x,y,xnew)
    return smoothy,xnew

def smooth2_data(y,x,factor):
    xnew=np.linspace(min(x),max(x),factor*len(x))
    f=interpolate.UnivariateSpline(x,y)
    g=interpolate.interp1d(x,y)
    return g(xnew),xnew

編集:数値微分を試みました:

def smooth_data(y,x,factor):
    print "smoothing data by interpolation..."
    xnew=np.linspace(min(x),max(x),factor*len(x))
    smoothy=spline(x,y,xnew)
    return smoothy,xnew

def minim(u,f,k):
    """"functional to be minimised to find optimum u. f is original, u is approx"""
    integral1=abs(np.gradient(u))
    part1=simps(integral1)
    part2=simps(u)
    integral2=abs(part2-f)**2.
    part3=simps(integral2)
    F=k*part1+part3
    return F


def fit(data_x,data_y,denoising,smooth_fac):
    smy,xnew=smooth_data(data_y,data_x,smooth_fac)
    y0,xnnew=smooth_data(smy,xnew,1./smooth_fac)
    y0=list(y0)
    data_y=list(data_y)
    data_fit=fmin(minim, y0, args=(data_y,denoising), maxiter=1000, maxfun=1000)
    return data_fit

ただし、同じグラフが再び返されるだけです。

データ、平滑化されたデータ、勾配

4

3 に答える 3