九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
三次樣條插值

C++數(shù)值算法(第二版)

3.3 三次樣條插值

        給定一個(gè)列表顯示的函數(shù)

yi=y(xi),i=0,1,2,...,N-1。特別注意在xjxj+1之間的一個(gè)特殊的區(qū)間。該區(qū)間的線性插值公式為


        (3.3.1)式和(3.3.2)式是拉格朗日插值公式(3.1.1)的特殊情況。

        因?yàn)樗?span style="font-family:'Times New Roman'">(分段)線性的,(3.3.1)式在每一區(qū)間內(nèi)的二階導(dǎo)數(shù)為零,在橫坐標(biāo)為xj處的二階導(dǎo)數(shù)不定義或無限。三次樣條插值的目的就是要得到一個(gè)內(nèi)插公式,不論在區(qū)間內(nèi)亦或其邊界上,其一階導(dǎo)數(shù)平滑,二階導(dǎo)數(shù)連續(xù)。

        做一個(gè)與事實(shí)相反的個(gè)假設(shè),除yi的列表值之外,我們還有函數(shù)二階導(dǎo)數(shù)y"的列表值,即一系列的yi"值,則在每個(gè)區(qū)間內(nèi),可以在(3.3.1)式的右邊加上一個(gè)三次多項(xiàng)式,其二階導(dǎo)數(shù)從左邊的yj"值線性變化到右邊的yj+1"值,這么做便得到了所需的連續(xù)二階導(dǎo)數(shù)。如果還將三次多項(xiàng)式構(gòu)造在xjxj+1處為零,則不會(huì)破壞在終點(diǎn)xjxj+1處與列表函數(shù)值yjyj+1的一致性。

          進(jìn)行一些輔助計(jì)算便可知,僅有一種辦法才能進(jìn)行這種構(gòu)造,即用

        注意,(3.3.3)式和(3.3.4)式對(duì)自變量x的依賴,是完全通過AB對(duì)x的線性依賴,以及CD(通過AB)對(duì)x的三次依賴而實(shí)現(xiàn)。

可以很容易地驗(yàn)證,y"事實(shí)上是該插值多項(xiàng)式的二階導(dǎo)數(shù)。使用ABCD的定義對(duì)x(3.3.3)式的導(dǎo)數(shù),計(jì)算dA/dx dB/dx dC/dx dD/dx,結(jié)果為一階導(dǎo)數(shù)


         因?yàn)?span style="font-family:'Times New Roman'">x=xjA=1,x=x(i+1)時(shí)A=0,而B正相反,則(3.3.6)式表明y"恰為列表函數(shù)的二階導(dǎo)數(shù)。而且該二階導(dǎo)數(shù)在兩個(gè)區(qū)間(xj-1, xj)(xj, xj+1)上是連續(xù)的。

現(xiàn)在唯一的問題是,假設(shè)yj"是已知的。而實(shí)際上并不知道。然而,仍不要求從(3.3.5)式算出的一階導(dǎo)數(shù)在兩個(gè)區(qū)間的邊界處是連續(xù)的。三次樣條的關(guān)鍵思想就在于要求這種連續(xù)性,并用它求得等式的二階導(dǎo)數(shù)yi"。

設(shè)(3.3.5)式在區(qū)間(xj-1, xj)上對(duì)x=xj求得的值,等于同一等式在區(qū)間(xj,x[j+1])上對(duì)x=xj求得的值,便可得到所求方程,是新整理得到(對(duì)j=1,......,N-2)

        這意味著有N-2個(gè)線性方程,但卻有N個(gè)未知數(shù)yi",i=0,......,N-1。因此,存在一個(gè)具有兩個(gè)參數(shù)的可能解集。為求得唯一解,需要給出兩個(gè)進(jìn)一步的條件,一般取x0x[n-1]處的邊界條件。最常見的做法有:

        [1]設(shè)y[0"]y[n-1]"之一或兩個(gè)都為零,得到所謂的自然三次樣條函數(shù),其一個(gè)或兩個(gè)邊界的二次導(dǎo)數(shù)為零。

        [2]設(shè)y[n]"y[n-1]"(3.3.5)式計(jì)算得到的值,使得該插值函數(shù)的一階導(dǎo)數(shù)一個(gè)或兩個(gè)邊界處有特定的值。

        三次樣條插值特別實(shí)用的原因之一在于,有兩個(gè)附加邊界條件的方程組(3.3.7),它不僅是線性的,而且是三對(duì)角的。每個(gè)yj"僅與其最鄰近的j+-1的值有關(guān)。因此,方程可以用三對(duì)角算法(參見2.4節(jié))O(N)次運(yùn)算內(nèi)求解。該算法非常簡(jiǎn)明,很容易正確地構(gòu)造出樣條計(jì)算的程序。但是這使得程序不像(3.3.7)式的實(shí)現(xiàn)那樣完全透明,所以建議讀者將下面程序與 tridag程序(2.4節(jié))比較一上,仔細(xì)地研究。

  1. #include "nr.h"  
  2.   
  3. void NR::spline(Vec_I_DP &x, Vec_I_DP &y, const DP yp1, const DP ypn,  
  4.     Vec_O_DP &y2)  
  5. {  
  6.     int i,k;  
  7.     DP p,qn,sig,un;  
  8.   
  9.     int n=y2.size();  
  10.     Vec_DP u(n-1);  
  11.     if (yp1 > 0.99e30)  
  12.         y2[0]=u[0]=0.0;  
  13.     else {  
  14.         y2[0] = -0.5;  
  15.         u[0]=(3.0/(x[1]-x[0]))*((y[1]-y[0])/(x[1]-x[0])-yp1);  
  16.     }  
  17.     for (i=1;i<n-1;i++) {  
  18.         sig=(x[i]-x[i-1])/(x[i+1]-x[i-1]);  
  19.         p=sig*y2[i-1]+2.0;  
  20.         y2[i]=(sig-1.0)/p;  
  21.         u[i]=(y[i+1]-y[i])/(x[i+1]-x[i]) - (y[i]-y[i-1])/(x[i]-x[i-1]);  
  22.         u[i]=(6.0*u[i]/(x[i+1]-x[i-1])-sig*u[i-1])/p;  
  23.     }  
  24.     if (ypn > 0.99e30)  
  25.         qn=un=0.0;  
  26.     else {  
  27.         qn=0.5;  
  28.         un=(3.0/(x[n-1]-x[n-2]))*(ypn-(y[n-1]-y[n-2])/(x[n-1]-x[n-2]));  
  29.     }  
  30.     y2[n-1]=(un-qn*u[n-2])/(qn*y2[n-2]+1.0);  
  31.     for (k=n-2;k>=0;k--)  
  32.         y2[k]=y2[k]*y2[k+1]+u[k];  
  33. }  

        重要的是要記住,在處理數(shù)組xiyi構(gòu)成的列表函數(shù)時(shí),程序spline僅能調(diào)用一次。一旦調(diào)用過后,對(duì)任意的x,插值函數(shù)的值通過調(diào)用要多少次就調(diào)多少次)一個(gè)獨(dú)立的程序splint(spline interpolation的字頭縮寫)來得到。

  1. #include "nr.h"  
  2.   
  3. void NR::splint(Vec_I_DP &xa, Vec_I_DP &ya, Vec_I_DP &y2a, const DP x, DP &y)  
  4. {  
  5.     int k;  
  6.     DP h,b,a;  
  7.   
  8.     int n=xa.size();  
  9.     int klo=0;  
  10.     int khi=n-1;  
  11.     while (khi-klo > 1) {  
  12.         k=(khi+klo) >> 1;  
  13.         if (xa[k] > x) khi=k;  
  14.         else klo=k;  
  15.     }  
  16.     h=xa[khi]-xa[klo];  
  17.     if (h == 0.0) nrerror("Bad xa input to routine splint");  
  18.     a=(xa[khi]-x)/h;  
  19.     b=(x-xa[klo])/h;  
  20.     y=a*ya[klo]+b*ya[khi]+((a*a*a-a)*y2a[klo]  
  21.         +(b*b*b-b)*y2a[khi])*(h*h)/6.0;  
  22. }  

Qt實(shí)現(xiàn)的Demo:


本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
機(jī)械臂軌跡規(guī)劃
MATLAB回歸、插值、逼近、擬合總結(jié)
插值與擬合 (一) : 拉格朗日多項(xiàng)式插值 、Newton插值 、分段線性插值、...
插值與擬合matlab實(shí)現(xiàn)
Matlab數(shù)據(jù)插值
17LP對(duì)偶理論
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服