插值法:拉格朗日插值、牛顿插值

拉格朗日插值法

(*以下定义选自维基百科


算法流程图


算法代码

[cpp]  view plain copy
  1. #include<iostream>  
  2. #include<string>  
  3. #include<vector>  
  4. using namespace std;  
  5.   
  6. double Lagrange(int N,vector<double>&X,vector<double>&Y,double x);  
  7.   
  8. int main(){  
  9.   char a='n';  
  10.   do{  
  11.     cout<<"请输入差值次数n的值:"<<endl;  
  12.     int N;  
  13.     cin>>N;  
  14.     vector<double>X(N,0);  
  15.     vector<double>Y(N,0);  
  16.     cout<<"请输入插值点对应的值及函数值(Xi,Yi):"<<endl;  
  17.     for(int a=0;a<N;a++){  
  18.         cin>>X[a]>>Y[a];  
  19.     }  
  20.     cout<<"请输入要求值x的值:"<<endl;  
  21.     double x;  
  22.     cin>>x;  
  23.     double result=Lagrange(N,X,Y,x);  
  24.     cout<<"由拉格朗日插值法得出结果: "<<result<<endl;  
  25.     cout<<"是否要继续?(y/n):";  
  26.     cin>>a;  
  27.   }while(a=='y');  
  28.   return 0;  
  29. }  
  30.   
  31. double Lagrange(int N,vector<double>&X,vector<double>&Y,double x){  
  32.   double result=0;  
  33.   for(int i=0;i<N;i++){  
  34.     double temp=Y[i];  
  35.     for(int j=0;j<N;j++){  
  36.     if(i!=j){  
  37.         temp = temp*(x-X[j]);  
  38.         temp = temp/(X[i]-X[j]);  
  39.    }  
  40.   }  
  41.   result += temp;  
  42. }  
  43.  return result;  
  44. };  

牛顿插值法

牛顿插值法公式如下,具体参见( 百度文档

算法流程


算法代码

[cpp]  view plain copy
  1. #include<iostream>  
  2. #include<string>  
  3. #include<vector>  
  4. using namespace std;  
  5.   
  6. double ChaShang(int n,vector<double>&X,vector<double>&Y);  
  7. double Newton(double x,vector<double>&X,vector<double>&Y);  
  8.   
  9. int main(){  
  10.   int n;  
  11.   cin>>n;  
  12.   vector<double>X(n,0);  
  13.   vector<double>Y(n,0);  
  14.   for(int i=0;i<n;i++){  
  15.     cin>>X[i]>>Y[i];  
  16.   }  
  17.   double x;  
  18.   cin>>x;  
  19.   cout<<Newton(x,X,Y);  
  20. }  
  21.   
  22. double ChaShang(int n,vector<double>&X,vector<double>&Y){  
  23.   double f=0;  
  24.   double temp=0;  
  25.   for(int i=0;i<n+1;i++){  
  26.     temp=Y[i];  
  27.     for(int j=0;j<n+1;j++)  
  28.         if(i!=j) temp /= (X[i]-X[j]);  
  29.     f += temp;  
  30.   }  
  31.   return f;  
  32. }  
  33.   
  34. double Newton(double x,vector<double>&X,vector<double> &Y){  
  35.   double result=0;  
  36.   for(int i=0;i<X.size();i++){  
  37.     double temp=1;  
  38.     double f=ChaShang(i,X,Y);  
  39.     for(int j=0;j<i;j++){  
  40.         temp = temp*(x-X[j]);  
  41.     }  
  42.     result += f*temp;  
  43.   }  
  44.   return result;  
  45. }  

实验过程原始记录

给定函数四个点的数据如下:


试用拉格朗日插值确定函数在x=2.101,4.234处的函数值。
运行得到结果:


已知用牛顿插值公式求的近似值。
运行程序得到结果:   2.26667 

实验分析

1、Lagrange插值法和Newton插值法解决实际问题中关于只提供复杂的离散数据的函数求值问题,通过将所考察的函数简单化,构造关于离散数据实际函数f(x)的近似函数P(x),从而可以计算未知点出的函数值,是插值法的基本思路。
2、实际上Lagrange插值法和Newton插值法是同一种方法的两种变形,其构造拟合函数的思路是相同的,而实验中两个实际问题用两种算法计算出结果是相同的。
3、实验所得结果精确度并不高,一方面是因为所给数据较少,另一方面也是主要方面在Win32中C++中数据类型double精度只有7位,计算机在进行浮点运算时截断运算会导致误差。实际问题中,测量数据也可能导致误差。
4、在解决实际问题中,更多是利用精确且高效的计算机求解。所以解决问题时不仅要构造可求解的算法,更重要是构造合理的可以编写成程序由计算机求解的算法,而算法的优化不仅可以节省时间空间,更能得到更为精确有价值的结果。

(转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu 未经允许请勿用于商业用途)

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值