用C++语言程序实现拉格朗日插值公式

来源:互联网 发布:吉祥网络上海二手房 编辑:程序博客网 时间:2024/05/16 15:29

C++程序实现Lagrange插值公式

     Lagrange插值公式,是属于数值分析方面的内容,关于其应用,在这里就不多说。此处我想用C语言程序来实现n各插值节点插值公式的求解,并求出在某一个插值节点对应的函数值。
   对于Lagrange插值算法的基本思想,在这里我只想略提两点,一个是拉格朗日插值公式,一个是拉格朗日插值基函数的求解。因为这两者才是算法需要解决的最根本的问题。
  (1)采用插值多项式 来近似的逼近拉格朗日差值多项式   即 其中
  (2)上面的插值多项式中的  即为拉格朗日插值多项式的插值基函数的通项 而且  

   (3)理解了上面的思想原理之后,就可以进行程序实现了    ---我觉得再多的理论有时候真的会很吓唬人,但是,通过程序来实现时,不但增加了自己对算法思想的理解,而且还无疑说明了两个问题:a 程序说明一切,再高端的算法,如果程序实现不了,那纯属扯淡  b,动手多实践  才是王道!
    
   (4)下面把我个人所实现的程序供大家参考,如果有什么问题,欢迎指正,在此不胜感激!!!
include<iostream>
using namespace std;//预先定义插值节点的个数为1000个,根据控制台输入的个数num从而确定插值节点的个数const int N=1000;//arrX[N],arrY[N]分别存放的是插值节点(Xi,Yi)中的Xi,Yi,参数n为插值节点的个数,而参数x为待求解的插值节点的X值//函数返回值为求解出来的插值节点X对应的Y值//注意整个过程涉及的变量,除了循环变量为int外,其他均为floatfloat Lagrange(float arrX[],float arrY[],int n,float x){float yResult=0.0;//LValue[N]存放的是每次求解的插值基函数的通项float LValue[N];//循环变量k,mint k,m;//插值基函数中的上下累乘temp1,temp2float temp1,temp2;for(k=0;k<n;k++){temp1=1.0;temp2=1.0;for(m=0;m<n;m++){if(m==k){continue;}temp1 *= (x-arrX[m]);temp2 *= (arrX[k]-arrX[m]);}LValue[k]=temp1/temp2;}for(int i=0;i<n;i++){yResult += arrY[i]*LValue[i];}return yResult;}int main(){float arrX[N],arrY[N];int num;         cout<<"输入插值节点的个数(小于"<<N<<"个): ";cin>>num;cout<<"\n--接下来输入这些插值节点(先输入X 再输入对应的Y)--\n";for(int i=0;i<num;i++){cout<<"第"<<i+1<<"个节点的X值: ";cin>>arrX[i];cout<<"第"<<i+1<<"个节点的Y值: ";cin>>arrY[i];}float X;cout<<"\n--请输入待求解的插值节点的X值--\n";cin>>X;         float Res = Lagrange(arrX,arrY,num,X);cout<<"\n--插值结果为: "<<Res<<endl;return 0;}  <span style="font-size:14px;">(5)下面是进行测试的结果,进行插值的三个节点为(11,0.190809),(12,0.107912),(13,0.224951) ,待测试的是(11.5,Y) 其中的函数          为y=sin(x) </span><span style="font-size:14px;">         测试结果为0.199368或者0.199369</span>



  


0 0
原创粉丝点击