数值作业:Hermite插值法之C语言实现代码

这个问题个人也看的不太懂,参考百科上的计算说明,把它转化成相应成代码即可.埃尔米特插值是另一类插值问题,这类插值在给定的节点处,不但要求插值多项式的函数值与被插函数的函数值相同。同时还要求在节点处,插值多项式的一阶直至指定阶的导数值,也与被插函数的相应阶导数值相等,这样的插值称为埃尔米特插值,或称为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点多了....

  • 10
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值