埃尔米特(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; }
相关文章推荐
- glsl smoothstep 属于埃尔米特(Hermite)插值
- 埃尔米特(Hermite)插值及其MATLAB程序
- 埃尔米特(Hermite)插值
- 样条之埃尔米特(Hermite)插值函数
- 用Hermite插值方法估计积分值
- 用Hermite插值方法估计积分值
- 学成绩不佳的数学大师─埃尔米特 (Hermite)
- 学成绩不佳的数学大师─埃尔米特 (Hermite)
- 学成绩不佳的数学大师─埃尔米特 (Hermite)
- 从Hermite插值公式推导Smoothstep插值公式
- 关键帧系统的实现(Hermite位置插值+Squad四元数空间的朝向插值) .
- Hermite插值是牛顿插值的极限情形
- 样条之埃尔米特(Hermite)
- Hermite插值是牛顿插值的极限情形
- 数值分析——两点三次Hermite插值
- 样条之埃尔米特(Hermite)
- Hermite (埃尔米特)曲线
- Matlab Hermite(2n+1)插值
- 样条之埃尔米特(Hermite)插值函数
- 关键帧系统的实现(Hermite位置插值+Squad四元数空间的朝向插值)