拉格朗日插值

来源:互联网 发布:获取二维码扫描枪数据 编辑:程序博客网 时间:2024/04/24 21:15
//Lagrange.h//Lagrange.h#ifndef LAGRANGE_H#define LAGRANGE_H#define INITSIZE 20#define APPENEDSIZE 20typedef struct{    double x;    double y;}Point;class Lagrange{private:    int pointNum;       //节点数    int arrLength;        //数组长度    Point *pointArr;    void appened();    //追加空间public:    Lagrange();    ~Lagrange();    void clear();    inline int getPointNum()const{return pointNum;}    inline void getPoint(int pos,double &x,double &y)const    {        x=pointArr[pos].x;        y=pointArr[pos].y;    }    bool insertPoint(double x,double y);     double Pn(double x)const;};#endif // LAGRANGE_H

//Lagrange.cpp#include"Lagrange.h"#include<cstring>Lagrange::Lagrange(){    pointNum=0;    arrLength=INITSIZE;    pointArr=new Point[arrLength];}Lagrange::~Lagrange(){    delete []pointArr;}void Lagrange::appened(){    int lt=arrLength;    Point *tmp=pointArr;    arrLength+=APPENEDSIZE;    pointArr=new Point[arrLength];    memcpy(pointArr,tmp,lt*sizeof(Point));    delete tmp;}void Lagrange::clear(){    delete []pointArr;    pointNum=0;    arrLength=INITSIZE;    pointArr=new Point[arrLength];}bool Lagrange::insertPoint(double x,double y){    for(int i=0;i<pointNum;i++)        if(pointArr[i].x==x)            return false;    pointArr[pointNum].x=x;    pointArr[pointNum].y=y;    pointNum++;    if(pointNum==arrLength)        appened();    return true;}double Lagrange::Pn(double x)const{    double ans=0.0;    double X,Y;    for(int k=0; k<pointNum; k++)    {        X=Y=1.0;        for(int j=0; j<pointNum; j++)        {            if(j==k)continue;            X*=x-pointArr[j].x;            Y*=pointArr[k].x-pointArr[j].x;        }        ans+=X/Y*pointArr[k].y;    }    return ans;}//实例main.cpp,对fx=sin(x)进行插值#include<stdio.h>#include<math.h>#include"Lagrange.h"int main(){    Lagrange l;    for(double i=0.0;i<=1.0;i+=0.2)        l.insertPoint(i,sin(i));    for(double i=0.0;i<1.0;i+=0.05)        printf("%-5f:%-5f\n",i,l.Pn(i));    return 0;}


0 0
原创粉丝点击