GSL中的数值积分
數(shù)值積分
本章描述了對(duì)一維函數(shù)進(jìn)行數(shù)值積分(求積)的程序。常用函數(shù)有自適應(yīng)和非自適應(yīng)集成的例程,具體情況有專門的例程。這些包括在無(wú)限和半無(wú)限范圍內(nèi)的積分,奇異積分,包括對(duì)數(shù)奇點(diǎn),柯西主值的計(jì)算和振蕩積分。本庫(kù)重新實(shí)現(xiàn)了在QUADPACK中使用的算法,數(shù)值積分包由Piessens、de donker - kapenga、Ueberhuber和Kahaner編寫。在Netlib上可以找到Fortran版的QUADPACK代碼。包括具有高精度系數(shù)的非自適應(yīng)、定階Gauss-Legendre積分例程,以及IQPACK中各種加權(quán)函數(shù)的定階求積規(guī)則。
本章中描述的函數(shù)聲明在頭文件gsl_integration.h中。
17.1 介紹
??? 每種算法都會(huì)計(jì)算出以下形式的定積分的近似值:
其中,wx是一個(gè)權(quán)重函數(shù)(對(duì)于一般的被積函數(shù)wx=1)。用戶提供了絕對(duì)誤差和相對(duì)誤差界限(epsabs,epsrel),它規(guī)定了以下精度要求:
?其中,RESULT是該算法獲得的數(shù)值近似值。該算法嘗試以以下不等式成立的方式估算絕對(duì)誤差A(yù)BSERR = | RESULT - I |。
???? 簡(jiǎn)言之,例程返回第一近似值,其絕對(duì)誤差小于epsabs或相對(duì)誤差小于epsrel。
請(qǐng)注意,這是一個(gè)“或”約束,而不是與約束。要計(jì)算指定的絕對(duì)誤差,請(qǐng)將epsrel設(shè)置為零。要計(jì)算指定的相對(duì)誤差,請(qǐng)將epsabs設(shè)置為零。如果誤差范圍太嚴(yán)格,例程將無(wú)法收斂,但始終會(huì)返回到該階段為止獲得的最佳近似值。
?? QUADPACK中的算法使用基于以下字母的命名約定:
| Q - 積分函數(shù) N - 非自適應(yīng)積分器 A - 自適應(yīng)積分器 G - 一般被積函數(shù)(用戶定義) W - 被積函數(shù)的權(quán)重函數(shù) S - 更易積分的奇異點(diǎn) P - 可提供特殊難點(diǎn) I - 無(wú)窮大的積分范圍 O - 周期變動(dòng)的權(quán)重函數(shù),cos或sin F - 傅里葉積分 C - 柯西主值 |
算法建立在求積規(guī)則對(duì)、高階規(guī)則對(duì)和低階規(guī)則對(duì)的基礎(chǔ)上。高階規(guī)則用于計(jì)算小范圍內(nèi)積分的最佳近似值。高階規(guī)則和低階規(guī)則的結(jié)果之差給出了近似誤差的估計(jì)。
17.1.1 不帶權(quán)重函數(shù)的被積函數(shù)
一般函數(shù)(沒有權(quán)重函數(shù))的算法是基于高斯-克朗羅德規(guī)則。
高斯-克朗羅德規(guī)則以m階的經(jīng)典高斯求積規(guī)則開始。該規(guī)則在每個(gè)橫坐標(biāo)之間添加額外的點(diǎn),從而得到更高階的2m+1階克朗羅德規(guī)則??死柿_德規(guī)則是有效的,因?yàn)樗赜昧藖碜愿咚挂?guī)則的現(xiàn)有函數(shù)計(jì)算。
用高階克朗羅德規(guī)則作為積分的最佳逼近,用兩規(guī)則之差作為逼近誤差的估計(jì)。
17.1.2 帶權(quán)重函數(shù)的被積函數(shù)
對(duì)于具有權(quán)重函數(shù)的被積函數(shù),該算法使用了克倫肖-柯蒂斯求積規(guī)則。
克倫肖-柯蒂斯規(guī)則從被積函數(shù)的n階切比雪夫多項(xiàng)式近似開始。這個(gè)多項(xiàng)式可以精確地積分,從而逼近原函數(shù)的積分。切比雪夫展開式可以擴(kuò)展到更高階,以改進(jìn)近似并提供誤差的估計(jì)。
17.1.3 具有奇異權(quán)函數(shù)的被積函數(shù)
被積函數(shù)中奇異點(diǎn)(或其他行為)的存在會(huì)導(dǎo)致切比雪夫近似的緩慢收斂。在QUADPACK中使用的改進(jìn)的克倫肖-柯蒂斯規(guī)則分離出幾個(gè)常見的導(dǎo)致緩慢收斂的權(quán)函數(shù)。
利用切比雪夫多項(xiàng)式對(duì)這些權(quán)重函數(shù)進(jìn)行分析積分,從而預(yù)先計(jì)算修正的切比雪夫矩。把矩和切比雪夫近似結(jié)合起來就得到了想要的積分。對(duì)函數(shù)的奇異部分使用解析積分可以精確地對(duì)消,并極大地改善了積分的整體收斂性。
17.2 QNG非自適應(yīng)高斯-克朗羅德積分
QNG算法是一種非自適應(yīng)的方法,它使用固定的高斯-克朗羅德-帕特森橫坐標(biāo)來對(duì)被積函數(shù)進(jìn)行采樣,最大采樣點(diǎn)為87個(gè)。為平滑函數(shù)的快速積分提供了支持。
int gsl_integration_qng(constgsl_function* f, double a, double b, double epsabs,
double epsrel, double * result, double * abserr, size_t * neval)
本函數(shù)依次應(yīng)用高斯-克朗羅德10個(gè)、21個(gè)、43個(gè)和87個(gè)點(diǎn)的積分規(guī)則,,直到在所需的絕對(duì)和相對(duì)誤差限制(epsabs和epsrel)內(nèi)取得,f 在(a,b)范圍內(nèi)的積分估計(jì)值。本函數(shù)返回最終的近似值result,絕對(duì)誤差的估計(jì)數(shù)abserr和使用的函數(shù)計(jì)算次數(shù)neval。高斯-克朗羅德規(guī)則的設(shè)計(jì)方式是,每個(gè)規(guī)則使用其前一個(gè)規(guī)則的所有結(jié)果,以最小化函數(shù)計(jì)算的總數(shù)。
17.3 QAG 自適應(yīng)積分
??? QAG算法是一個(gè)簡(jiǎn)單的自適應(yīng)積分過程。將積分區(qū)域劃分為子區(qū)間,每次迭代對(duì)估計(jì)誤差最大的子區(qū)間進(jìn)行二等分。當(dāng)子區(qū)間集中于被積函數(shù)的局部困難時(shí),這就迅速地減少了整體誤差。這些子區(qū)間由以下結(jié)構(gòu)來管理,
gsl_integration_workspace
??? 本工作區(qū)處理子區(qū)間范圍、結(jié)果和錯(cuò)誤估計(jì)的內(nèi)存。
gsl_integration_workspace * gsl_integration_workspace_alloc(size_t n)
??? 本函數(shù)分配了一個(gè)工作空間,可以容納n個(gè)雙精度區(qū)間,以及它們的積分結(jié)果和誤差估計(jì)。當(dāng)所有必要的重新初始化由集成函數(shù)自動(dòng)執(zhí)行時(shí),一個(gè)工作空間可以被多次使用。
void gsl_integration_workspace_free(gsl_integration_workspace * w)
本函數(shù)釋放工作空間w所使用的內(nèi)存。
int gsl_integration_qag(const gsl_function * f, double a, double b, double epsabs,
double epsrel, size_t limit, int key, gsl_integration_workspace * workspace,
double * result, double * abserr)
本函數(shù)根據(jù)所要求的相對(duì)和絕對(duì)誤差限制, epsabs和epsrel,采用自適應(yīng)積分規(guī)則計(jì)算,f在(a,b)上的積分的估計(jì)值。該函數(shù)返回最終的近似值,result,和絕對(duì)誤差的估計(jì)數(shù),abserr。積分規(guī)則由key值決定,key值應(yīng)該從以下符號(hào)名稱中選擇,
?GSL_INTEG_GAUSS15(key = 1)
? GSL_INTEG_GAUSS21(key = 2)
? GSL_INTEG_GAUSS31(key = 3)
? GSL_INTEG_GAUSS41(key = 4)
? GSL_INTEG_GAUSS51(key = 5)
? GSL_INTEG_GAUSS61(key = 6)
??? 對(duì)應(yīng)于15個(gè)、21個(gè)、31個(gè)、41個(gè)、51個(gè)和61個(gè)點(diǎn)的高斯-克朗羅德規(guī)則。高階規(guī)則為光滑函數(shù)提供了更好的準(zhǔn)確性,而低階規(guī)則在函數(shù)包含局部困難(如不連續(xù))時(shí)節(jié)省了時(shí)間。
??? 在每個(gè)迭代中,自適應(yīng)積分策略以最大的誤差估計(jì)將區(qū)間一分為二。子區(qū)間及其結(jié)果存儲(chǔ)在workspace提供的內(nèi)存中。子區(qū)間的最大數(shù)量由limit給出,它可能不超過工作區(qū)的分配大小。
總結(jié)
- 上一篇: 树莓派Pico直流电机接口技术及PWM电
- 下一篇: 0x00007FF7C49A4C42 处