📄 三次样条插值.cpp
字号:
#include <iostream.h>
#include <math.h>
#define n 11
double fun(double xx,double y1[2],double x[n],double y[n])
{
int i;
double h[n-1],mu[n-1],beita[n],neimta[n],d[n];
double s;
for(i=0;i<n-1;i++)
{
h[i]=x[i+1]-x[i];
}
for(i=1;i<n-1;i++)
{
mu[i]=h[i-1]/(h[i-1]+h[i]);
neimta[i]=1-mu[i];
d[i]=((y[i+1]-y[i])/(x[i+1]-x[i])-(y[i]-y[i-1])/(x[i]-x[i-1]))
/(x[i+1]-x[i-1])*6;
}
d[0]=((y[1]-y[0])/(x[1]-x[0])-y1[0])/(x[1]-x[0])*6;
d[n-1]=(y1[1]-(y[n-1]-y[n-2])/(x[n-1]-x[n-2]))/(x[n-1]-x[n-2])*6;
beita[0]=2;
neimta[0]=1;
mu[n-1]=1;
beita[n-1]=2;
for(i=1;i<n;i++)
{
mu[i]=mu[i]/beita[i-1];
beita[i]=2-mu[i]*neimta[i-1];
d[i]=d[i]-mu[i]*d[i-1];
}
d[n-1]=d[n-1]/beita[n-1];
for(i=n-2;i>=0;i--)
{
d[i]=(d[i]-neimta[i]*d[i-1])/beita[i];
}
for(i=0;i<n-1;i++)
{
if((xx>=x[i])&&(xx<=x[i+1]))
{
xx=xx-x[i];
s=y[i]+((y[i+1]-y[i])/h[i]-(d[i]/3+d[i+1]/6)*h[i])*xx
+d[i]/2*pow(xx,2)+(d[i+1]-d[i])*pow(xx,3)/(6*h[i]);
}
}
return(s);
}
void main()
{
double x[n]={0,1,2,3,4,5,6,7,8,9,10};
double y[n]={2.51,3.30,4.04,4.70,5.22,5.54,5.78,5.40,5.57,5.70,5.80};
double y1[2]={0.8,0.2};
int i;
double s;
double xx;
for(i=1;i<10;i++)
{
xx=i+0.5;
s=fun(xx,y1,x,y);
cout<<"s("<<xx<<")="<<s<<endl;
}
}
/*程序结果:
s(1.5)=3.67826
s(2.5)=4.38339
s(3.5)=4.97957
s(4.5)=5.38581
s(5.5)=5.71471
s(6.5)=5.54721
s(7.5)=5.4417
s(8.5)=5.67926
s(9.5)=5.71538*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -