首页 > 其他分享 >拉格朗日插值

拉格朗日插值

时间:2023-06-17 13:23:12浏览次数:34  
标签:拉格朗 ch 函数 插值 dfrac int

最好有小学六年级的数学水平(doge)。

基础拉格朗日插值

我们先了解最简单的拉格朗日插值可以干什么。

由小学知识可知 \(n\) 个点 \((x_i,y_i)\) 可以唯一地确定一个多项式 \(y = f(x)\)。

现在,给定这 \(n\) 个点,请你确定这个多项式。

第一眼,我们很容易想到可以使用高斯消元法在 \(O(n^3)\) 的时间内求解。但是拉格朗日插值可以做到 \(O(n^2)\) 甚至 \(O(n \log^2 n)\) 。我们这里讲解 \(O(n^2)\) 的插值。

为了举个例子,我们需要对以下四个点求出函数值:

我们考虑构造 \(4\) 个基函数,期中,第 \(i\) 个基函数需要满足对于第 \(i\) 个点,函数值为 \(1\) ,其余点,函数值都为 \(0\) 。怎么构造这个基函数呢?我们拿第一个点 \((-6,4)\) 来说,如果第三个点 \((3 2)\) 要在 \(x=3\) 时 \(y=0\) ,那么我们可以为这个基函数构造 \((x-3)\) 项,这样子就会一定满足条件。我们很容易构造出基函数 \(f_1\) :

\[f_1(x)=c\times x(x-3)(x-6) \]

我们对于 \(x=-6\) 时需求 \(f_1(x)=1\) ,那么有:

\[c=\dfrac{1}{x(x-3)(x-6)}=\dfrac{1}{-6 \times (-9) \times (-12)}=\dfrac{1}{-648} \]

所以有:

\[f_1(x)=\dfrac{1}{-648}x(x-3)(x-6) \]

类似的,我们可以得到另外的基函数 \(f_2,f_3,f_4\) 。但是这样我们怎么得到最终的函数呢?

\[f(x)=\sum_{i=1}^n y_if_i(x) \]

因为这个函数时一定满足我们需求的,对于给定的 \(n\) 个点之一的 \((x_i,y_i)\) ,它只有在循环到 \(i\) 时, \(y_if_i(x_i)=y_i\) 有值,其余时刻按照基函数的定义都为 \(0\) 。所以这十分合理。我们可以改写成公式的形式:

\[f(x)=\sum_{i=1}^n y_i \prod_{j=1,j \neq i} \dfrac{x-x_i}{x_i-x_j} \]

模板题

贴出一份封装了 $namespace $ 的代码:

#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;
}

标签:拉格朗,ch,函数,插值,dfrac,int
From: https://www.cnblogs.com/Diavolo/p/17487375.html

相关文章

  • Solution Set - “伸手向着拉格朗日点作别”
    目录0.「UR#9」「UOJ#133」电路手动分析1.「UR#9」「UOJ#134」App管理器2.「UR#10」「UOJ#152」汉诺塔3.「UNR#2」「UOJ#312」梦中的题面⭐4.「NOISimu.」战舰5.「UR#10」「UOJ#153」世界线⭐6.「洛谷P9411」Gtrimee7.「CF1500F」CupboardsJumps⭐8.「UR#11」......
  • [浅谈] 拉格朗日插值
    Introduce给定\(n\)个点,那么可以确定一个不超过\(n-1\)项的多项式函数值。我们可以使用高斯消元,但是\(O(n^3)\)的时间复杂度和精度误差难以接受。Principle我们考虑构造函数\(fi\),满足其在\(x=x_i\)时函数值为\(1\),在\(x=x_j(j\neqi,j\in[1,n])\)是\(0\),这很好......
  • 【动态规划】【拉格朗日插值优化dp】集训队互测2012 calc
    【动态规划】【拉格朗日插值优化dp】集训队互测2012calc题目描述一个序列\(a_1,a_2,\dots,a_n\)是合法的,当且仅当:\(a_1,a_2,\dots,a_n\)都是\([1,k]\)中的整数。\(a_1,a_2,\dots,a_n\)互不相等。一个序列的值定义为它里面所有数的乘积,即\(a_1\timesa_2\times\dots......
  • 2022-2023 春学期 矩阵与数值分析 C6 插值函数的应用
    2022-2023春学期矩阵与数值分析C6插值函数的应用原文C6插值函数的应用6.1插值型求积公式数值型求积公式用于解决难以找到原函数的积分问题问题描述:设\(f(x)\)是定义在\([a,b]\)上的可积函数,考虑带权积分\[I(f)=\int^b_a\rho(x)f(x)dx\]其中权函数\(\rho(x)\)......
  • 拉格朗日插值
    \(n+1\)个点可以唯一确定一个最高为\(n\)次的多项式。\(f(k)=\sum_{i=0}^{n}y_i\prod_{i\neqj}\frac{k-x[j]}{x[i]-x[j]}\)例题:https://www.luogu.com.cn/problem/P4781给定多项式上的\(n\)个点,求出\(f(x)\)。......
  • Vue插值语法,文本指令,事件指令v-on,属性指令v-bind
    Vue插值语法:总结:插值语法使用{{}}传入变量,相当于形参  script中data中传入变量值,相当于实参,vue将data的值传给{{}}中html中:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><scr......
  • Vue——前端发展史、Vue介绍和使用、插值语法、文本指令、事件指令
    前端的发展史#1HTML(5)、CSS(3)、JavaScript(ES5、ES6):编写一个个的页面->给后端(PHP、Python、Go、Java)->后端嵌入模板语法->后端渲染完数据->返回数据给前端->在浏览器中查看 javascript=ECMAScript(5,6,13)+Dom+Bom#2Ajax的出现->后台发送异步请求,Ren......
  • 2022-2023 春学期 矩阵与数值分析 C5 插值与逼近
    2022-2023春学期矩阵与数值分析C5插值与逼近C5插值与逼近原文5.1引言有n个插值节点,就有n插值条件,可以构造至多n-1次的插值函数需要考虑简单函数类的选取问题:如代数多项式,三角多项式,分段多项式,有理函数,样条函数等;存在唯一性问题;余项估计问题;收敛性问题等思......
  • vue介绍和基本使用,插值语法,文本指令和事件指令
    1前端的发展史#1HTML(5)、CSS(3)、JavaScript(ES5、ES6):编写一个个的页面->给后端(PHP、Python、Go、Java)->后端嵌入模板语法->后端渲染完数据->返回数据给前端->在浏览器中查看 -javascript=ECMAScript(5,6,13)+Dom+Bom#2Ajax的出现->后台发送异步请求......
  • 拉格朗日插值 备忘
    拉格朗日插值备忘拉格朗日插值大概在做一个什么事?用\(n\)个点来表达一个\(n-1\)次多项式\(f\),然后想要在不把多项式的系数表示法求出来的前提下快速求\(f(x)\)。\[L(x)=\sum_{i=1}^ny_i\prod_{j\nei}\frac{x-x_j}{x_i-x_j}\]时间复杂度每次插值都是\(O(n^2)\)。注......