三次样条插值

#include "iostream.h"
void main()
{   
int i,n;
    float **a,x;
float three(float **a,int n,float x);
cout<<"请输入点的个数:";
cin>>n;
a=new float*[n];
for(i=0;i<n;i++)
  a=new float[2];
cout<<"请输入各个点的坐标:"<<endl;
for(i=0;i<n;i++)
  cin>>a[0]>>a[1];
cout<<"输入要求的自变量值:";
cin>>x;
cout<<"方程的解为:"<<three(a,n,x)<<endl;   
}
float three(float **a,int n,float x)
{
void catchwith(float **a,int n);
int i;
float **b,y=0;    [url=file://b/]file://b[/url]保存三对角阵
b=new float*[n-1];
for(i=0;i<n-1;i++)
  b=new float[5];
for(i=0;i<n-1;i++)   [url=file://初/]file://初[/url]始化三对角阵
{
  b[0]=1-(a[0]-a[0])/(a[0]-a[0]);
  b[1]=2;
  b[2]=1-b[0];
  b[3]=3*(b[0]*(a[1]-a[1])/(a[0]-a[0])+
          b[3]*(a[1]-a[1])/(a[0]-a[0]));
}
b[0][0]=2,b[0][1]=b[0][2],b[0][2]=0,b[n-2][2]=0;
b[0][3]=b[0][3]-(1-b[0][1])*(a[1][1]-a[0][1])/(a[1][0]-a[0][0]);
b[n-2][3]=b[n-2][3]-(1-b[n-2][0])*(a[n-1][1]-a[n-2][1])/(a[n-1][0]-a[n-2][0]);
catchwith(b,n-1);   [url=file://求/]file://求[/url]解三对角阵
for(i=0;x>a[0];i++);  [url=file://寻/]file://寻[/url]找x的位置
i--;
y+=((x-a[0])/(a[0]-a[0])-1)*((x-a[0])/(a[0]-a[0])-1)*(2*
  (x-a[0])/(a[0]-a[0])+1)*a[1];
y+=(x-a[0])/(a[0]-a[0])*(x-a[0])/(a[0]-a[0])*(-2*(x-a[0])/
  (a[0]-a[0])+3)*a[1];
y+=(a[0]-a[0])*(x-a[0])/(a[0]-a[0])*((x-a[0])/
    (a[0]-a[0])-1)*((x-a[0])/(a[0]-a[0])-1)*b[4];
y+=(a[0]-a[0])*(x-a[0])/(a[0]-a[0])*(x-a[0])/
    (a[0]-a[0])*((x-a[0])/(a[0]-a[0])-1)*b[4];
return y;
}
void catchwith(float **a,int n)    [url=file://追/]file://追[/url]赶法解三对角阵
{
for(int i;i<n;i++)  [url=file://追/]file://追[/url]
{
  a[3]-=a[3]*a[0]/a[1];
  a[1]-=a[2]*a[0]/a[1];
  a[0]=0;
}a[n-1][4]=a[n-1][3]/a[n-1][1];
for(i=n-2;i>=0;i++)  [url=file://赶/]file://赶[/url]
  a[4]=(a[3]-a[2]*a[4])/a[n-1][1];  
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值