📄 三次样条插值.cpp
字号:
#include<iostream.h>
#include<math.h>
void main()
{
double XX;
int n;
cout<<"**************三次样条插值算法**************"<<endl;
cout<<"请输入子区间的数目n:"<<endl;
cin>>n;
double *x=new double[n+1],*y=new double[n+1],*h=new double[n+1];
cout<<"请输入各节点值和函数值(以回车结束每一个输入):"<<endl;
for(int i=0;i<=n;i++)
{
cout<<"x"<<i<<":\t"; cin>>x[i];
cout<<"f(x"<<i<<"):\t"; cin>>y[i];
}
for(i=0;i<=n-1;i++)
{
h[i]=x[i+1]-x[i];
}
cout<<"请选择边界条件类型."<<endl;
cout<<"第一种边界条件请按1,第二种边界条件请按2:"<<endl;
int j; double *m,*a,*b;
m=new double[n+2]; a=new double[n+1]; b=new double[n+1];
while(cin>>j)
{if(j==1){ cout<<"请输入边界条件左.右两端点的二阶导数值:"<<endl;
cin>>m[0]; cin>>m[n];
a[0]=0;b[0]=2*m[0];
a[n]=1;b[n]=2*m[n]; break;}
else{ if(j==2){ a[0]=1;b[0]=3*(y[1]-y[0])/h[0];
a[n]=0;b[n]=3*(y[n]-y[n-1])/h[n-1]; break;}
else{ cout<<"您的输入错误!请重新输入."<<endl;
continue;}
}
}
for(i=1;i<=n-1;i++)
{ a[i]=h[i-1]/(h[i-1]+h[i]);
b[i]=3*((1-a[i])*(y[i]-y[i-1])/h[i-1]+a[i]*(y[i+1]-y[i])/h[i]);
}
double *A,*B;
A=new double[n+1]; B=new double[n+1];
A[0]=-a[0]/2; B[0]=b[0]/2;
for(i=1;i<=n;i++)
{ A[i]=-a[i]/(2+(1-a[i])*A[i-1]);
B[i]=(b[i]-(1-a[i])*B[i-1])/(2+(1-a[i])*A[i-1]);
}
m[n+1]=0;
for(i=n;i>=0;i--) { m[i]=A[i]*m[i+1]+B[i]; }
delete []A; delete []B;
cout<<"请输入所要求的X的值:"<<endl;
cin>>XX;
for(i=0;(i<=n-1)&&(XX>=x[i]);i++);
i--;
double e,f,g;
e=(XX-x[i])/(x[i+1]-x[i]);
f=(XX-x[i+1])/(x[i]-x[i+1]);
g=(1+2*e)*f*f*y[i]+(1+2*f)*e*e*y[i+1]+(XX-x[i])*f*f*m[i]+(XX-x[i+1])*e*e*m[i+1];
cout<<"其近似值为f("<<XX<<")=s("<<XX<<")="<<g<<endl;
delete []x; delete []y; delete []h;
delete []m; delete []a; delete []b;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -