高手请进!!!散分散分哈
kuzip 2004-06-29 08:20:58 分段lagrange三点插值
一:功能
给出n个节点X1,X2....Xn及相应的函数值Yi=f(Xi),i=1,2...n,
对p个插值点 Xj(j=1,2...p),选取最靠近插值点相邻的三个点,用lagrange三点插值公式对一元函数进行成组插值。节点等距与不等距均可。
二:算法简介
设给出n个节点,其中X1<X2<...<Xn,相应的函数值Y1,Y2...Yn,用lagrange三点插值公式,有:
L(x)=Σ(Π(X-Xj)/(Xk-Xj))Yk 注释:求和公式k由I到I+2
求积公式j由I到I+2,j≠k
其中如果X<(Xj+Xj+1)/2 那么I=j-1;
X>(Xn-2+Xn-1)/2 那么I=n-2
三:程序使用说明
1)输入参数
n为节点个数
p为插值节点个数
X(n),Y(n),一维数组,分别存放相应的节点和函数值
C(p),一维数组,存放插值点
2)输出参数
n,p分别为节点个数和插值个数
Xi,Yi节点与节点函数值
Xj,Yj,j=1,2...p,插值点与插值
这是我用C做的,但是输入个数不够,还有没有输出,请高手看看,帮忙改一下:
main()
{
int n,p,i,j,,k,t,m,s,x[100],y[100],c[100],d[100];
printf("INPUT DATA N:");
scanf("%d",&n);
printf("INPUT DATA P:");
scanf("%d",&p);
for(i=0;i<n;i++)scanf("%d",x[i]);
for(i=0;i<n;i++)scanf("%d",y[i]);
for(i=0;i<p;i++)scanf("%d",c[i]);
for(i=0;i<p;i++)scanf("%d",d[i]);
for(t=0;t<p;t++)
{
i=0;
a: if(c[t]<(x[i+1]+x[i+2])/2) m=i+2;
if(c[t]>=(x[n-2]+x[n-1])/2) i=n-2;
i++;
goto a;
d[t]=0;
for(j=0;j<m;j++)
{
s=1;
for(k=0;k<m;k++)if(j-k!=0) s=s*(c[t]-x[k])/x[j]-x[k];
d[t]=d[t]+s*y[j];
}
}
}