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

拉格朗日插值

时间:2024-07-30 14:39:23浏览次数:10  
标签:拉格朗 数列 插值 dfrac sum int 多项式 prod

拉格朗日插值

考虑这样一个问题:有 \(n + 1\) 个不同的点值 \((x_{0 \sim n} , y_{0 \sim n})\) ,求一个 \(n\) 次多项式,满足其经过上述 \(n + 1\) 个点。

一般性插值法

对于第 \(i\) 个点,考虑构造一个多项式 \(F_i(k) = \begin{cases} y_i & k = x_i \\ 0 & k \not = x_i \end{cases}\) ,则 \(G(k) = \sum_{i = 0}^n F_i(k)\) 即为所求。

考虑构造 \(F_i(k)= y_i \prod_{i \not = j} \dfrac{k - x_j}{x_i - x_j}\)

解释:不难发现,当 \(k = x_j \ (j \not = i)\) 时,分子的累乘肯定有一项为 \(0\) ;当 \(k = x_i\) 时,分子分母累乘后肯定都会被约掉。因此这个多项式是符合条件的。

于是得到:

\[G(k) = \sum_{i = 0}^n y_i \prod_{j \not = i} \dfrac{k - x_j}{x_i - x_j} \]

时间复杂度 \(O(n^2)\) 。

横坐标连续时的插值方法

把 \(x_i\) 替换为 \(i\) ,新的式子即为:

\[G(k) = \sum_{i = 0}^n y_i \prod_{i \not = j} \dfrac{k - j}{i - j} \]

考虑优化。不难得到分子等于:

\[\dfrac{\prod_{j = 0}^n (k - j)}{k - i} \]

分母等于:

\[(-1)^{n - i} (i - 1)! (n - i)! \]

于是得到:

\[G(k) = \sum_{i = 0}^n y_i \dfrac{\prod_{j = 0}^n (k - j)}{(k - i) (-1)^{n - i} (i - 1)! (n - i)!} \]

inline int query(int k) {
	pre[0] = 1;
	
	for (int i = 1; i <= n; ++i)
		pre[i] = 1ll * pre[i - 1] * dec(k, i) % Mod;
	
	suf[n + 1] = 1;
	
	for (int i = n; i; --i)
		suf[i] = 1ll * suf[i + 1] * dec(k, i) % Mod;
	
	int ans = 0;
	
	for (int i = 1; i <= n; ++i)
		ans = add(ans, 1ll * y[i] * pre[i - 1] % Mod * suf[i + 1] % Mod * sgn(n - i) % Mod * invfac[i - 1] % Mod * invfac[n - i] % Mod);
	
	return ans;
}

重心拉格朗日插值法

观察式子:

\[G(k) = \sum_{i = 0}^n y_i \prod_{i \not = j} \dfrac{k - x_j}{x_i - x_j} \]

令 \(g = \prod_{i = 0}^n (k - x_i)\) ,则:

\[G(k) = g \sum_{i = 0}^n \prod_{i \not = j} \dfrac{y_i}{(k - x_i)(x_i - x_j)} \]

再令 \(t_i = \dfrac{y_i}{\prod_{j \not = i} x_i - x_j}\) ,则:

\[G(k) = g \sum_{i = 0}^n \dfrac{t_i}{k - x_i} \]

这样每次新加入一个点的时候只需要计算 \(g, t_i\) 即可。

应用

The Sum of the k-th Powers

给定 \(n, k\) ,求 \((\sum_{i = 1}^n i^k) \bmod 10^9 + 7\) 。

\(1 \leq n \leq 10^9, 0 \leq k \leq 10^6\)

有一个结论:\(\sum_{i = 1}^n i^k\) 是一个 \(k + 1\) 次多项式。

定义数列 \(\{a_n\}\) 的 \(p\) 阶差分数列为 \(\Delta^p f(x) = \Delta(\Delta^{p - 1}f(x))\) 。若数列 \(\{a_n\}\) 的 \(p\) 阶阶差数列是一个非 \(0\) 的常数列,那么我们称数列 \(\{a_n\}\) 为 \(p\) 阶等差数列

定理:数列 \(\{a_n\}\) 是一个 \(p\) 阶等差数列的充要条件是其通项公式是一个关于 \(n\) 的 \(p\) 次多项式

先证明其充分性,必要性的证法也是类似的。设数列的通项公式 \(f(x) = \sum_{i = 0}^n a_ix^i\) ,则其一次差分数列的通项公式为:

\[\begin{aligned} \Delta f(x) &= f(x + 1) - f(x) \\ &= \sum_{i = 0}^n a_i(x + 1)^i - \sum_{i = 0}^n a_ix^i \\ &= \sum_{i = 0}^n a_i[(x + 1)^i - x^i] \end{aligned} \]

我们只考虑 \(x_n\) 项得到可能得到它的只有这个式子:

\[a_n[(x + 1)^n - x^n] \]

我们把 \((x + 1)^n\) 用二项式定理展开,因为只考虑 \(n\) 次项,所以我们只保留 \(x^n\) ,发现其系数为 \(1\) ,刚好和后面的项消掉。所以将数列差分一次后就会消掉最高次项。类似的, \(p\) 次差分后就会消掉 \(p\) 次项,所以这个数列的通项公式是一个关于 \(n\) 的 \(p\) 次多项式。

设数列 \(\{a_n\}\) 的通项公式为 \(a_n = \sum_{i = 1}^n i^k\) ,其差分数列的通项公式为 \(f(x) = x^k\) 是一个 \(k\) 次多项式,所以这个数列是一个关于 \(n\) 的 \(k + 1\) 次多项式。

那么我们为了确定这个 \(k + 1\) 次多项式,我们需要 \(k + 2\) 个点来确定。令这些点的坐标为 \(1 \sim k + 2\) ,即可 \(O(n)\) 求解。因为 \(i^k\) 是完全积性函数,可以线性筛。

P5667 拉格朗日插值2

给定一个不超过 \(n\) 次的多项式的 \(n+1\) 个点值 \(f(0),f(1) \dots f(n)\),和一个正整数 \(m\),求 \(f(m),f(m+1) \dots f(m+n)\) 。答案对 \(998244353\) 取模。

\(n \leq 1.6 \times 10^5\) ,\(n < m \leq 10^8\)

由插值公式可得:

\[\begin{aligned} f(m + x) &= \sum_{i = 0}^n f(i) \prod_{j \not = i} \dfrac{m + x - j}{i - j} \\ &= \sum_{i = 0}^n f(i) \dfrac{\dfrac{(m + x)!}{(m + x - n - 1)!}}{(m + x - i) (-1)^{n - i} i! (n - i)!} \end{aligned} \]

令:

\[\begin{aligned} u_i &= \begin{cases} \dfrac{f(i)}{(-1)^{n - i} i! (n - i)!} & i \leq n \\ 0 & i > n \end{cases} \\ v_i &= \dfrac{1}{m - n + i} \end{aligned} \]

可得:

\[f(m + x) = (u \times v)[n + x] \prod_{i = m + x - n}^{m + x} i \]

NTT 即可。

inline void Lagrange(int *f, int n, int *res, int m) {
	static int u[N], v[N];
	
	for (int i = 0; i <= 2 * n; ++i) {
		u[i] = i <= n ? 1ll * f[i] * sgn(n - i) % Mod * invfac[i] % Mod * invfac[n - i] % Mod : 0;
		v[i] = mi(m - n + i, Mod - 2);
	}
	
	Poly::Mul(u, 2 * n + 1, v, 2 * n + 1, u);
	int prod = 1;
	
	for (int i = m - n; i <= m; ++i)
		prod = 1ll * prod * i % Mod;
	
	for (int i = 0; i <= n; ++i) {
		res[i] = 1ll * u[n + i] * prod % Mod;
		prod = 1ll * prod * mi(m + i - n, Mod - 2) % Mod * (m + i + 1) % Mod;
	}
}

标签:拉格朗,数列,插值,dfrac,sum,int,多项式,prod
From: https://www.cnblogs.com/wshcl/p/18332341/Lagrange

相关文章

  • 【Python数值分析】革命:引领【数学建模】新时代的插值与拟合前沿技术
    目录​编辑第一部分:插值的基本原理及应用1.插值的基本原理1.1插值多项式1.2拉格朗日插值 1.3牛顿插值 1.4样条插值2.插值的Python实现2.1使用NumPy进行插值2.2使用SciPy进行插值2.2.1一维插值​编辑2.2.2二维插值3.插值的应用场景3.1数据平......
  • Matlab编程资源库(9)数据插值与曲线拟合
    一、一维数据插值    在MATLAB中,实现这些插值的函数是interp1,其调用格式为:Y1=interp1(X,Y,X1,'method')    函数根据X,Y的值,计算函数在X1处的值。X,Y是两个等长的已知向量,分别描述采样点和样本值,X1是一个向量或标量,描述欲插值的点,Y1是一个与X1等长的插值结......
  • 容易的多元拉格朗日反演练习题
    你说得对,但确实和题目没有一点关系。模拟赛记录下午出。题面看到Alice和Bob就知道是什么题了。思路这个题开始先胡乱想想,发现按照博弈论的思路,那么每次Bob行动一步后,Alice需要有对应的策略,也就是说,若Alice必胜,这次行动应该是固定的最优策略步。然后再代入一下,如果......
  • 线性插值法的MATLAB实现——对股票非交易日缺失数据进行插值
    1.为什么要处理非交易日股票缺失数据  由于在计算无风险利率时,常常使用国债利率,但国债利率按360天计息,因此股票收益率需要和债券计息相匹配,所以需要对股票缺失数据进行插值。2.为什么使用线性插值法  当数据点之间距离很短时,就可以近似认为两点间可以用直线连接。类......
  • 常用算法 插值算法
    ​零、写在前面本文主要讲述三次Hermite插值和三次样条插值。对于一维插值算法没有详细介绍,只是说明了彼此之间的区别和特点,并作出选择。随后拓展了n维插值算法,只作为了解。最后,由于插值算法本身的特性,其也可以用来预测。一、作用插值算法,预测模型。在建模过程中,需要一定......
  • 基于三次样条插值和单纯形法的加氢站选址优化
    问题描述已知定点交通流量,求解加氢站建设位置求解方法已知国道或省道定点交通流量若干,根据已知交通流量插值得到每3km对应的交通流量。如图所示。将该问题转换为p-中值问题:其中,需求点位置集合=每3km一个需求点在i点的客户人数=i点(每个需求点)的车流量设施总数=需要......
  • 【机器人学】4-3.六自由度机器人动力学-拉格朗日方程【附MATLAB代码】
    上一章用了牛顿欧拉递推式的动力学方程求解了6自由度机器人的各关节动力。具体可以看我的上一篇博客。【机器人学】4-2.六自由度机器人动力学-牛顿欧拉递推式【附MATLAB代码】这篇文章主要介绍拉格朗日方程求解机械臂的动力学。        几乎所有的书上,在......
  • 【电动汽车充电站有序充电调度的分散式优化】基于蒙特卡诺和拉格朗日的电动汽车优化调
    ......
  • 5034. 【NOI2017模拟3.28】B —— 矩阵树定理和拉格朗日插值的结合
    题目大意给你一棵\(n\)(\(n\le50\))个点的树,可以进行不超过\(k\)次操作,每次断掉一条边,再连上一条边,要求树一直是树,求一共有多少种树的形态。思路把题意转换为对于一个\(n\)个点的完全图,是树边的话权值是\(1\),否则是\(x\)。跑一遍矩阵树定理,矩阵树定理求的是一个图所有生......
  • 三次插值曲线--插值技术
    三次插值曲线1.1.三次样条曲线三次样条曲线的基本思想是,在给定的一系列点(称为控制点或数据点)之间,通过一系列三次多项式曲线段来拟合这些点,使得整个曲线既平滑又准确地通过所有控制点。1.1.1.数学定义给定一组点(P_0,P_1,…,P_n),其中(P_i=(x_i,y_i)),(x_0<......