zoukankan      html  css  js  c++  java
  • 拉格朗日插值法学习笔记

    拉格朗日插值法学习笔记

    古人说过:(n + 1) 个点可以确定一个 (n) 次多项式。

    然而通过解方程求出这个多项式显然不优雅;
    (Lagrange) 插值法可以通过这 (n+1) 个点来求出多项式在 (x) 处的取值。

    已知信息:(n + 1) 个点 ((x_i, y_i))

    所以要想办法构造出一个函数使得它过这些点;

    考虑这样一个函数:

    [l_i(x) = Pi_{i = 1,i e j}^{n + 1}frac{x-x_j}{x_i-x_j} ]

    可以发现函数 (l_i)(x in {x_i}) 的取值有如下规律:
    (x = x_i) 时,(l_i(x) = 1);否则,(l_i(x) = 0)。这一点是显然的。

    接着构造如下函数:

    [f(x)=Sigma_{i = 1}^{n + 1}y_i imes l_i(x) ]

    这样一来,函数 (f(x)) 就必过已知的 (n + 1) 个点。

    按柿子直接算,时间复杂度:(O(n^2))

    这大概就是我关于 (Lagrange) 插值法一些浅显的认识,下面是在 (OI) 中的应用。

    重心拉格朗日插值

    我们需要进行插值的次数可能会比较多,这时候上述做法可能并不能满足,需要一些优化。

    我们观察函数

    [f(x)=Sigma_{i = 1}^{n + 1}y_i imes l_i(x) \ l_i(x)=Pi_{i = 1,i e j}^{n + 1}frac{x-x_j}{x_i-x_j} ]

    可以发现 (l_i) 的分母是可以预处理的,复杂度 (O(n^2))
    其次,(l_i) 的分子在每次插值之前也可以处理:求出 (Pi_{i = 1,i e j}^{n + 1}x - x_i),把多的除掉。

    预处理复杂度 (O(n^2)),单次计算复杂度 (O(n)),(可能会多一个逆元的(log))。

    (x_i) 是一段整数区间时

    那么 (l_i(x)) 中,分母就是 (fac_{i - 1} imes fac_{n - i}) ,在 (n - i) 为奇数时会有一个负号,(符号和边界问题看代码);
    同时,记:

    [pre_i=Pi_{i = 0}^{i - 1} x - x_i \ suf_i=Pi_{i = i + 1}^{n + 1} x - x_i ]

    那么:

    [f(x) = Sigma_{i = 0}^{n + 1} y_i imes frac{pre_{i - 1}suf_{i + 1}}{fac_{i - 1}fac_{n - i}} ]

    (待续,,, )

  • 相关阅读:
    第3次实践作业
    第2次实践作业
    第1次实践作业
    2019 SDN大作业
    第05组 Beta版本演示
    个人作业——软件工程实践总结&个人技术博客
    个人作业——软件评测
    Springboot项目部署到云服务器(Ubuntu 18.04)
    结对第二次作业——某次疫情统计可视化的实现
    结对第一次—疫情统计可视化(原型设计)
  • 原文地址:https://www.cnblogs.com/15owzLy1-yiylcy/p/10960318.html
Copyright © 2011-2022 走看看