这个问题个人也看的不太懂,参考百科上的计算说明,把它转化成相应成代码即可.埃尔米特插值是另一类插值问题,这类插值在给定的节点处,不但要求插值多项式的函数值与被插函数的函数值相同。同时还要求在节点处,插值多项式的一阶直至指定阶的导数值,也与被插函数的相应阶导数值相等,这样的插值称为埃尔米特插值,或称为Hermite插值。 Hermite插值在不同的节点,提出的差值条件个数可以不同,若在某节点xi,要求插值函数多项式的函数值,一阶导数值,直至m1-1阶导数值均与被插函数的函数值相同及相应的导数值相等。我们称xi为mi重插值点节,因此,Hermite插值应给出两组数,一组为插值点{xi}ni=0节点,另一组为相应的重数标号{mi}ni=0。
则称H(x) 为f(x) 关于节点{xi}ni=0及重数标号{mi}ni=0的Hermite插值多项式。[转自百科]多说无益,直接上代码:
/********************************************
> File Name: Hermite.c
> Author:chendiyang
> School:WUST_CST_1501班
> Myblog:www.chendsir.com
> Mail:1441353519@qq.com
> Created Time: 2017年04月21日 星期五 23时32分19秒
**************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define eps 1e-10 //计算的精确度
int N; //基点的个数
//函数Hermite()根据插值条件和自变量的值x,直接计算并返回Hermite插值多项式H(2n+1)在x点的值.
double hermite( double x, double xi[N], double yi[N], double dyi[N] )
{
int i,j;
double li,sum,y,gix[N],hix[N];
for(i=0;i<N;i++)
{
li=1.0; sum=0.0;
for(j=0;j<N;j++)
if( j != i )
{
if( fabs(xi[i]-xi[j]) < eps )//注意fabs()是取绝对值函数
{
printf(" 计算的精度已经小于能在处理范围内的精度了!\n");
printf(" 按任意建退出!\n");
getchar();
exit(1);
}
li=li*(x-xi[j])/(xi[i]-xi[j]); //这些根据书上的数学公式可以转化成相应的代码
sum=sum+1.0/(xi[i]-xi[j]);
}
li=li*li;
gix[i]=(1.0-2.0*(x-xi[i])*sum)*li;
hix[i]=(x-xi[i])*li;
}
y=0.0;
for(i=0;i<N;i++) y=y+yi[i]*gix[i]+dyi[i]*hix[i];
return y;
}
/* N = n+1 */
double hermite(double x,double xi[N],double yi[N],double dyi[N]);
int main()
{
int i,j;
char ifdoyn,ch;
double x,y,xi[N],yi[N],dyi[N]; //分别代表插值表的xi,f(xi),f'(xi)
printf("\n请输入你要插值的维数:");
scanf("%d",&N);
printf("\n请输入插值表xi的值:");
for(i=0;i<N;i++)
scanf("%lf",&xi[i]);
printf("\n请输入插值表f(xi)的值:");
for(i=0;i<N;i++)
scanf("%lf",&xi[i]);
printf("\n请输入插值表f'(xi)的值:");
for(i=0;i<N;i++)
scanf("%lf",&dyi[i]);
system("clear"); //清理屏幕(我的系统是Linux系统,这里是system("clear"),windows下面是system("cls");
printf("插值表已输入完毕!\n");
printf("请输入你的插值点自变量x:\n");
again:printf("input x ");
scanf("%lf",&x);
y=hermite( x, xi, yi, dyi );
printf(" x=%15.6e P(x)=%15.8e\n",x,y);
printf("input new x? ( y/n) ");
ch=getchar(); //用来清楚缓冲区
ifdoyn=getchar();
if( ifdoyn =='y' || ifdoyn =='Y' ) //利用goto语句看你是否继续进行插值
goto again;
}
运行结果如图:
原理啥的我都看不懂,也不知道做这些有啥意义,敲代码敲的烦死,尤其是debug的时候,花的时间是你写代码的时间的好几倍....最后,我想说,数值作业的图形界面有解决办法了,那就是新学一门matlab语言,这个是专门为它做数值科学计算的图形化语言,也不知道老师怎么想,重新学一门语言很快,几天可以搞定,但是把我写完了的代码转换成matlab语言和语法,是一个很繁琐的过程,而且matlab中的数组是从1开始的,这样我的循环中都要改...挺累了,该休息了,1点多了....