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;
}