拉格朗日差值

来源:互联网 发布:大数据与量化投资 编辑:程序博客网 时间:2024/06/06 13:18

lk(x)=i=0iknxxixkxi

插值基函数:

这玩意不知道是啥的话,没关系,简单看一下插值法从一次,二次,到n次推倒过程,到n阶就是上面那一坨..

线性插值也叫两点插值,已知函数y = f (x)在给定互异点x0, x1上的值为y0= f (x0),y1=f (x1)线性插值就是构造一个一次多项式
P1(x) = ax + b
使它满足条件
P1 (x0) = y0 P1 (x1) = y1
其几何解释就是一条直线,通过已知点A (x0, y0),B(x1, y1)。
线性插值计算方便、应用很广,但由于它是用直线去代替曲线,因而一般要求[x0, x1]比较小,且f(x)在[x0, x1]上变化比较平稳,否则线性插值的误差可能很大。为了克服这一缺点,有时用简单的曲线去近似地代替复杂的曲线,最简单的曲线是二次曲线,用二次曲线去逼近复杂曲线的情形。

拉格朗日插值时数学中最基本的插值算法,我们在差值时,如果插值点位于一直数据点之间,可以使用n次拉格朗日插值多项式来进行计算,如果插值点位于所给取件的某个端点时,可以少取几个数据点进行插值,如果差致电位于给定的区间以外,那么可以取最近的m个数据点进行插值.

拉格朗日插值法可以帮助我们解决以下的问题
已知x取值0,1,-1,2时, f{x}取值2,2,0,6
求x=3时f{x}的值。
示例1:
int xs[]={0,1,-1,2};
int ys[]={2,2,0,6};
//f(3)?

demo:

/*************************************************************************      > File Name: lagrange.cpp      > Author: dulun      > Mail: dulun@xiyoulinux.org      > Created Time: 2016年11月27日 星期日 16时57分43秒 ************************************************************************/#include<iostream>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>#define LL long longusing namespace std;const int N = 50086;//x, y一一对应,共n对,按x升序排列, 插值点tdouble Lagrange(double x[], double y[], int n, double t){    int i, j, k, m;    double s, result = 0.0;    if(n < 1) return result;    if(n == 1){        result = y[0];        return result;    }    if(n == 2){        result = ( y[0] * (t-x[1]) - y[1] * (t - x[0]) / x[0] - x[1] );        return result;    }    else{        i = 0;        while((x[i] < t) && (i < n)) i += 1;        k = i - 4;        if(k < 0) k = 0;        m = i + 3;        if(m > n-1) m = n-1;        for(i = k; i <= m; i++){            s = 1;            for(j = k; j <= m; j++){                if(j != i)                    s = s*(t - x[j]) / (x[i] - x[j]);            }            result += s * y[i];        }    }    return result;}int main(){    double t, z;    char again;   // static double x[] = {0.1, 0.15, 0.30, 0.4, 0.5, 0.6, 0.7, 0.85, 0.9, 1};   // static double y[] = {0.9, 0.86, 0.78, 0.67, 0.6, 0.55, 0.48, 0.42, 0.38, 0.36};   // 简单例子:y = f(x) = x^2    static double x[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};    static double y[] = {1, 4, 9, 16, 25, 36, 49, 64, 81, 100};//拽一下goto~S1:    printf("Mission is a go!\nInput insert point: ");    cin>>t;    z = Lagrange(x, y, sizeof(x) / sizeof(x[0]), t);    cout << t << " : " << z << endl;S2:    cout << "continue?(y/n)" << endl;    cin>>again;    if(again == 'y' || again == 'Y') goto S1;    else if(again == 'n' || again == 'N') goto S3;    else goto S2;S3:    cout << "mission Success!" << endl;    return 0;}
0 0
原创粉丝点击