电竞比分网-中国电竞赛事及体育赛事平台

分享

Python科學(xué)計(jì)算

 imelee 2017-03-25

任意波形的生成 (geneartion of arbitrary waveform) 在商業(yè),軍事等領(lǐng)域都有著重要的應(yīng)用,諸如空間光通信 (free-space optics communication), 高速信號(hào)處理 (high-speed signal processing),雷達(dá) (radar) 等。在任意波形生成后,如何評(píng)估生成的任意波形成為另外一個(gè)重要的話(huà)題。

scipy.optimize.leastsq

假設(shè)有一組實(shí)驗(yàn)數(shù)據(jù),已知他們之間的函數(shù)關(guān)系:y=f(x),通過(guò)這些信息,需要確定函數(shù)中的一些參數(shù)項(xiàng)。例如,f 是一個(gè)線(xiàn)型函數(shù) f(x)=k*x+b,那么參數(shù) k 和 b 就是需要確定的值。如果這些參數(shù)用 p 表示的話(huà),那么就需要找到一組 p 值使得如下公式中的 S 函數(shù)最小:


這種算法被稱(chēng)之為最小二乘擬合 (least-square fitting)。scipy 中的子函數(shù)庫(kù) optimize 已經(jīng)提供實(shí)現(xiàn)最小二乘擬合算法的函數(shù) leastsq。下面是 leastsq 函數(shù)導(dǎo)入的方式:

from scipy.optimize import leastsq

scipy.optimize.leastsq 使用方法

波形數(shù)據(jù)導(dǎo)入

Python科學(xué)計(jì)算——Numpy.genfromtxt 一文中,使用 numpy.genfromtxt 對(duì)數(shù)字示波器采集的三角波數(shù)據(jù)導(dǎo)入進(jìn)行了介紹,今天,就以 4GHz三角波 波形的擬合為案例介紹任意波形的擬合方法。

Type:          raw
Points:        16200
Count:         1
...
Y Units:       Volt
XY Data:
2.4000000E-008, 1.4349E-002
2.4000123E-008, 1.6005E-002
2.4000247E-008, 1.5455E-002
2.4000370E-008, 1.5702E-002
...
data = np.genfromtxt('waveform.txt',delimiter=',',skip_header=18)

模型的選擇

Python科學(xué)計(jì)算——如何構(gòu)建模型? 一文中,討論了如何構(gòu)建三角波模型。在標(biāo)準(zhǔn)三角波波形的基礎(chǔ)上添加了橫向,縱向的平移和伸縮特征參數(shù),最后添加了噪聲參數(shù)模擬了三角波幅度參差不齊的隨機(jī)性特征。但在波形擬合時(shí),并不是所有的特征參數(shù)都要納入考量,例如,噪聲參數(shù)應(yīng)是波形生成系統(tǒng)的固有特征,正因?yàn)樗拇嬖谑沟卯a(chǎn)生的波形存在瑕疵,因此,在進(jìn)行波形擬合并評(píng)估時(shí),不應(yīng)將噪聲參數(shù)納入考量,最終模型如下:

def triangle_wave(x,p):
    a,b,c,T = p
    y = np.where(np.mod(x-b,T)<T/2, -4/T*(np.mod(x-b,T))+1+c/a, 0)
    y = np.where(np.mod(x-b,T)>=T/2, 4/T*(np.mod(x-b,T))-3+c/a, y)
    return a*y

波形擬合

在調(diào)用 scipy.optimize.leastsq 函數(shù)時(shí),需要構(gòu)建誤差函數(shù):

def residuals(p,y,x):
    return y - triangle_wave(x,p)

有時(shí)候,為了使圖片有更好的效果,需要對(duì)數(shù)據(jù)進(jìn)行一些處理:

x = data[:,0]
x_fig = map(lambda x : (x-data[0,0])*1e12, data[:,0]) # 畫(huà)圖數(shù)據(jù)
y = data[:,1]

leastsq 調(diào)用方式如下:

p0 = [1.056,215e-12,0.0108,2.51337e-10] # 初始參數(shù)
plsq = leastsq(residuals,p0,args=(y,x))
y2 = triangle_wave(x,plsq[0])

合理的設(shè)置 p0 可以減少程序運(yùn)行時(shí)間,因此,可以在運(yùn)行一次程序后,用擬合后的相應(yīng)數(shù)據(jù)對(duì) p0 進(jìn)行修正。

數(shù)據(jù)可視化

在對(duì)波形進(jìn)行擬合后,調(diào)用 pylab 對(duì)擬合前后的數(shù)據(jù)進(jìn)行可視化:

pl.plot(x_fig, y, 'b', label='Experiment data', linewidth=3)
pl.plot(x_fig, y2, 'r--',label='Fitting data', linewidth=2)
pl.ylim(-1.5,2)
pl.xlabel('Time(ps)')
pl.ylabel('Amplitude[a.u.]')
pl.legend()
pl.show()

triangular waveform fitting

擬合效果評(píng)估

均方根誤差 (root mean square error) 是一個(gè)很好的評(píng)判標(biāo)準(zhǔn),它是觀測(cè)值與真值偏差的平方和觀測(cè)次數(shù)n比值的平方根,在實(shí)際測(cè)量中,觀測(cè)次數(shù)n總是有限的,真值只能用最可信賴(lài)(最佳)值來(lái)代替.方根誤差對(duì)一組測(cè)量中的特大或特小誤差反映非常敏感,所以,均方根誤差能夠很好地反映出測(cè)量的精密度。


RMSE 用程序?qū)崿F(xiàn)如下:

variances = map(lambda x,y : (x-y)**2, y, y2)
variance = np.sum(variances)  
RMSE =  np.sqrt(variance/len(x))

擬合效果,模型參數(shù)輸出:

print RMSE,plsq[0]
>>> 1.63442970685e-05 [  1.05325324e+00   2.15580302e-10   1.07998635e-02   2.51337252e-10]

其他模型

leastsq 函數(shù)適用于任何波形的擬合,下面就來(lái)介紹一些常用的其他波形:

方波

def square_wave(x,p):
    a, b, c, T = p
    y = np.where(np.mod(x-b,T)<T/2, 1+c/a, 0)
    y = np.where(np.mod(x-b,T)>T/2, -1+c/a, y)
    return a*y

square wave

高斯波形

def gaussian_wave(x,p):
    a, b, c, d= p
    return a*np.exp(-(x-b)**2/(2*c**2))+d

gaussian wave

Stay hungry, Stay foolish. -- Steve Jobs

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多