任意波形的生成 (geneartion of arbitrary waveform) 在商業(yè),軍事等領(lǐng)域都有著重要的應(yīng)用,諸如空間光通信 (free-space optics communication), 高速信號(hào)處理 (high-speed signal processing),雷達(dá) (radar) 等。在任意波形生成后, 如何評(píng)估生成的任意波形 成為另外一個(gè)重要的話題。
創(chuàng)新互聯(lián)公司專注于蘇州網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供蘇州營(yíng)銷型網(wǎng)站建設(shè),蘇州網(wǎng)站制作、蘇州網(wǎng)頁(yè)設(shè)計(jì)、蘇州網(wǎng)站官網(wǎng)定制、微信小程序開(kāi)發(fā)服務(wù),打造蘇州網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供蘇州網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
假設(shè)有一組實(shí)驗(yàn)數(shù)據(jù),已知他們之間的函數(shù)關(guān)系:y=f(x),通過(guò)這些信息,需要確定函數(shù)中的一些參數(shù)項(xiàng)。例如,f 是一個(gè)線型函數(shù) f(x)=k*x+b,那么參數(shù) k 和 b 就是需要確定的值。如果這些參數(shù)用 p 表示的話,那么就需要找到一組 p 值使得如下公式中的 S 函數(shù)最小:
這種算法被稱之為 最小二乘擬合 (least-square fitting)。scipy 中的子函數(shù)庫(kù) optimize 已經(jīng)提供實(shí)現(xiàn)最小二乘擬合算法的函數(shù) leastsq 。下面是 leastsq 函數(shù)導(dǎo)入的方式:
scipy.optimize.leastsq 使用方法
在 Python科學(xué)計(jì)算——Numpy.genfromtxt 一文中,使用 numpy.genfromtxt 對(duì)數(shù)字示波器采集的三角波數(shù)據(jù)導(dǎo)入進(jìn)行了介紹,今天,就以 4GHz三角波 波形的擬合為案例介紹任意波形的擬合方法。
在 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ù)納入考量,最終模型如下:
在調(diào)用 scipy.optimize.leastsq 函數(shù)時(shí),需要構(gòu)建誤差函數(shù):
有時(shí)候,為了使圖片有更好的效果,需要對(duì)數(shù)據(jù)進(jìn)行一些處理:
leastsq 調(diào)用方式如下:
合理的設(shè)置 p0 可以減少程序運(yùn)行時(shí)間,因此,可以在運(yùn)行一次程序后,用擬合后的相應(yīng)數(shù)據(jù)對(duì) p0 進(jìn)行修正。
在對(duì)波形進(jìn)行擬合后,調(diào)用 pylab 對(duì)擬合前后的數(shù)據(jù)進(jìn)行可視化:
均方根誤差 (root mean square error) 是一個(gè)很好的評(píng)判標(biāo)準(zhǔn),它是觀測(cè)值與真值偏差的平方和觀測(cè)次數(shù)n比值的平方根,在實(shí)際測(cè)量中,觀測(cè)次數(shù)n總是有限的,真值只能用最可信賴(最佳)值來(lái)代替.方根誤差對(duì)一組測(cè)量中的特大或特小誤差反映非常敏感,所以,均方根誤差能夠很好地反映出測(cè)量的精密度。
RMSE 用程序?qū)崿F(xiàn)如下:
擬合效果,模型參數(shù)輸出:
leastsq 函數(shù)適用于任何波形的擬合,下面就來(lái)介紹一些常用的其他波形:
python做科學(xué)計(jì)算的特點(diǎn):1. 科學(xué)庫(kù)很全。(推薦學(xué)習(xí):Python視頻教程)
科學(xué)庫(kù):numpy,scipy。作圖:matplotpb。并行:mpi4py。調(diào)試:pdb。
2. 效率高。
如果你能學(xué)好numpy(array特性,f2py),那么你代碼執(zhí)行效率不會(huì)比f(wàn)ortran,C差太多。但如果你用不好array,那樣寫(xiě)出來(lái)的程序效率就只能呵呵了。所以入門(mén)后,請(qǐng)一定花足夠多的時(shí)間去了解numpy的array類。
3. 易于調(diào)試。
pdb是我見(jiàn)過(guò)最好的調(diào)試工具,沒(méi)有之一。直接在程序斷點(diǎn)處給你一個(gè)截面,這只有文本解釋語(yǔ)言才能辦到。毫不夸張的說(shuō),你用python開(kāi)發(fā)程序只要fortran的1/10時(shí)間。
4. 其他。
它豐富而且統(tǒng)一,不像C++的庫(kù)那么雜(好比pnux的各種發(fā)行版),python學(xué)好numpy就可以做科學(xué)計(jì)算了。python的第三方庫(kù)很全,但是不雜。python基于類的語(yǔ)言特性讓它比起fortran等更加容易規(guī)?;_(kāi)發(fā)。
數(shù)值分析中,龍格-庫(kù)塔法(Runge-Kutta methods)是用于非線性常微分方程的解的重要的一類隱式或顯式迭代法。這些技術(shù)由數(shù)學(xué)家卡爾·龍格和馬丁·威爾海姆·庫(kù)塔于1900年左右發(fā)明。
龍格-庫(kù)塔(Runge-Kutta)方法是一種在工程上應(yīng)用廣泛的高精度單步算法,其中包括著名的歐拉法,用于數(shù)值求解微分方程。由于此算法精度高,采取措施對(duì)誤差進(jìn)行抑制,所以其實(shí)現(xiàn)原理也較復(fù)雜。
高斯積分是在概率論和連續(xù)傅里葉變換等的統(tǒng)一化等計(jì)算中有廣泛的應(yīng)用。在誤差函數(shù)的定義中它也出現(xiàn)。雖然誤差函數(shù)沒(méi)有初等函數(shù),但是高斯積分可以通過(guò)微積分學(xué)的手段解析求解。高斯積分(Gaussian integral),有時(shí)也被稱為概率積分,是高斯函數(shù)的積分。它是依德國(guó)數(shù)學(xué)家兼物理學(xué)家卡爾·弗里德里?!じ咚怪帐纤?。
洛倫茨吸引子及其導(dǎo)出的方程組是由愛(ài)德華·諾頓·洛倫茨于1963年發(fā)表,最初是發(fā)表在《大氣科學(xué)雜志》(Journal of the Atmospheric Sciences)雜志的論文《Deterministic Nonperiodic Flow》中提出的,是由大氣方程中出現(xiàn)的對(duì)流卷方程簡(jiǎn)化得到的。
這一洛倫茨模型不只對(duì)非線性數(shù)學(xué)有重要性,對(duì)于氣候和天氣預(yù)報(bào)來(lái)說(shuō)也有著重要的含義。行星和恒星大氣可能會(huì)表現(xiàn)出多種不同的準(zhǔn)周期狀態(tài),這些準(zhǔn)周期狀態(tài)雖然是完全確定的,但卻容易發(fā)生突變,看起來(lái)似乎是隨機(jī)變化的,而模型對(duì)此現(xiàn)象有明確的表述。
更多Python相關(guān)技術(shù)文章,請(qǐng)?jiān)L問(wèn)Python教程欄目進(jìn)行學(xué)習(xí)!以上就是小編分享的關(guān)于python能做什么科學(xué)計(jì)算的詳細(xì)內(nèi)容希望對(duì)大家有所幫助,更多有關(guān)python教程請(qǐng)關(guān)注環(huán)球青藤其它相關(guān)文章!
Python math 庫(kù)提供許多對(duì)浮點(diǎn)數(shù)的數(shù)學(xué)運(yùn)算函數(shù),math模塊不支持復(fù)數(shù)運(yùn)算,若需計(jì)算復(fù)數(shù),可使用cmath模塊(本文不贅述)。
使用dir函數(shù),查看math庫(kù)中包含的所有內(nèi)容:
1) math.pi????# 圓周率π
2) math.e????#自然對(duì)數(shù)底數(shù)
3) math.inf? ? #正無(wú)窮大∞,-math.inf? ? #負(fù)無(wú)窮大-∞
4) math.nan? ? #非浮點(diǎn)數(shù)標(biāo)記,NaN(not a number)
1) math.fabs(x)? ? #表示X值的絕對(duì)值
2) math.fmod(x,y)? ? #表示x/y的余數(shù),結(jié)果為浮點(diǎn)數(shù)
3) math.fsum([x,y,z])? ? #對(duì)括號(hào)內(nèi)每個(gè)元素求和,其值為浮點(diǎn)數(shù)
4) math.ceil(x)? ? #向上取整,返回不小于x的最小整數(shù)
5)math.floor(x)? ? #向下取整,返回不大于x的最大整數(shù)
6) math.factorial(x)? ? #表示X的階乘,其中X值必須為整型,否則報(bào)錯(cuò)
7) math.gcd(a,b)? ? #表示a,b的最大公約數(shù)
8)? math.frexp(x)? ? ? #x = i *2^j,返回(i,j)
9) math.ldexp(x,i)? ? #返回x*2^i的運(yùn)算值,為math.frexp(x)函數(shù)的反運(yùn)算
10) math.modf(x)? ? #表示x的小數(shù)和整數(shù)部分
11) math.trunc(x)? ? #表示x值的整數(shù)部分
12) math.copysign(x,y)? ? #表示用數(shù)值y的正負(fù)號(hào),替換x值的正負(fù)號(hào)
13) math.isclose(a,b,rel_tol =x,abs_tol = y)? ? #表示a,b的相似性,真值返回True,否則False;rel_tol是相對(duì)公差:表示a,b之間允許的最大差值,abs_tol是最小絕對(duì)公差,對(duì)比較接近于0有用,abs_tol必須至少為0。
14) math.isfinite(x)? ? #表示當(dāng)x不為無(wú)窮大時(shí),返回True,否則返回False
15) math.isinf(x)? ? #當(dāng)x為±∞時(shí),返回True,否則返回False
16) math.isnan(x)? ? #當(dāng)x是NaN,返回True,否則返回False
1) math.pow(x,y)? ? #表示x的y次冪
2) math.exp(x)? ? #表示e的x次冪
3) math.expm1(x)? ? #表示e的x次冪減1
4) math.sqrt(x)? ? #表示x的平方根
5) math.log(x,base)? ? #表示x的對(duì)數(shù)值,僅輸入x值時(shí),表示ln(x)函數(shù)
6) math.log1p(x)? ? #表示1+x的自然對(duì)數(shù)值
7) math.log2(x)? ? #表示以2為底的x對(duì)數(shù)值
8) math.log10(x)? ? #表示以10為底的x的對(duì)數(shù)值
1) math.degrees(x)? ? #表示弧度值轉(zhuǎn)角度值
2) math.radians(x)? ? #表示角度值轉(zhuǎn)弧度值
3) math.hypot(x,y)? ? #表示(x,y)坐標(biāo)到原點(diǎn)(0,0)的距離
4) math.sin(x)? ? #表示x的正弦函數(shù)值
5) math.cos(x)? ? #表示x的余弦函數(shù)值
6) math.tan(x)? ? #表示x的正切函數(shù)值
7)math.asin(x)? ? #表示x的反正弦函數(shù)值
8)?math.acos(x)? ? #表示x的反余弦函數(shù)值
9)?math.atan(x)? ? #表示x的反正切函數(shù)值
10) math.atan2(y,x)? ? #表示y/x的反正切函數(shù)值
11) math.sinh(x)? ? #表示x的雙曲正弦函數(shù)值
12) math.cosh(x)? ? #表示x的雙曲余弦函數(shù)值
13) math.tanh(x)? ? #表示x的雙曲正切函數(shù)值
14) math.asinh(x)? ? #表示x的反雙曲正弦函數(shù)值
15) math.acosh(x)? ? #表示x的反雙曲余弦函數(shù)值
16) math.atanh(x)? ? #表示x的反雙曲正切函數(shù)值
1)math.erf(x)? ? #高斯誤差函數(shù)
2) math.erfc(x)? ? #余補(bǔ)高斯誤差函數(shù)
3) math.gamma(x)? ? #伽馬函數(shù)(歐拉第二積分函數(shù))
4) math.lgamma(x)? ? #伽馬函數(shù)的自然對(duì)數(shù)