拉格朗日插值法

题目描述#

由小学知识得n+1x 坐标不同的点确定唯一的最高次为 n 次的多项式 y=f(n) 。现在给出 n+1 个点,求出这些点构成的多项式在某一位置的取值

拉格朗日插值法#

假设给出的曲线是个二次多项式

f(x)=ax2+bx+c

现在有三个已经确定的点 (x1,y1)(x2,y2) , (x3,y3)

代入柿子

{f(x1)=ax12+bx1+cf(x2)=ax22+bx2+cf(x3)=ax32+bx3+c

很显然可以用高斯消元求出 a,b,c , 时间复杂度 O(n3)

但拉格朗日插值法只需要 n2

神奇的构造:

我们需要构造三条曲线 f1,f2,f3

  • 对于第一条曲线 f1(x)

f1(x1)=1,f1(x2)=f1(x3)=0

  • 对于第二条曲线 f2(x)

f2(x2)=1,f2(x1)=f2(x3)=0

  • 对于第三条曲线 f3(x)

f3(x3)=1,f3(x1)=f3(x2)=0

然后

  • y1f1(x) 就能保证在 x1 处为 y1x2x3 处为取值为 0

  • y2f2(x) 就能保证在 x2 处为 y2x1x3 处为取值为 0

  • y3f3(x) 就能保证在 x3 处为 y3x1x2 处为取值为 0

再然后

f(x)=y1f1(x)+y2f2(x)+y3f3(x)

神奇 发现这三条曲线就求出了想要的那条曲线

推导

对于上面的三条曲线显然满足性质

fi(xj)={1   (i=j)0   (ij)

然后构造出这么个柿子

f1(x)=(xx2)(xx3)(x1x2)(x1x3)

进一步推广

fi(x)=jijnxxjxixj

然后就有了

f(x)=i=1i=nyifi(x)

P4781 【模板】拉格朗日插值

code

x 取值连续时#

当题目要用到的 x 取值是连续的,上面的柿子可以优化到 O(n)

先列出柿子

f(k)=i=1i=nyijijnxkxjxixj

考虑 O(1) 求出 jixkxjxixj

维护 xk 的前缀积和后缀积

prei=j=0i(xkxj)sufi=j=in(xkxj)

对于分母,就是个阶乘形式,柿子就成了

f(k)=i=0nyiprei1sufi+1facifacni

坑:当 ni 为奇数的时候分母为负值

CF622F The Sum of the k-th Powers

code

重心拉格朗日插值法#

毒瘤题目会随时增加或者减少差值点,这个时候曲线就会改变,上面的柿子就需要重新计算了,那么上面的复杂度就会退化成 n3 于是就有了重心拉格朗日插值 (好像牛顿插值法也可以办到 = =)

还是前面的柿子

f(x)=i=1nyiijxxjxixj  =i=1nyiijxxjijxixj  =i=1nyii=1n(xxi)ij(xixj)(xxi)   =i=1n(xxi)i=1nyiij(xixj)(xxi)

g=i=1n(xxi),t(i)=ij(xixj)

然后柿子就成了

f(x)=gi=1nyi(xxi)t(i)

对于每加入或减少一个点,可以只 O(n) 更新 t(i)

对于求值,可以 O(n) 求出 g,然后套公式就好了

预处理出逆元

时间复杂度 O(n)

参考资料

如何直观地理解拉格朗日插值法?

拉格朗日插值学习小结

拉格朗日插值学习总结

posted @   Dita  阅读(490)  评论(4编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示
主题色彩