埃尔米特(Hermite)插值

实验内容:
某人从甲地开车去乙地,每隔一段时间对行车距离和速率进行一次采样,得到在 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中。


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

实验代码:


#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;
}

 


猜你喜欢

转载自blog.csdn.net/qq_41989372/article/details/84639146
今日推荐