三次样条插值

一剑行天下 posted @ 2008年11月01日 19:05 in 数值分析 , 3199 阅读

// 数值分析--三次样条插值公式

#include"iostream.h"
#include"fstream.h"

#define N 100
float X[N],Y[N],M[N],a,b;
double f(int i,int j)
{
  double sum1=0;
  if(j-i==1) return (Y[j]-Y[i])/(X[j]-X[i]);
  else return (f(i+1,j)-f(i,j-1))/(X[j]-X[i]);
}


void main()
{

  ifstream istrm("E:\\data.txt");//这里是文件的输入,请相应改成普通键盘输入
  int n=3;
  for(int i=0;i<=n;i++)
   istrm>>X[i]>>Y[i];
  istrm>>a>>b;
  float h[N],u[N],q[N],d[N];
  for(i=0;i<n;i++)
   h[i]=X[i+1]-X[i];
  q[0]=1;q[n]=0;
  for(i=1;i<n;i++)
      q[i]=h[i]/(h[i-1]+h[i]);
  for(i=0;i<=n;i++)
   u[i]=1-q[i];
  d[0]=(6*(f(0,1)-a))/h[0];
  d[n]=(6*(b-f(n-1,n)))/h[n-1];
  for(i=1;i<n;i++)
     d[i]=6*f(i-1,i+1);
  float m[N];
  for(i=0;i<=n;i++) m[i]=2;
  for(i=1;i<=n;i++)
  {
    m[i]=m[i]-(u[i]/m[i-1])*q[i-1];
 d[i]=d[i]-(u[i]/m[i-1])*d[i-1];
  }
  M[n]=d[n]/m[n];
  cout<<M[n]<<endl;
  for(i=n-1;i>=0;i--)
  {
    M[i]=(d[i]-q[i]*M[i+1])/m[i];                                                                                                     
 cout<<M[i]<<endl;
  }
}

Avatar_small
omCSTW <a href="htt 说:
2008年12月14日 10:14

omCSTW <a href="http://gcklctwujdkx.com/">gcklctwujdkx</a>, [url=http://zdtksucjfwbe.com/]zdtksucjfwbe[/url], [link=http://kfuadwocnsiu.com/]kfuadwocnsiu[/link], http://xqzrqwcmtvup.com/

Avatar_small
hexie 说:
2011年2月18日 03:04

数值分析中正好用得着!呵呵!thanks!~


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter