/****************************************************************************************\
分段線性插值的步驟
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;
}