精华内容
下载资源
问答
  • 拉格朗日插值的优缺点_拉格朗日插值法与牛顿插值法的比较
    千次阅读
    2021-01-13 13:05:02

    1

    7

    拉格朗日插值法与牛顿插值法的比较

    [

    ]

    在生产和科研中出现的函数是多样的。对于一些函数很难找出其解析表达式。即使在某些情况下,可以写出函

    数的解析表达式,但由于解析表达式的结构相当复杂,使用起来很不方便。插值法即是解决此类问题的一种古老的、然

    而却是目前常用的方法,它不仅直接广泛地应用于生产实际和科学研究中,而且也是进一步学习数值计算方法的基础。

    拉格朗日插值法和牛顿插值法则是二种常用的简便的插值法。本文即是讨论拉格朗日插值法和牛顿插值法的理论及二者

    的比较。

    [

    关键词

    ]

    拉格朗日插值

    牛顿插值

    插值多项式

    比较

    一、

    背景

    在工程和科学研究中出现的函数是多种多样的。常常会遇到这样的情况:在某个实际

    问题中,虽然可以断定所考虑的函数

    )

    (

    x

    f

    在区间

    ]

    ,

    [

    b

    a

    上存在且连续,但却难以找到它的

    解析表达式,只能通过实验和观测得到在有限个点上的函数值(即一张函数表)

    。显然,

    要利用这张函数表来分析函数

    )

    (

    x

    f

    的性态,

    甚至直接求出其他一些点上的函数值可能是非

    常困难的。面对这些情况,总希望根据所得函数表(或结构复杂的解析表达式)

    ,构造某

    个简单函数

    )

    (

    x

    P

    作为

    )

    (

    x

    f

    的近似。

    这样就有了插值法,

    插值法是解决此类问题目前常用的

    方法。

    如设函数

    )

    (

    x

    f

    y

    在区间

    ]

    ,

    [

    b

    a

    上连续,

    且在

    1

    n

    个不同的点

    b

    x

    x

    x

    a

    n

    ,

    ,

    ,

    1

    0

    上分别

    取值

    n

    y

    y

    y

    ,

    ,

    ,

    1

    0

    插值的目的就是要在一个性质优良、便于计算的函数类

    中,求一简单函数

    )

    (

    x

    P

    ,使

    )

    ,

    ,

    1

    ,

    0

    (

    )

    (

    n

    i

    y

    x

    P

    i

    i

    而在其他点

    i

    x

    x

    上,作为

    )

    (

    x

    f

    的近似。

    通常,称区间

    ]

    ,

    [

    b

    a

    为插值区间,称点

    n

    x

    x

    x

    ,

    ,

    ,

    1

    0

    为插值节点,称式

    i

    i

    y

    x

    P

    )

    (

    为插值

    条件,称函数类

    为插值函数类,称

    )

    (

    x

    P

    为函数

    )

    (

    x

    f

    在节点

    n

    x

    x

    x

    ,

    ,

    ,

    1

    0

    处的插值函数。

    求插值函数

    )

    (

    x

    P

    的方法称为插值法。

    插值函数类

    的取法不同,所求得的插值函数

    )

    (

    x

    P

    逼近

    )

    (

    x

    f

    的效果就不同。它的选

    择取决于使用上的需要,常用的有代数多项式、三角多项式和有理函数等。当选用代数多

    项式作为插值函数时,相应的插值问题就称为多项式插值。本文讨论的拉格朗日插值法与

    牛顿插值法就是这类插值问题。

    在多项式插值中,最常见、最基本的问题是:求一次数不超过

    n

    的代数多项式

    n

    n

    x

    a

    x

    a

    a

    x

    P

    1

    0

    )

    (

    使

    )

    ,

    ,

    1

    ,

    0

    (

    )

    (

    n

    i

    y

    x

    P

    i

    i

    n

    ,其中,

    n

    a

    a

    a

    ,

    ,

    ,

    1

    0

    为实数。

    更多相关内容
  • 运用拉格朗日插值法给空缺数据进行插值,通过调用scipy中的lagrange实现
  • 在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。这样的多项式称为拉格朗日(插值)多项式。数学上来说,拉格朗日插值法可以给出一个恰好穿过二维平面...
  • 主要介绍了Python实现的拉格朗日插值法,简单介绍了拉格朗日插值法的原理并结合完整实例形式给出了拉格朗日插值法的具体实现与使用技巧,需要的朋友可以参考下
  • 一物体廓线数据如下 x 0 3 5 7 9 11 12 13 14 15 y 0 1.2 1.7 2.0 2.1 2.0 1.8 1.2 1.0 1.6 用拉格朗日插值法计算x每改变0.5时y的值即x 取 0.5, 1, 1.5, , 14.5 时对应的y值 程序如下 程序运行结果 > x=[0 3 5 7 9 ...
  • 在社会经 济统 计 中 , 取 得和掌握全面 、 真 实 、 可靠 的原始 数据资料 是极重 要 的 , 是 进行科学 的统计分析 、 谁确 的预 测和 正确 的决 策 的基础 。 但是在 实际 中 ...值法和 拉格朗 日插值法
  • 有关书中4-1用拉格朗日法进行插补,会有几处warning和报错, 网上大部分小伙伴都在解决过滤异常值的告警问题,其实真正有问题的是这里: 仅针对课本里出现的问题,正常的索引都是从0开始,但是当n<k的时候,索引就...
  • c#实现的拉格朗日插值 计算方法课程的源代码
  • 拉格朗日插值法

    2018-08-08 18:22:24
    拉格朗日插值法 pdf
  • 拉格朗日插值法matlab程序代码LS2Ditp Lissajous 曲线节点上的二元多项式插值 版本:0.2 (01.05.2016) 撰稿人 描述 LS2Ditp 包包含一个 Matlab 实现,用于在退化和非退化 2D-Lissajous 曲线的节点 LS 上进行双变量...
  • 本程序使用java实现拉格朗日插值法,使用者可以根据自己需要进行修改
  • 拉格朗日插值法数据
  • 数值分析中牛顿插值与拉格朗日插值法的代码
  • 拉格朗日插值法是一个根据点对求回原函数的算法,原理挺好懂的。原理和优化方法上面的大佬都讲得很好。其实主要就是这个式子:然后暴力算这个式子的话是每求一项f(k)的时间复杂度都是n^2。这个时间很不优秀,于是...

    拉格朗日插值法是一个根据点对求回原函数的算法,原理挺好懂的。

    原理和优化方法上面的大佬都讲得很好。

    其实主要就是这个式子:

    bda8b9cf9d1e1a6e02c6cf9666830e57.png

    然后暴力算这个式子的话是每求一项f(k)的时间复杂度都是n^2。

    这个时间很不优秀,于是我们想办法在一些特殊时候优化它。

    在x连续的时候我们可以通过预处理的方式加快速度,式子为

    f096532b5a3890dcefabd28f11d01908.png

    86f378ae046008e26a0fc6d1f0629800.png

    然后其实拉格朗日插值就上面两个式子,具体题目的具体点对不一样,但是插值的方法就是这样。

    2c0b12045a1c6d0aa70db0280e1fac89.png

    然后重心拉格朗日插值法就是把朴素的式子变形,它的好处是

    4dad16c7a01e7f84545235ea8c58bc4a.png

    虽然原理好懂代码好写,但是做题并不好做,得看出所求函数是几次多项式也得简略证明一下,这要求有一定的数学素养。这一个知识点蒟蒻还是差得很多,基本上就是做一题看一题题解。主要是虽然拉格朗日插值法不难,也好写。但是架不住我根本不知道要求的是哪个函数呀qwq qwq qwq,这样的话初始点对都求不出来,那还插个球。。。

    总的来说,一定不能有式子恐惧症,要多加训练推式子的能力。加上这个知识点不怎么熟练,一定要回看。

    题目练习:

    洛谷P4781

    模板题:

    8f900a89c6347c561fdf2122f13be562.png

    961ddebeb323a10fe0623af514929fc1.png

    #include

    using namespacestd;

    typedeflong longLL;const int N=2e3+10;const int MOD=998244353;intn,k,x[N],y[N];intpower(LL x,LL p,LL MOD) {

    LL ret=1;for (;p;p>>=1) {if (p&1) ret=ret*x%MOD;

    x=x*x%MOD;

    }return (int)ret;

    }intLagrange() {int ret=0;for (int i=1;i<=n;i++) {int up=1,down=1;for (int j=1;j<=n;j++) {if (i==j) continue;

    up=(LL)up*((k-x[j])%MOD+MOD)%MOD; //分子

    down=(LL)down*((x[i]-x[j])%MOD+MOD)%MOD; //分母

    }int tmp=(LL)y[i]*up%MOD*power(down,MOD-2,MOD)%MOD;

    ret=(ret+tmp)%MOD;

    }returnret;

    }intmain()

    {

    cin>>n>>k;for (int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);

    cout<

    }

    View Code

    洛谷P4593

    看大佬题解,主要矛盾就是算sigma(i^m) (i=1~m+1)  这个用拉格朗日插值法可以解决。

    8f900a89c6347c561fdf2122f13be562.png

    961ddebeb323a10fe0623af514929fc1.png

    #include

    using namespacestd;

    typedeflong longLL;const int N=100;const int P=1e9+7;intn,m;

    LL jc[N],pre[N],suf[N],a[N],y[N];voidprework() {

    jc[0]=1; for (int i=1;i<=60;i++) jc[i]=(jc[i-1]*i)%P;

    }

    LL power(LL x,LL p,LL MOD) {

    LL ret=1;for (;p;p>>=1) {if (p&1) ret=ret*x%MOD;

    x=x*x%MOD;

    }returnret;

    }//拉格朗日插值计算:sigma(i^m) (i=1~m+1) 因为计算m项要用m+1个点

    LL Lagrange(intn) {

    LL ret=0;

    pre[0]=n; for (int i=1;i<=m+1;i++) pre[i]=(pre[i-1]*(n-i))%P; //预处理分子前缀

    suf[m+2]=1; for (int i=m+1;i;i--) suf[i]=(suf[i+1]*(n-i))%P; //预处理分母后缀

    for (int i=1;i<=m+1;i++) { //m+1个点插点

    LL up=pre[i-1]*suf[i+1]%P;

    LL down=jc[i]*jc[m+1-i]%P;if ((m+1-i)%2==1) down=P-down; //注意,(m+1-i)奇数项分母取反

    LL tmp=up*power(down,P-2,P)%P*y[i]%P;

    ret=(ret+tmp)%P;

    }returnret;

    }intmain()

    {

    prework();int T; cin>>T;while (T--) {

    scanf("%d%d",&n,&m);for (int i=1;i<=m;i++) scanf("%d",&a[i]); a[++m]=++n;

    sort(a+1,a+m+1);for (int i=1;i<=m+2;i++) y[i]=power(i,m,P);for (int i=1;i<=m+2;i++) y[i]=(y[i]+y[i-1])%P; //算出(x,y)点对

    LL ans=0;for (int i=1;i<=m;i++) { //计算ans

    for (int j=i;j<=m;j++) ans=(ans+Lagrange(a[j]-1)-Lagrange(a[j-1]))%P,ans=(ans+P)%P;for (int j=i+1;j<=m;j++) a[j]=a[j]-a[i]; a[i]=0;

    }

    printf("%lld\n",ans);

    }return 0;

    }

    View Code

    BZOJ-3453

    惭愧的说,这题我现在还是不能完全理解为什么就能表示成K+4次多项式。但是其实能看出来的话也是直接插值就可以了。

    8f900a89c6347c561fdf2122f13be562.png

    961ddebeb323a10fe0623af514929fc1.png

    #include

    using namespacestd;

    typedeflong longLL;const LL P=1234567891;const LL N=200+10;

    LL k,a,n,d;

    LL f[N],g[N];

    LL power(LL x,LL p,LL MOD) {

    LL ret=1;for (;p;p>>=1) {if (p&1) ret=ret*x%MOD;

    x=x*x%MOD;

    }returnret;

    }//计算k项式(i,f[i])的第n项

    LL Lagrange(LL *f,LL k,LL n) {

    LL ret=0;for (int i=0;i<=k;i++) {

    LL up=f[i],down=1;for (int j=0;j<=k;j++) {if (i==j) continue;

    up=up*((n-j+P)%P)%P;

    down=down*((i-j+P)%P)%P;

    }

    ret=(ret+up*power(down,P-2,P)%P)%P;

    }returnret;

    }intmain()

    {int T; cin>>T;while (T--) {

    memset(f,0,sizeof(f)); memset(g,0,sizeof(g));

    scanf("%lld%lld%lld%lld",&k,&a,&n,&d);for (int i=1;i<=k+4;i++) f[i]=power(i,k,P);for (int i=1;i<=k+4;i++) f[i]=(f[i-1]+f[i])%P;for (int i=1;i<=k+4;i++) f[i]=(f[i-1]+f[i])%P;for (int i=0;i<=k+4;i++)

    g[i]=((i>0?g[i-1]:0)+Lagrange(f,k+4,a+i*d))%P;

    printf("%lld\n",Lagrange(g,k+4,n));

    }return 0;

    }

    View Code

    展开全文
  • 拉格朗日插值法用于查找方程或求解特定点的方程,这是曲线拟合的形式
  • 数值分析中的拉格朗日插值法,牛顿插值法,三次样条插值法的matlab代码描述。
  • // 插值基节点数 Real(kind=8), parameter :: t0 = 0.d0, t1 = 1.d0 !// 插值区间 Real(kind=8) :: x(n1), y(n1) !// 获取插值基节点数据 Open ( newunit = fileid, file = 'origin.dat' ) Do i = 1, n1 x(i) ...
  • 拉格朗日Lagrange插值法的matlab实现。给出一批离样点,做出一条通过这些点的光滑曲线,构造一个简单函数来近似。 本篇为Lagrange插值法,构造插值多项式。
  • 基于拉格朗日插值法的GPS卫星轨道位置拟合.pdf
  • 插值法-拉格朗日插值法 根据数学知识可知,对于平面上已知的n个点(无两点在一条直线上可以找到n-1次多项式 ,使次多项式曲线过这n个点。 1)求已知过n个点的n-1次多项式: 将n个点的坐标带入多项式:得到 解出...

    数据分析

    数据清洗:缺失值处理、1删除记录 2数据插补 3不处理

    常见插补方法

    [图片上传失败...(image-4d2c0f-1648822732030)]

    插值法-拉格朗日插值法

    根据数学知识可知,对于平面上已知的n个点(无两点在一条直线上可以找到n-1次多项式
    [图片上传失败...(image-4440-1648822732030)]

    ,使次多项式曲线过这n个点。
    1)求已知过n个点的n-1次多项式:
    [图片上传失败...(image-4fa6fa-1648822732030)]

    将n个点的坐标带入多项式:得到[图片上传失败...(image-ffccc9-1648822732030)]

    解出拉格朗日插值多项式:[图片上传失败...(image-2f1440-1648822732030)]

    将缺失的函数值对应的点x带入多项式得到趋势值得近似值L(x)

    #拉格朗日插值代码
    import pandas as pd #导入数据分析库Pandas
    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.interpolate import lagrange #导入拉格朗日插值函数
    
    inputfile = '../data/catering_sale.xls' #销量数据路径
    outputfile = '../tmp/sales.xls' #输出数据路径
    
    data = pd.read_excel(inputfile) #读入数据
    temp = data[u'销量'][(data[u'销量'] < 400) | (data[u'销量'] > 5000)] #找到不符合要求得值 data[列][行]
    for i in range(temp.shape[0]):
        data.loc[temp.index[i],u'销量'] = np.nan #把不符合要求得值变为空值
    
    #自定义列向量插值函数
    #s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
    def ployinterp_column(s, n, k=5):
      y = s.iloc[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取数 就是传入得data
      y = y[y.notnull()] #剔除空值
      f = lagrange(y.index, list(y))
      return f(n) #插值并返回插值结果
    
    #逐个元素判断是否需要插值
    for i in data.columns:
      for j in range(len(data)):
        if (data[i].isnull())[j]: #如果为空即插值。
            data.loc[j,i] = ployinterp_column(data[i], j)
    
    data.to_excel(outputfile) #输出结果,写入文件
    print("success")
    
    

    运行结果:

    [图片上传失败...(image-23b888-1648822732029)]

    这个代码是可以运行的


    问题

    没有SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
    [图片上传失败...(image-a94627-1648822732029)]

    我也不知道时怎么把这个警告消除的,反正就是找啊找,在我不注意的时候能运行了!好像是不能一下多个赋值,要分开赋值。

    最后

    但是我们细看可以发现插入的值有问题:把插入的值输出可以看到有一个异常值
    [图片上传失败...(image-eb726e-1648822732029)]

    我们在处理数据时把小于400,大于5000的值都变成空值,然后通过拉格朗日插值法插入值,想要把数据没有那么大的差值,但是给我们插入一个负数,并且很离谱。我检查了一下并没有发现哪里有错误;然后我把用到的数据和拟合出来的拉格朗日函数输出得到:
    f=-0.008874 x + 11.53 x - 6657 x + 2.242e+06 x - 4.854e+08 x + 7.005e+10 x - 6.74e+12 x + 4.168e+14 x - 1.504e+16 x + 2.411e+17
    [图片上传失败...(image-f56308-1648822732029)]

    并没有发现问题,让后我就想着是不是拟合出来的函数步够精确,我把取点增加,但是都没有好的结果,反而更离谱,这种情况就是过拟合了,就是这个模型可以把你训练的模型拟合的很好,但是测试模型并不好。
    举个例子:下面一组数据可以看到用x4函数拟合的并没有太多的点在模型上,x4函数拟合的相对较多一点,但是如果进行测试,14次方的模型可能会预测的很离谱:
    [图片上传失败...(image-377ba7-1648822732029)]

    最后我把取值点减小发现上下取点4个时都会有一个好的结果,上下去点为3,2,1(直线,不建议取)时也都还能接受。所以我么拟合出来的五个上下点时也并没有错,只是它拟合出来的函数就是在那个点上数值离谱。
    看到这里的都是妥妥的铁粉无疑了,底下是我的个人微信找到我的可是有大把源码,学习路线啥的,多的我就不透露,539413949看大家自己的积极性了啊

    展开全文
  • 拉格朗日插值及其画图 1

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,428
精华内容 1,771
关键字:

拉格朗日插值法

友情链接: 实用的纯js响应式.zip