分段线性插值

/****************************************************************************************\
 分段线性插值的步骤
 1.找到插值点所落在的区间
 2.代入线性插值公式
          x-xk+1         x-xk
  I(x)= -----------fk + ----------fk+1
          xk-xk+1        xk+1-xk

相比三次埃尔米特插值,提供的信息少一点,不需要提供一阶导数值
\****************************************************************************************/
#include<iostream>
#define MAX 100
using namespace std;
int main()
{
 int MAX_SIZE,i,j;
 double x[MAX],f[MAX];
//输入部分
 cout<<"请输入分段线性插值中x的插值个数:"<<endl;
 cin>>MAX_SIZE;
 cout<<"请依次输入x(i)的值"<<endl;
 for(i=1;i<MAX_SIZE+1;i++)
 {
  cin>>x[i];
 }
 cout<<"请依次输入f(x)的值:"<<endl;
 for(i=1;i<MAX_SIZE+1;i++)
 {
  cin>>f[i];
 }
//输出部分
 cout<<"x(i)";
 for(i=1;i<MAX_SIZE+1;i++)
  cout<<"\t"<<x[i];
 cout<<endl; 
 cout<<"f(x)";
 for(i=1;i<MAX_SIZE+1;i++)
  cout<<"\t"<<f[i];
 cout<<endl;
//计算部分
 //确定(x1,x2)区间
 double n,p;
 cout<<"请输入x的插值点:"<<endl;
 cin>>n;
 double def=0;
 for(i=1;i<MAX_SIZE+1;i++)
 {
  def=x[i]-n;
  if (def>0)
  {
   j=i;
   break;
  }
 }
 cout<<"区间范围为:["<<x[j-1]<<","<<x[j]<<"]"<<endl;
 //计算插值点数值
 p=((n-x[j])/(x[j-1]-x[j]))*f[j-1]+((n-x[j-1])/(x[j]-x[j-1]))*f[j];
 cout<<"该点插值P("<<n<<")="<<p<<endl;
 return 1;
}

你可能感兴趣的