您的位置:首页 > 其它

埃尔米特(Hermite)插值

2018-11-29 20:20 113 查看

实验内容:
某人从甲地开车去乙地,每隔一段时间对行车距离和速率进行一次采样,得到在 n+1 个采样时刻点 ti 的里程 si 和速率 vi(i=0, 1, ..., n)。要求编程构造埃尔米特插值多项式 H2n+1(t),满足 H2n+1(ti)=si,H'2n+1(ti)=vi,对所有i=0, 1, ..., n成立,并据此计算m个给定时刻的里程和速率。
函数接口定义:
void Hermite_Interpolation( int N, double t[], double s[], double v[], int m, double ht[], double hs[], double hv[] );
其中N为采样点个数(注意这个N不是公式中的最大下标n,而是等于n+1),采样时刻点ti、里程si、速率vi分别通过t、s、v传入;m是需要估算的给定时刻的个数,ht传入给定的时刻点,相应计算出的里程和速率应分别存储在hs和hv中。

主要采用分段三次样条插值法进行函数拟合

 

 

实验代码:

 

[code]#include <stdio.h>
#include <stdlib.h>

#define MAXN 5
#define MAXM 10

int Find_index(double x,double t[],int n)
{
int k,index;
for(k=0;k<n-1;k++)
{
if(x>=t[k]&&x<t[k+1])
{
index=k;
return index;
}
}
}

void Hermite_Interpolation( int N, double t[], double s[], double v[], int m, double ht[], double hs[], double hv[] )
{
int k,i,n;
n=(N+1)/2;
for(i=0;i<m;i++)
{
if(ht[i]==t[n-1])
{
hs[i]=s[n-1];
hv[i]=v[n-1];
}
else{
k=Find_index(ht[i],t,n);
hs[i]=(1+2*(ht[i]-t[k])/(t[k+1]-t[k]))*((ht[i]-t[k+1])/(t[k]-t[k+1]))*((ht[i]-t[k+1])/(t[k]-t[k+1]))*s[k]
+(1+2*(ht[i]-t[k+1])/(t[k]-t[k+1]))*((ht[i]-t[k])/(t[k]-t[k+1]))*((ht[i]-t[k])/(t[k]-t[k+1]))*s[k+1]
+(ht[i]-t[k])*((ht[i]-t[k+1])/(t[k]-t[k+1]))*((ht[i]-t[k+1])/(t[k]-t[k+1]))*v[k]
+(ht[i]-t[k+1])*((ht[i]-t[k])/(t[k]-t[k+1]))*((ht[i]-t[k])/(t[k]-t[k+1]))*v[k+1];
hv[i]=(2*((ht[i]-t[k+1])/(t[k]-t[k+1]))*(1+2*(ht[i]-t[k])/(t[k+1]-t[k]))*s[k])/(t[k]-t[k+1])
+(2/(t[k+1]-t[k]))*((ht[i]-t[k+1])/(t[k]-t[k+1]))*((ht[i]-t[k+1])/(t[k]-t[k+1]))*s[k]
+((ht[i]-t[k+1])/(t[k]-t[k+1]))*((ht[i]-t[k+1])/(t[k]-t[k+1]))*v[k]
+(2*(ht[i]-t[k])*((ht[i]-t[k+1])/(t[k]-t[k+1]))*v[k])/(t[k]-t[k+1])
+((ht[i]-t[k])/(t[k+1]-t[k]))*((ht[i]-t[k])/(t[k+1]-t[k]))*v[k+1]
+(2*(ht[i]-t[k+1])*((ht[i]-t[k])/(t[k+1]-t[k]))*v[k+1])/(t[k+1]-t[k])
+(2*((ht[i]-t[k])/(t[k+1]-t[k]))*(1+2*(ht[i]-t[k+1])/(t[k]-t[k+1]))*s[k+1])/(t[k+1]-t[k])
+(2/(t[k]-t[k+1]))*((ht[i]-t[k])/(t[k+1]-t[k]))*((ht[i]-t[k])/(t[k+1]-t[k]))*s[k+1];
}
}
}
int main()
{
int N, m;
double t[MAXN], s[MAXN], v[MAXN]; /* 用于构造 的数据 */
double ht[MAXM], hs[MAXM], hv[MAXM]; /* 用 估算的数据 */
int i;
while ( scanf("%d", &N) != EOF ) {
for ( i=0; i<N; i++ )
scanf("%lf", &t[i]);
for ( i=0; i<N; i++ )
scanf("%lf", &s[i]);
for ( i=0; i<N; i++ )
scanf("%lf", &v[i]);
scanf("%d", &m);
for ( i=0; i<m; i++ )
scanf("%lf", &ht[i]);
Hermite_Interpolation( N, t, s, v, m, ht, hs, hv );
for ( i=0; i<m; i++ )
printf("%.4lf ", hs[i]);
printf("\n");
for ( i=0; i<m; i++ )
printf("%.4lf ", hv[i]);
printf("\n\n");
}

return 0;
}

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: