拉格朗日插值
最好有小学六年级的数学水平(doge)。这篇博客的语言会比较简单通俗,大家可以先略作了解,之后通过别的文章继续深入。
基础拉格朗日插值
我们先了解最简单的拉格朗日插值可以干什么。
由小学知识可知
现在,给定这
第一眼,我们很容易想到可以使用高斯消元法在
为了举个例子,我们需要对以下四个点求出函数值:
我们考虑构造
我们对于
所以有:
类似的,我们可以得到另外的基函数
因为这个函数时一定满足我们需求的,对于给定的
贴出一份封装了
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-f;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
const int mod=998244353;
const int MAXN=2e3+10;
namespace Lagrange{
int qpow(int a,int b){
int ans=1,base=a;
while(b){
if(b&1) ans=ans*base%mod;
base=base*base%mod;
b>>=1;
}
return ans;
}
int inv(int x){
return qpow(x,mod-2);
}
int lagrange(int n,int *x,int *y,int k){
int ans=0;
for(int i=1;i<=n;i++){
int top=1,down=1;
for(int j=1;j<=n;j++){
if(j==i) continue;
top=top*((k-x[j]+mod*2)%mod)%mod;
down=down*((x[i]-x[j]+mod*2)%mod)%mod;
}
ans=(ans+y[i]*top%mod*inv(down))%mod;
}
return ans;
}
}
using namespace Lagrange;
int n,x[MAXN],y[MAXN],k;
signed main(){
n=read(),k=read();
for(int i=1;i<=n;i++) x[i]=read(),y[i]=read();
cout<<lagrange(n,x,y,k);
return 0;
}
连续点的拉格朗日插值
很多时候,我们给出的点的
可以想到,后面的分母就是两个阶乘的和,分子大概也是一段连续的数的积。具体来讲,我们可以优化
那么原式就可以表示为:
注意分母的奇偶性问题,当
为了不让这个博客太短,我们进行一些拓展:
没错求它的取值,但是
貌似是这么个道理,但是有没有证明呢?我们看到三种证法:
第一种流氓证法
其实关于这一个证法是我在第一次看到这个问题的时候的个人思考,发现网上目前没有看见有这种理解方法,所以讲一下。主要的思想就是,对于任意
我们对
也就是说,对于
我们知道,
这就是我们需要构造的,满足条件的那对系数
首先,在上面的公式中,
我们考虑
az这个坑先放着
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现