要清楚點Lagrange插值基函數(shù)與插值節(jié)點關(guān),明白點問題解決,ΣyiLi(x)=L(x),我令y=1,則ΣLi(x)=L(x),由余項定理知余項零,則ΣLi(x)=L(x)=Y=1,更般我證明Σxi^k*Li(x)=x^k
創(chuàng)新互聯(lián)公司歡迎聯(lián)系:18982081108,為您提供成都網(wǎng)站建設(shè)網(wǎng)頁設(shè)計及定制高端網(wǎng)站建設(shè)服務,創(chuàng)新互聯(lián)公司網(wǎng)頁制作領(lǐng)域十多年,包括會所設(shè)計等多個行業(yè)擁有多年的網(wǎng)站推廣經(jīng)驗,選擇創(chuàng)新互聯(lián)公司,為網(wǎng)站保駕護航!
圖6-3 線性插值示意圖
已知x-y平面上的三點按逆時針順序,記為i,j,m,其坐標為(xi,yi),(xj,yj)和(xm,ym)。這三點組成三角形單元Δijm,其面積用Δ表示。三角形中的點p(x,y)與i,j,m三點的連線,將Δijm分割成三個小三角形Δpjm,Δpmi,Δpij,其面積分別為Δi,Δj,Δm(圖6-3)。
地球物理數(shù)據(jù)處理基礎(chǔ)
其中:Li,Lj,Lm是面積的比值,是無量綱數(shù),稱為二維自然坐標,或面積坐標。
設(shè)u是三角單元Δijm中的線性函數(shù),可表示為
地球物理數(shù)據(jù)處理基礎(chǔ)
式中:a,b,c是常數(shù),將三頂點的坐標(xi,yi),(xj,yj),(xm,ym)和函數(shù)值ui,uj,um分別代入式(6-56)中,解出a,b,c:
地球物理數(shù)據(jù)處理基礎(chǔ)
其中:
地球物理數(shù)據(jù)處理基礎(chǔ)
將a,b,c代入式(6-56),整理后,得
地球物理數(shù)據(jù)處理基礎(chǔ)
其中:
地球物理數(shù)據(jù)處理基礎(chǔ)
寫成矩陣形式
地球物理數(shù)據(jù)處理基礎(chǔ)
稱為二維線性插值基函數(shù)。與(6-55)式對比,基函數(shù)就等于面積坐標:
地球物理數(shù)據(jù)處理基礎(chǔ)
# include "graphics.h"
# include "math.h"
# define N 100
void init_graphic( )
main()
{
int i;
float x0,y0,x,y;
float x[100],y[100];
init_graphic();
for(i=0;i100;i++)
{
x[i]=-20+(40/100)*i;
y[i]=x[i]*x[i];
}
x0=x[0]+320;
y0=440-y[0];
for(i=1;i100;i++)
{
x1=x[i]+320;
y1=440-y[i];
line(x0,y0,x1,y1);
x0=x1;
y0=y1;
}
}
void init_graphic( )
{
int graphicdriver,graphicmode;
graphicdriver=DETECT;
graphicmode=1;
initgraph(graphicdriver,graphicmode,"E:\\turboc2\\")/*該路徑是你TurboC的路徑*/
}
/*********************下面程序是C語言程序(標準C)******************/
/* 計算給定M0,Mn值的三次樣條插值多項式 */
/*給定離散點(1.1,0.4),(1.2,0.8),(1.4,1.65),(1.5,1.8),M0=Mn=0,*/
/*用M關(guān)系式構(gòu)造三次樣條插值多項式S(x),計算S(1.25)。 */
/*************************************************************/
#include stdio.h
#define Max_N 20
main()
{int i,k,n;
double h[Max_N+1],b[Max_N+1],c[Max_N+1],d[Max_N+1],M[Max_N+1];
double u[Max_N+1],v[Max_N+1],yy[Max_N+1],x[Max_N+1],y[Max_N+1];
double xx,p,q,S;
printf("\nPlease input n value:"); /*輸入插值點數(shù)n*/
do
{ scanf("%d",n);
if(nMax_N)
printf("\nplease re-input n value:");
}
while(nMax_N||n=0);
printf("Input x[i],i=0,...%d:\n",n-1);
for(i=0;in;i++) scanf("%lf",x[i]);
printf("Input y[i],i=0,...%d:\n",n-1);
for(i=0;in;i++) scanf("%lf",y[i]);
printf("\nInput the M0,Mn value:");
scanf("%lf%lf",M[0],M[n]);
printf("\nInput the x value:"); /*輸入計算三次樣條插值函數(shù)的x值*/
scanf("%lf",xx);
if((xxx[n-1])||(xxx[0]))
{printf("Please input a number between %f and %f.\n",x[0],x[n-1]);
return;
}
/*計算M關(guān)系式中各參數(shù)的值*/
h[0]=x[1]-x[0];
for(i=1;in;i++)
{h[i]=x[i+1]-x[i];
b[i]=h[i]/(h[i]+h[i-1]);
c[i]=1-b[i];
d[i]=6*((y[i+1]-y[i])/h[i]-(y[i]-y[i-1])/h[i-1])/(h[i]+h[i-1]);
}
/*用追趕法計算Mi,i=1,...,n-1*/
d[1]-=c[1]*M[0];
d[n-1]-=b[n-1]*M[n];
b[n-1]=0; c[1]=0; v[0]=0;
for(i=1;in;i++)
{u[i]=2-c[i]*v[i-1];
v[i]=b[i]/u[i];
yy[i]=(d[i]-c[i]*y[i-1])/u[i];
}
for(i=1;in;i++)
{M[n-i]=yy[n-i]-v[n-i]*M[n-i+1];
}
/*計算三次樣條插值函數(shù)在x處的值*/
k=0;
while(xx=x[k]) k++;
k=k-1;
p=x[k+1]-xx;
q=xx-x[k];
S=(p*p*p*M[k]+q*q*q*M[k+1])/(6*h[k])+(p*y[k]+q*y[k+1])/h[k]-h[k]*(p*M[k]+q*M[k+1])/6;
printf("S(%f)=%f\n",xx,S); /*輸出*/
getch();
}
/*----------------------------------- End of file ------------------------------------*/
/*程序輸入輸出:
Please input n value:4
Input x[i],i=0,...3:
1.1 1.2 1.4 1.5
Input y[i],i=0,...3:
0.4 0.8 1.65 1.8
Input the M0,Mn value: 0 0
Input the x value:1.25
S(1.250000)=1.033171
*/
用GDI繪圖吧,比較簡單。繪圖的思想是讓x以固定的值在區(qū)間內(nèi)持續(xù)增長,比如x=0.1,0.2,0.3.....,以計算出的y值來確定y坐標。用線連接所有的點就行了。MoveTo(),LineTo()函數(shù)你用得著,具體情況請自行查看MSDN。