要清楚点Lagrange插值基函数与插值节点关,明白点问题解决,ΣyiLi(x)=L(x),我令y=1,则ΣLi(x)=L(x),由余项定理知余项零,则ΣLi(x)=L(x)=Y=1,更般我证明Σxi^k*Li(x)=x^k
创新互联公司欢迎联系:18982081108,为您提供成都网站建设网页设计及定制高端网站建设服务,创新互联公司网页制作领域十多年,包括会所设计等多个行业拥有多年的网站推广经验,选择创新互联公司,为网站保驾护航!
图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)。
地球物理数据处理基础
其中:Li,Lj,Lm是面积的比值,是无量纲数,称为二维自然坐标,或面积坐标。
设u是三角单元Δijm中的线性函数,可表示为
地球物理数据处理基础
式中:a,b,c是常数,将三顶点的坐标(xi,yi),(xj,yj),(xm,ym)和函数值ui,uj,um分别代入式(6-56)中,解出a,b,c:
地球物理数据处理基础
其中:
地球物理数据处理基础
将a,b,c代入式(6-56),整理后,得
地球物理数据处理基础
其中:
地球物理数据处理基础
写成矩阵形式
地球物理数据处理基础
称为二维线性插值基函数。与(6-55)式对比,基函数就等于面积坐标:
地球物理数据处理基础
# 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关系式构造三次样条插值多项式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:"); /*输入插值点数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:"); /*输入计算三次样条插值函数的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关系式中各参数的值*/
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];
}
/*计算三次样条插值函数在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以固定的值在区间内持续增长,比如x=0.1,0.2,0.3.....,以计算出的y值来确定y坐标。用线连接所有的点就行了。MoveTo(),LineTo()函数你用得着,具体情况请自行查看MSDN。