1.已知函数列表
xi | 0.40 | 0.55 | 0.65 | 0.80 | 0.90 | 1.05 |
yi | 0.41075 | 0.57815 | 0.69675 | 0.88811 | 1.02652 | 1.25382 |
输入需要使用的节点数量n(2≤n≤6),使用拉格朗日插值法计算x=0.596的函数值的近似值。
要求:
(1) 函数列表信息从键盘输入;
(2) 需要使用的节点数量n和插值点x从键盘输入;
(3) 程序能够根据输入的节点数量n自动的从给定的6个节点中选择n个距离x最近的节点,使得这些节点所形成的区间包含x;
(4) 用算法框图描述选择n个插值节点的实现过程;
(5) 输出选择的n个插值节点的信息;
(6) 输出f(x)的最终计算结果。
程序源代码:
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef struct Node{
double x;
double y;
};
int main(){
Node s[6];
int i=0;
double cz[6] = {0}; //用于存储n个距离x最近的值与x的差值
double cz1[6] = {0};
double cz1Y[6] = {0};
int n;
double x;
cout<<"请输入Xi和Yi"<<endl;
int m=6;
while(m--)
{
scanf("%lf%lf",&(s[i].x),&(s[i].y));
i++;
}
cout<<"输入需要使用的节点数量n和插值点x:"<<endl;
scanf("%d%lf",&n,&x);
for(i=0;i<6;i++)
{
cz[i] = s[i].x - x;
cz1[i] = abs(cz[i]);
}
sort(cz1,cz1+6); //差值的绝对值排序
for(i=0;i<n;i++)
{
int d=6;
while(d--)
{
if(cz1[i] == abs(cz[d]))
{
cz1Y[i] = s[d].y;
if(cz1[i]*cz[d] < 0 )
{
cz1[i] = -cz1[i];
break;
}
}
}
cz1[i] = cz1[i] + x;
}
double y=0,t;
int k= -1;
double yk=0;
do{
k = k+1;
t=1;
for(i=0;i<n;i++)
{
if(i != k)
{
t = t * (x-cz1[i])/(cz1[k]-cz1[i]);
}
}
y = y + t*cz1Y[k];
}while(k!=(n-1));
cout<<"n个插值节点的信息"<<endl;
for(i=0;i<n;i++)
{
cout<<"X"<<i<<": "<<cz1[i]<<" "<<"Y"<<i<<": "<<cz1Y[i]<<endl;
}
cout<<endl;
cout<<endl;
cout<<"f(x) = "<<y<<endl;
return 0;
}
2.已知函数列表
xi | 0.3 | 0.4 | 0.5 | 0.6 | 0.7 |
yi | 0.29850 | 0.39646 | 0.49311 | 0.58813 | 0.68122
|
用埃特金算法计算插值点x=0.462时的函数值。
要求:
(1) 函数列表和插值点x的值从键盘输入;
(2) 将每一步的线性 插值结果按照埃特金插值计算顺序打印输出。
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef struct Node{
double x;
double y;
};
int main(){
Node s[6];
int i=1,n=5,m=5,k=0;
double x;
cout<<"请输入Xi和Yi"<<endl;
while(m--)
{
scanf("%lf%lf",&(s[i].x),&(s[i].y));
i++;
}
cout<<endl;
cout<<"请输入x的值:"<<endl;
scanf("%lf",&x);
cout<<endl;
cout<<"埃特金插值的计算结果"<<endl;
cout<<" ";
cout<<" 0 "<<" 1 "<<" 2 "<<" 3 "<<" 4 "<<endl;
cout<<" Xi: ";
for(i=1;i<=n;i++)
{
printf(" %.1lf ",s[i].x);
}
cout<<endl;
cout<<" f(Xi): ";
for(i=1;i<=n;i++)
{
printf("%.6lf ",s[i].y);
}
cout<<endl;
do{
if(k!=(n-1))
{
cout<<" P";
for(i=0;i<=k;i++){cout<<i;}
cout<<"i";
for(i=k;i<n;i++){cout<<" ";}
}
k = k+1;
for(i=0;i<k;i++){cout<<" ";}
for(i=k;i<n;i++)
{
s[i].y = (x-s[k-1].x)/(s[i].x-s[k-1].x)*s[i].y +
(x-s[i].x)/(s[k-1].x-s[i].x)*s[k-1].y;
printf("%.6lf ",s[i].y);
}
cout<<endl;
}while(k!=(n-2));
cout<<endl<<endl;
cout<<" 最后结果为:"<<s[n-1].y<<endl;
}
3.已知函数列表
xi | 0.4 | 0.5 | 0.6 | 0.7 | 0.8 |
yi | 0.38942 | 0.47943 | 0.56464 | 0.64422 | 0.71736 |
使用分段线性插值法计算插值点x=0.57891时的函数值。
要求:
(1) 函数列表和插值点x的值从键盘输入;
(2) 程序能够自动的从给定的5个节点中选择2个距离x最近的节点进行线性插值;
(3) 用算法框图描述选择2个插值节点的实现过程;
(4) 输出选择的2个插值节点的信息;
(5) 输出f(x)的最终计算结果。
算法框图:(选择2个插值节点的实现过程)
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef struct Node{
double x;
double y;
};
int main(){
Node s[5];
int i=0;
double cz[5] = {0};
double cz1[5] = {0};
double cz1Y[5] = {0};
int n=5;
double x;
cout<<"请输入Xi和Yi"<<endl;
int m=5;
while(m--){
scanf("%lf%lf",&(s[i].x),&(s[i].y));
i++;
}
cout<<"输入x:"<<endl;
scanf("%lf",&x);
for(i=0;i<5;i++){
cz[i] = s[i].x - x;
cz1[i] = abs(cz[i]);
}
sort(cz1,cz1+5); //差值的绝对值排序
for(i=0;i<n;i++){
int d=5;
while(d--){
if(cz1[i] == abs(cz[d])){
cz1Y[i] = s[d].y;
if(cz1[i]*cz[d] < 0 ){
cz1[i] = -cz1[i];
}
}
}
cz1[i] = cz1[i] + x;
}
double S;
S = (x-cz1[1])/(cz1[0]-cz1[1])*cz1Y[0] +
(x-cz1[0])/(cz1[1]-cz1[0])*cz1Y[1];
cout<<endl<<"选择的两个插值节点的信息:"<<endl;
cout<<"X0: "<<cz1[0]<<" Y0: "<<cz1Y[0]<<endl;
cout<<"X1: "<<cz1[1]<<" Y1: "<<cz1Y[1]<<endl;
cout<<"f(x): "<<S<<endl;
}