资源简介

三次样条插值(简称Spline插值)是通过一系列形值点的一条光滑曲线,数学上通过求解三弯矩方程组得出曲线函数组的过程。本资源提供了三次样条插值的C语言工程实现程序,供大家学习参考。

资源截图

代码片段和文件信息

/*   三次样条插值计算算法   */   
  #include   “math.h“   
  #include   “stdio.h“   
  #include   “stdlib.h“   
  
  /*   
  N:已知节点数N+1   
  R:欲求插值点数R+1   
  x,y为给定函数f(x)的节点值{x(i)}   (x(i)  P0=f(x0)的二阶导数;Pn=f(xn)的二阶导数   
  u:存插值点{u(i)}       0<=i<=R   
  求得的结果s(ui)放入s[R+1]       0<=i<=R   
  返回0表示成功,1表示失败   
  */
  
  int   SPL(int   Nint   Rdouble   x[]double   y[]double   P0double   Pndouble   u[]double   s[])   
  {   
  /*声明局部变量*/   
  double   *h;   /*存放步长:{hi}       0<=i<=N-1     */   
  double   *a;   /*存放系数矩阵{ai}       1<=i<=N   ;   分量0没有利用     */   
  double   *c;   /*先存放系数矩阵{ci}     后存放{Bi}     0<=i<=N-1     */   
  double   *g;   /*先存放方程组右端项{gi}     后存放求解中间结果{yi}     0<=i<=N     */   
  double   *af;   /*存放系数矩阵{a(f)i}       1<=i<=N   ;     */   
  double   *ba;   /*存放中间结果   0<=i<=N-1*/   
  double   *m;   /*存放方程组的解{m(i)}       0<=i<=N   ;     */   
    
  int   ik;   
  double   p1p2p3p4;       
    
  /*分配空间*/   
  if(!(h=(double*)malloc(N*sizeof(double))))   exit(1);   
  if(!(a=(double*)malloc((N+1)*sizeof(double))))   exit(1);   
  if(!(c=(double*)malloc(N*sizeof(double))))   exit(1);   
  if(!(g=(double*)malloc((N+1)*sizeof(double))))   exit(1);   
  if(!(af=(double*)malloc((N+1)*sizeof(double))))   exit(1);   
  if(!(ba=(double*)malloc((N)*sizeof(double))))   exit(1);   
  if(!(m=(double*)malloc((N+1)*sizeof(double))))   exit(1);   
    
  /*第一步:计算方程组的系数*/   
  for(k=0;k  h[k]=x[k+1]-x[k];   
  for(k=1;k  a[k]=h[k]/(h[k]+h[k-1]);   
  for(k=1;k  c[k]=1-a[k];   
  for(k=1;k  g[k]=3*(c[k]*(y[k+1]-y[k])/h[k]+a[k]*(y[k]-y[k-1])/h[k-1]);   
  c[0]=a[N]=1;   
  g[0]=3*(y[1]-y[0])/h[0]-P0*h[0]/2;   
  g[N]=3*(y[N]-y[N-1])/h[N-1]+Pn*h[N-1]/2;   
    
  /*第二步:用追赶法解方程组求{m(i)}     */   
  ba[0]=c[0]/2;   
  g[0]=g[0]/2;   
  for(i=1;i  {   
  af[i]=2-a[i]*ba[i-1];   
  g[i]=(g[i]-a[i]*g[i-1])/af[i];   
  ba[i]=c[i]/af[i];   
  }   
  af[N]=2-a[N]*ba[N-1];   
  g[N]=(g[N]-a[N]*g[N-1])/af[N];   
    
  m[N]=g[N];                   /*P110   公式:6.32*/   
  for(i=N-1;i>=0;i--)   
  m[i]=g[i]-ba[i]*m[i+1];   
    
  /*第三步:求值*/   
  for(i=0;i<=R;i++)   
  {   
  /*判断u(i)属于哪一个子区间,即确定k   */   
  if(u[i]x[N])       
  {   
  /*释放空间*/   
  free(h);   
  free(a);   
  free(c);   
  free(g);   
  free(af);   
  free(ba);   
  free(m);   
  return   1;   
  }   
  k=0;   
  while(u[i]>x[k+1])   
  k++;   
    
    
  p1=(h[k]+2*(u[i]-x[k])*pow((u[i]-x[k+1])2)*y[k])/pow(h[k]3);   
  p2=(h[k]-2*(u[i]-x[k+1])*pow((u[i]-x[k])2)*y[k+1])/pow(h[k]3);   
  p3=(u[i]-x[k])*pow((u[i]-x[k+1])2)*m[k]/pow(h[k]2);   
  p4=(u[i]-x[k+1])*pow((u[i]-x[k])2)*m[k+1]/pow(h[k]2);   
  s[i]=p1+p2+p3+p4;   
  }   
    
  /*释放空间*/   
  free(h);   
  free(a);   
  free(c);   
  free(g);   
  free(af);   
  free(ba);   
  free(m);   
    
  return   0;

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       4792  2017-10-17 23:31  spline\spline.c

     目录          0  2017-10-17 23:32  spline

----------- ---------  ---------- -----  ----

                 4792                    2


评论

共有 条评论