📄 3次样条插值.cpp
字号:
/*#include<iostream.h>
void main()
{
float a[]={2,4,3};
float b[]={0,1,1};
float c[]={1,1,0};
float f[]={3,12,11};
float q[3],p[3],x[3],y[3];
int i;
int n=3;
q[0]=a[0];
p[0]=b[0];
y[0]=f[0];
for(i=1;i<3;i++)
{
p[i]=b[i]/q[i-1];
q[i]=a[i]-p[i]*c[i-1];
y[i]=f[i]-p[i]*y[i-1];
}
//回代 过程
x[2]=y[2]/q[2];
for(i=1;i>=0;i--)
{
x[i]=(y[i]-c[i]*x[i+1])/q[i];
}
for(i=0;i<n;i++)
{
cout<<x[i]<<'\n';
}
} 追赶法*/
#include<iostream.h>
void main()
{
float c[11],b[11],df[11],df1[12],h[11],m[11],n[11];
float y[11],p[11],q[11],x[11];
int i,j;
cout<<"请输入x和对应的y值:"<<endl; //输入已知条件
cout<<"x=";
for(i=0;i<11;i++)
cin>>m[i];
cout<<"y=";
for(i=0;i<11;i++)
cin>>n[i];
//float m[]={0,1,2,3,4,5,6,7,8,9,10};
//float n[]={2.51,3.30,4.04,4.70,5.22,5.54,5.78,5.40,5.57,5.70,5.80};
for(i=0;i<10;i++)
{
h[i]=m[i+1]-m[i];
}
for(j=1;j<10;j++)
{
b[j]=h[j-1]/(h[j-1]+h[j]);
c[j]=1-b[j];
}
//二阶差分
cout<<"请输入端点条件y(0)的导数和y(10)的导数:"<<endl;
cout<<"y(0)的导数=";
cin>>df1[0];
cout<<"y(10)的导数=";
cin>>df1[11];
for(j=1;j<11;j++)
{
df1[j]=(n[j]-n[j-1])/(m[j]-m[j-1]);
}
//三阶差分
df[0]=6*(df1[1]-df1[0]);
df[10]=6*(df1[11]-df1[10]);
for(j=1;j<10;j++)
{
df[j]=6*(df1[j+1]-df1[j])/2;
}
//追赶法求解
b[10]=1;
c[0]=1;
q[0]=2;
p[0]=0;
y[0]=df[0];
for(i=1;i<11;i++)
{
p[i]=b[i]/q[i-1];
q[i]=2-p[i]*c[i-1];
y[i]=df[i]-p[i]*y[i-1];
}
//回代 过程
x[10]=y[10]/q[10];
for(i=9;i>=0;i--)
{
x[i]=(y[i]-c[i]*x[i+1])/q[i];
}
for(i=0;i<11;i++)
{
cout<<x[i]<<'\n';
}
float lag1[10],lag2[10],lag3[10];
for(j=0;j<10;j++)
{
lag1[j]=df1[j]-((1/3)*x[j]+(1/6)*x[j+1])*h[j];
lag3[j]=(1/(6*h[j]))*(x[j+1]-x[j]);
}
for(j=0;j<10;j++)
{
cout<<"S(x)="<<n[j]<<"+"<<lag1[j]<<"(x-"<<m[j]<<")"<<"+"<<"("<<0.5*x[j]<<")"<<"(x-"<<m[j]<<")^2"<<"+"<<lag3[j]<<
"(x-"<<m[j]<<")^3"<<' '<<cout<<"X属于("<<m[j]<<","<<m[j+1]<<")"<<endl;
}
cout<<"S(i+0.5) (i=0,1...9)=:"<<endl;
for(i=0;i<10;i++)
{
cout<<n[i]+lag1[i]*(i+0.5-m[i])+0.5*(x[i])*(i+0.5-m[i])*(i+0.5-m[i])+lag3[i]*(i+0.5-m[i])*(i+0.5-m[i])*(i+0.5-m[i])<<endl;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -