📄 拉格朗日及分段线性插值.cpp
字号:
#include <iostream.h>
double LAG(int&,int&,int&,double&);
double SUB(int&,int&,int&,double&);
void main()
{ int n,a,b,c;
double t,lag,sub,yt,e1,e2;
for(;;)
{
cout<<"请输入插值节点数 n:";
cin>>n;
cout<<"插值区间下限 a:";
cin>>a;
cout<<"插值区间上限 b:";
cin>>b;
cout<<"插值点 t:";
cin>>t;
lag = LAG(n,a,b,t);
sub = SUB(n,a,b,t);
yt=1/(1+t*t);
e1=lag-yt;
e2=sub-yt;
cout<<"精确值是:\n";
cout<<"yt="<<yt<<endl;
cout<<"拉各朗日插值结果是:\n";
cout<<"lag="<<lag<<endl;
cout<<"拉各朗日插值误差是:\n";
cout<<"e1="<<e1<<endl;
cout<<"分段线性插值结果是:\n";
cout<<"sub="<<sub<<endl;
cout<<"分段线性插值误差是:\n";
cout<<"e2="<<e2<<endl;
cout<<"输入0退出,输入其它继续!";
cin>>c;
if(c==0)
break;
else continue;
}
}
double LAG(int& n,int& a,int& b,double& t)
{
int i,j;
double x[100],y[100];
double p,s=0;
for(i=0;i<=n;i++)
{
x[i]=a+i*(b-a)/n;
y[i]=1/(1+x[i]*x[i]);
p = 1;
for(j=0;j<=n;j++)
{ x[j]=a+j*(b-a)/n;
if(i==j) continue;
else p=p*(t-x[j])/(x[i]-x[j]);
}
s+=p*y[i];
}
return s;
}
double SUB(int& n,int& a,int& b,double& t)
{
int i;
double p;
double x[100],y[100];
for(i=0;i<=n;i++)
{
x[i]=a+i*(b-a)/n;
x[i+1]=a+(i+1)*(b-a)/n;
y[i]=1/(1+x[i]*x[i]);
y[i+1]=1/(1+x[i+1]*x[i+1]);
if(t>=x[i]&&t<=x[i+1])
{
p=y[i]*(t-x[i+1])/(x[i]-x[i+1])+y[i+1]*(t-x[i])/(x[i+1]-x[i]);
}
}
return p;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -